From ff3716b5435f36644aa77f696f878d48faf1f906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=A9=E6=9E=97?= Date: Fri, 19 Jul 2024 10:29:45 +0800 Subject: [PATCH 1/6] =?UTF-8?q?ddp-server=20=E6=94=BE=E8=87=B3creator?= =?UTF-8?q?=E4=B8=8B=20=EF=BC=88#6964=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- creator/packages/ddp-server/README.md | 4 + creator/packages/ddp-server/crossbar.js | 167 ++ creator/packages/ddp-server/crossbar_tests.js | 49 + .../packages/ddp-server/livedata_server.js | 1772 +++++++++++++++++ .../ddp-server/livedata_server_tests.js | 411 ++++ creator/packages/ddp-server/package.js | 60 + .../packages/ddp-server/server_convenience.js | 22 + .../packages/ddp-server/session_view_tests.js | 393 ++++ creator/packages/ddp-server/stream_server.js | 184 ++ creator/packages/ddp-server/writefence.js | 131 ++ .../programs/server/packages/ddp-server.js | 4 +- .../server/packages/ddp-server.js.map | 2 +- .../programs/server/packages/modules.js | 26 +- ...27de16d6eab9175efa4d52871e8cc6588f4811.js} | 4 +- ...eab9175efa4d52871e8cc6588f4811.stats.json} | 6 +- .../programs/web.browser.legacy/program.json | 18 +- ...27de16d6eab9175efa4d52871e8cc6588f4811.js} | 4 +- ...eab9175efa4d52871e8cc6588f4811.stats.json} | 6 +- .../bundle/programs/web.browser/program.json | 18 +- ...7fd9820c5c4cf898af8b1c4a65e09c854f6d33.js} | 4 +- ...5c4cf898af8b1c4a65e09c854f6d33.stats.json} | 6 +- .../bundle/programs/web.cordova/program.json | 18 +- server/bundle/star.json | 2 +- 23 files changed, 3252 insertions(+), 59 deletions(-) create mode 100644 creator/packages/ddp-server/README.md create mode 100644 creator/packages/ddp-server/crossbar.js create mode 100644 creator/packages/ddp-server/crossbar_tests.js create mode 100644 creator/packages/ddp-server/livedata_server.js create mode 100644 creator/packages/ddp-server/livedata_server_tests.js create mode 100644 creator/packages/ddp-server/package.js create mode 100755 creator/packages/ddp-server/server_convenience.js create mode 100644 creator/packages/ddp-server/session_view_tests.js create mode 100644 creator/packages/ddp-server/stream_server.js create mode 100644 creator/packages/ddp-server/writefence.js rename server/bundle/programs/web.browser.legacy/{79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js => 7d27de16d6eab9175efa4d52871e8cc6588f4811.js} (99%) rename server/bundle/programs/web.browser.legacy/{79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json => 7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json} (99%) rename server/bundle/programs/web.browser/{79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js => 7d27de16d6eab9175efa4d52871e8cc6588f4811.js} (99%) rename server/bundle/programs/web.browser/{79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json => 7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json} (99%) rename server/bundle/programs/web.cordova/{562208cdca3e6c297f81857edf4a42d67cc7b014.js => 717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js} (99%) rename server/bundle/programs/web.cordova/{562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json => 717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json} (99%) diff --git a/creator/packages/ddp-server/README.md b/creator/packages/ddp-server/README.md new file mode 100644 index 0000000000..21d2ac4c84 --- /dev/null +++ b/creator/packages/ddp-server/README.md @@ -0,0 +1,4 @@ +# ddp-server +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/ddp-server) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/ddp-server) +*** + diff --git a/creator/packages/ddp-server/crossbar.js b/creator/packages/ddp-server/crossbar.js new file mode 100644 index 0000000000..6672059f99 --- /dev/null +++ b/creator/packages/ddp-server/crossbar.js @@ -0,0 +1,167 @@ +// A "crossbar" is a class that provides structured notification registration. +// See _match for the definition of how a notification matches a trigger. +// All notifications and triggers must have a string key named 'collection'. + +DDPServer._Crossbar = function (options) { + var self = this; + options = options || {}; + + self.nextId = 1; + // map from collection name (string) -> listener id -> object. each object has + // keys 'trigger', 'callback'. As a hack, the empty string means "no + // collection". + self.listenersByCollection = {}; + self.listenersByCollectionCount = {}; + self.factPackage = options.factPackage || "livedata"; + self.factName = options.factName || null; +}; + +_.extend(DDPServer._Crossbar.prototype, { + // msg is a trigger or a notification + _collectionForMessage: function (msg) { + var self = this; + if (! _.has(msg, 'collection')) { + return ''; + } else if (typeof(msg.collection) === 'string') { + if (msg.collection === '') + throw Error("Message has empty collection!"); + return msg.collection; + } else { + throw Error("Message has non-string collection!"); + } + }, + + // Listen for notification that match 'trigger'. A notification + // matches if it has the key-value pairs in trigger as a + // subset. When a notification matches, call 'callback', passing + // the actual notification. + // + // Returns a listen handle, which is an object with a method + // stop(). Call stop() to stop listening. + // + // XXX It should be legal to call fire() from inside a listen() + // callback? + listen: function (trigger, callback) { + var self = this; + var id = self.nextId++; + + var collection = self._collectionForMessage(trigger); + var record = {trigger: EJSON.clone(trigger), callback: callback}; + if (! _.has(self.listenersByCollection, collection)) { + self.listenersByCollection[collection] = {}; + self.listenersByCollectionCount[collection] = 0; + } + self.listenersByCollection[collection][id] = record; + self.listenersByCollectionCount[collection]++; + + if (self.factName && Package['facts-base']) { + Package['facts-base'].Facts.incrementServerFact( + self.factPackage, self.factName, 1); + } + + return { + stop: function () { + if (self.factName && Package['facts-base']) { + Package['facts-base'].Facts.incrementServerFact( + self.factPackage, self.factName, -1); + } + delete self.listenersByCollection[collection][id]; + self.listenersByCollectionCount[collection]--; + if (self.listenersByCollectionCount[collection] === 0) { + delete self.listenersByCollection[collection]; + delete self.listenersByCollectionCount[collection]; + } + } + }; + }, + + // Fire the provided 'notification' (an object whose attribute + // values are all JSON-compatibile) -- inform all matching listeners + // (registered with listen()). + // + // If fire() is called inside a write fence, then each of the + // listener callbacks will be called inside the write fence as well. + // + // The listeners may be invoked in parallel, rather than serially. + fire: function (notification) { + var self = this; + + var collection = self._collectionForMessage(notification); + + if (! _.has(self.listenersByCollection, collection)) { + return; + } + + var listenersForCollection = self.listenersByCollection[collection]; + var callbackIds = []; + _.each(listenersForCollection, function (l, id) { + if (self._matches(notification, l.trigger)) { + callbackIds.push(id); + } + }); + + // Listener callbacks can yield, so we need to first find all the ones that + // match in a single iteration over self.listenersByCollection (which can't + // be mutated during this iteration), and then invoke the matching + // callbacks, checking before each call to ensure they haven't stopped. + // Note that we don't have to check that + // self.listenersByCollection[collection] still === listenersForCollection, + // because the only way that stops being true is if listenersForCollection + // first gets reduced down to the empty object (and then never gets + // increased again). + _.each(callbackIds, function (id) { + if (_.has(listenersForCollection, id)) { + listenersForCollection[id].callback(notification); + } + }); + }, + + // A notification matches a trigger if all keys that exist in both are equal. + // + // Examples: + // N:{collection: "C"} matches T:{collection: "C"} + // (a non-targeted write to a collection matches a + // non-targeted query) + // N:{collection: "C", id: "X"} matches T:{collection: "C"} + // (a targeted write to a collection matches a non-targeted query) + // N:{collection: "C"} matches T:{collection: "C", id: "X"} + // (a non-targeted write to a collection matches a + // targeted query) + // N:{collection: "C", id: "X"} matches T:{collection: "C", id: "X"} + // (a targeted write to a collection matches a targeted query targeted + // at the same document) + // N:{collection: "C", id: "X"} does not match T:{collection: "C", id: "Y"} + // (a targeted write to a collection does not match a targeted query + // targeted at a different document) + _matches: function (notification, trigger) { + // Most notifications that use the crossbar have a string `collection` and + // maybe an `id` that is a string or ObjectID. We're already dividing up + // triggers by collection, but let's fast-track "nope, different ID" (and + // avoid the overly generic EJSON.equals). This makes a noticeable + // performance difference; see https://github.com/meteor/meteor/pull/3697 + if (typeof(notification.id) === 'string' && + typeof(trigger.id) === 'string' && + notification.id !== trigger.id) { + return false; + } + if (notification.id instanceof MongoID.ObjectID && + trigger.id instanceof MongoID.ObjectID && + ! notification.id.equals(trigger.id)) { + return false; + } + + return _.all(trigger, function (triggerValue, key) { + return !_.has(notification, key) || + EJSON.equals(triggerValue, notification[key]); + }); + } +}); + +// The "invalidation crossbar" is a specific instance used by the DDP server to +// implement write fence notifications. Listener callbacks on this crossbar +// should call beginWrite on the current write fence before they return, if they +// want to delay the write fence from firing (ie, the DDP method-data-updated +// message from being sent). +DDPServer._InvalidationCrossbar = new DDPServer._Crossbar({ + factName: "invalidation-crossbar-listeners" +}); diff --git a/creator/packages/ddp-server/crossbar_tests.js b/creator/packages/ddp-server/crossbar_tests.js new file mode 100644 index 0000000000..cf42351798 --- /dev/null +++ b/creator/packages/ddp-server/crossbar_tests.js @@ -0,0 +1,49 @@ +// White box tests of invalidation crossbar matching function. +// Note: the current crossbar match function is designed specifically +// to ensure that a modification that targets a specific ID does not +// notify a query that is watching a different specific ID. (And to +// keep separate collections separate.) Other than that, there's no +// deep meaning to the matching function, and it could be changed later +// as long as it preserves that property. +Tinytest.add('livedata - crossbar', function (test) { + var crossbar = new DDPServer._Crossbar; + test.isTrue(crossbar._matches({collection: "C"}, + {collection: "C"})); + test.isTrue(crossbar._matches({collection: "C", id: "X"}, + {collection: "C"})); + test.isTrue(crossbar._matches({collection: "C"}, + {collection: "C", id: "X"})); + test.isTrue(crossbar._matches({collection: "C", id: "X"}, + {collection: "C"})); + + test.isFalse(crossbar._matches({collection: "C", id: "X"}, + {collection: "C", id: "Y"})); + + // Test that stopped listens definitely don't fire. + var calledFirst = false; + var calledSecond = false; + var trigger = {collection: "C"}; + var secondHandle; + crossbar.listen(trigger, function (notification) { + // This test assumes that listeners will be called in the order + // registered. It's not wrong for the crossbar to do something different, + // but the test won't be valid in that case, so make it fail so we notice. + calledFirst = true; + if (calledSecond) { + test.fail({ + type: "test_assumption_failed", + message: "test assumed that listeners would be called in the order registered" + }); + } else { + secondHandle.stop(); + } + }); + secondHandle = crossbar.listen(trigger, function (notification) { + // This should not get invoked, because it should be stopped by the other + // listener! + calledSecond = true; + }); + crossbar.fire(trigger); + test.isTrue(calledFirst); + test.isFalse(calledSecond); +}); diff --git a/creator/packages/ddp-server/livedata_server.js b/creator/packages/ddp-server/livedata_server.js new file mode 100644 index 0000000000..7de0f1517d --- /dev/null +++ b/creator/packages/ddp-server/livedata_server.js @@ -0,0 +1,1772 @@ +DDPServer = {}; + +var Fiber = Npm.require('fibers'); + +// This file contains classes: +// * Session - The server's connection to a single DDP client +// * Subscription - A single subscription for a single client +// * Server - An entire server that may talk to > 1 client. A DDP endpoint. +// +// Session and Subscription are file scope. For now, until we freeze +// the interface, Server is package scope (in the future it should be +// exported.) + +// Represents a single document in a SessionCollectionView +var SessionDocumentView = function () { + var self = this; + self.existsIn = new Set(); // set of subscriptionHandle + self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence] +}; + +DDPServer._SessionDocumentView = SessionDocumentView; + + +_.extend(SessionDocumentView.prototype, { + + getFields: function () { + var self = this; + var ret = {}; + self.dataByKey.forEach(function (precedenceList, key) { + ret[key] = precedenceList[0].value; + }); + return ret; + }, + + clearField: function (subscriptionHandle, key, changeCollector) { + var self = this; + // Publish API ignores _id if present in fields + if (key === "_id") + return; + var precedenceList = self.dataByKey.get(key); + + // It's okay to clear fields that didn't exist. No need to throw + // an error. + if (!precedenceList) + return; + + var removedValue = undefined; + for (var i = 0; i < precedenceList.length; i++) { + var precedence = precedenceList[i]; + if (precedence.subscriptionHandle === subscriptionHandle) { + // The view's value can only change if this subscription is the one that + // used to have precedence. + if (i === 0) + removedValue = precedence.value; + precedenceList.splice(i, 1); + break; + } + } + if (precedenceList.length === 0) { + self.dataByKey.delete(key); + changeCollector[key] = undefined; + } else if (removedValue !== undefined && + !EJSON.equals(removedValue, precedenceList[0].value)) { + changeCollector[key] = precedenceList[0].value; + } + }, + + changeField: function (subscriptionHandle, key, value, + changeCollector, isAdd) { + var self = this; + // Publish API ignores _id if present in fields + if (key === "_id") + return; + + // Don't share state with the data passed in by the user. + value = EJSON.clone(value); + + if (!self.dataByKey.has(key)) { + self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle, + value: value}]); + changeCollector[key] = value; + return; + } + var precedenceList = self.dataByKey.get(key); + var elt; + if (!isAdd) { + elt = precedenceList.find(function (precedence) { + return precedence.subscriptionHandle === subscriptionHandle; + }); + } + + if (elt) { + if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) { + // this subscription is changing the value of this field. + changeCollector[key] = value; + } + elt.value = value; + } else { + // this subscription is newly caring about this field + precedenceList.push({subscriptionHandle: subscriptionHandle, value: value}); + } + + } +}); + +/** + * Represents a client's view of a single collection + * @param {String} collectionName Name of the collection it represents + * @param {Object.} sessionCallbacks The callbacks for added, changed, removed + * @class SessionCollectionView + */ +var SessionCollectionView = function (collectionName, sessionCallbacks) { + var self = this; + self.collectionName = collectionName; + self.documents = new Map(); + self.callbacks = sessionCallbacks; +}; + +DDPServer._SessionCollectionView = SessionCollectionView; + + +_.extend(SessionCollectionView.prototype, { + + isEmpty: function () { + var self = this; + return self.documents.size === 0; + }, + + diff: function (previous) { + var self = this; + DiffSequence.diffMaps(previous.documents, self.documents, { + both: _.bind(self.diffDocument, self), + + rightOnly: function (id, nowDV) { + self.callbacks.added(self.collectionName, id, nowDV.getFields()); + }, + + leftOnly: function (id, prevDV) { + self.callbacks.removed(self.collectionName, id); + } + }); + }, + + diffDocument: function (id, prevDV, nowDV) { + var self = this; + var fields = {}; + DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), { + both: function (key, prev, now) { + if (!EJSON.equals(prev, now)) + fields[key] = now; + }, + rightOnly: function (key, now) { + fields[key] = now; + }, + leftOnly: function(key, prev) { + fields[key] = undefined; + } + }); + self.callbacks.changed(self.collectionName, id, fields); + }, + + added: function (subscriptionHandle, id, fields) { + var self = this; + var docView = self.documents.get(id); + var added = false; + if (!docView) { + added = true; + docView = new SessionDocumentView(); + self.documents.set(id, docView); + } + docView.existsIn.add(subscriptionHandle); + var changeCollector = {}; + _.each(fields, function (value, key) { + docView.changeField( + subscriptionHandle, key, value, changeCollector, true); + }); + if (added) + self.callbacks.added(self.collectionName, id, changeCollector); + else + self.callbacks.changed(self.collectionName, id, changeCollector); + }, + + changed: function (subscriptionHandle, id, changed) { + var self = this; + var changedResult = {}; + var docView = self.documents.get(id); + if (!docView) + throw new Error("Could not find element with id " + id + " to change"); + _.each(changed, function (value, key) { + if (value === undefined) + docView.clearField(subscriptionHandle, key, changedResult); + else + docView.changeField(subscriptionHandle, key, value, changedResult); + }); + self.callbacks.changed(self.collectionName, id, changedResult); + }, + + removed: function (subscriptionHandle, id) { + var self = this; + var docView = self.documents.get(id); + if (!docView) { + var err = new Error("Removed nonexistent document " + id); + throw err; + } + docView.existsIn.delete(subscriptionHandle); + if (docView.existsIn.size === 0) { + // it is gone from everyone + self.callbacks.removed(self.collectionName, id); + self.documents.delete(id); + } else { + var changed = {}; + // remove this subscription from every precedence list + // and record the changes + docView.dataByKey.forEach(function (precedenceList, key) { + docView.clearField(subscriptionHandle, key, changed); + }); + + self.callbacks.changed(self.collectionName, id, changed); + } + } +}); + +/******************************************************************************/ +/* Session */ +/******************************************************************************/ + +var Session = function (server, version, socket, options) { + var self = this; + self.id = Random.id(); + + self.server = server; + self.version = version; + + self.initialized = false; + self.socket = socket; + + // set to null when the session is destroyed. multiple places below + // use this to determine if the session is alive or not. + self.inQueue = new Meteor._DoubleEndedQueue(); + + self.blocked = false; + self.workerRunning = false; + + // Sub objects for active subscriptions + self._namedSubs = new Map(); + self._universalSubs = []; + + self.userId = null; + + self.collectionViews = new Map(); + + // Set this to false to not send messages when collectionViews are + // modified. This is done when rerunning subs in _setUserId and those messages + // are calculated via a diff instead. + self._isSending = true; + + // If this is true, don't start a newly-created universal publisher on this + // session. The session will take care of starting it when appropriate. + self._dontStartNewUniversalSubs = false; + + // when we are rerunning subscriptions, any ready messages + // we want to buffer up for when we are done rerunning subscriptions + self._pendingReady = []; + + // List of callbacks to call when this connection is closed. + self._closeCallbacks = []; + + + // XXX HACK: If a sockjs connection, save off the URL. This is + // temporary and will go away in the near future. + self._socketUrl = socket.url; + + // Allow tests to disable responding to pings. + self._respondToPings = options.respondToPings; + + // This object is the public interface to the session. In the public + // API, it is called the `connection` object. Internally we call it + // a `connectionHandle` to avoid ambiguity. + self.connectionHandle = { + id: self.id, + close: function () { + self.close(); + }, + onClose: function (fn) { + var cb = Meteor.bindEnvironment(fn, "connection onClose callback"); + if (self.inQueue) { + self._closeCallbacks.push(cb); + } else { + // if we're already closed, call the callback. + Meteor.defer(cb); + } + }, + clientAddress: self._clientAddress(), + httpHeaders: self.socket.headers + }; + + self.send({ msg: 'connected', session: self.id }); + + // On initial connect, spin up all the universal publishers. + Fiber(function () { + self.startUniversalSubs(); + }).run(); + + if (version !== 'pre1' && options.heartbeatInterval !== 0) { + // We no longer need the low level timeout because we have heartbeating. + socket.setWebsocketTimeout(0); + + self.heartbeat = new DDPCommon.Heartbeat({ + heartbeatInterval: options.heartbeatInterval, + heartbeatTimeout: options.heartbeatTimeout, + onTimeout: function () { + self.close(); + }, + sendPing: function () { + self.send({msg: 'ping'}); + } + }); + self.heartbeat.start(); + } + + Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact( + "livedata", "sessions", 1); +}; + +_.extend(Session.prototype, { + + sendReady: function (subscriptionIds) { + var self = this; + if (self._isSending) + self.send({msg: "ready", subs: subscriptionIds}); + else { + _.each(subscriptionIds, function (subscriptionId) { + self._pendingReady.push(subscriptionId); + }); + } + }, + + sendAdded: function (collectionName, id, fields) { + var self = this; + if (self._isSending) + self.send({msg: "added", collection: collectionName, id: id, fields: fields}); + }, + + sendChanged: function (collectionName, id, fields) { + var self = this; + if (_.isEmpty(fields)) + return; + + if (self._isSending) { + self.send({ + msg: "changed", + collection: collectionName, + id: id, + fields: fields + }); + } + }, + + sendRemoved: function (collectionName, id) { + var self = this; + if (self._isSending) + self.send({msg: "removed", collection: collectionName, id: id}); + }, + + getSendCallbacks: function () { + var self = this; + return { + added: _.bind(self.sendAdded, self), + changed: _.bind(self.sendChanged, self), + removed: _.bind(self.sendRemoved, self) + }; + }, + + getCollectionView: function (collectionName) { + var self = this; + var ret = self.collectionViews.get(collectionName); + if (!ret) { + ret = new SessionCollectionView(collectionName, + self.getSendCallbacks()); + self.collectionViews.set(collectionName, ret); + } + return ret; + }, + + added: function (subscriptionHandle, collectionName, id, fields) { + var self = this; + var view = self.getCollectionView(collectionName); + view.added(subscriptionHandle, id, fields); + }, + + removed: function (subscriptionHandle, collectionName, id) { + var self = this; + var view = self.getCollectionView(collectionName); + view.removed(subscriptionHandle, id); + if (view.isEmpty()) { + self.collectionViews.delete(collectionName); + } + }, + + changed: function (subscriptionHandle, collectionName, id, fields) { + var self = this; + var view = self.getCollectionView(collectionName); + view.changed(subscriptionHandle, id, fields); + }, + + startUniversalSubs: function () { + var self = this; + // Make a shallow copy of the set of universal handlers and start them. If + // additional universal publishers start while we're running them (due to + // yielding), they will run separately as part of Server.publish. + var handlers = _.clone(self.server.universal_publish_handlers); + _.each(handlers, function (handler) { + self._startSubscription(handler); + }); + }, + + // Destroy this session and unregister it at the server. + close: function () { + var self = this; + + // Destroy this session, even if it's not registered at the + // server. Stop all processing and tear everything down. If a socket + // was attached, close it. + + // Already destroyed. + if (! self.inQueue) + return; + + // Drop the merge box data immediately. + self.inQueue = null; + self.collectionViews = new Map(); + + if (self.heartbeat) { + self.heartbeat.stop(); + self.heartbeat = null; + } + + if (self.socket) { + self.socket.close(); + self.socket._meteorSession = null; + } + + Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact( + "livedata", "sessions", -1); + + Meteor.defer(function () { + // stop callbacks can yield, so we defer this on close. + // sub._isDeactivated() detects that we set inQueue to null and + // treats it as semi-deactivated (it will ignore incoming callbacks, etc). + self._deactivateAllSubscriptions(); + + // Defer calling the close callbacks, so that the caller closing + // the session isn't waiting for all the callbacks to complete. + _.each(self._closeCallbacks, function (callback) { + callback(); + }); + }); + + // Unregister the session. + self.server._removeSession(self); + }, + + // Send a message (doing nothing if no socket is connected right now.) + // It should be a JSON object (it will be stringified.) + send: function (msg) { + var self = this; + if (self.socket) { + if (Meteor._printSentDDP) + Meteor._debug("Sent DDP", DDPCommon.stringifyDDP(msg)); + self.socket.send(DDPCommon.stringifyDDP(msg)); + } + }, + + // Send a connection error. + sendError: function (reason, offendingMessage) { + var self = this; + var msg = {msg: 'error', reason: reason}; + if (offendingMessage) + msg.offendingMessage = offendingMessage; + self.send(msg); + }, + + // Process 'msg' as an incoming message. (But as a guard against + // race conditions during reconnection, ignore the message if + // 'socket' is not the currently connected socket.) + // + // We run the messages from the client one at a time, in the order + // given by the client. The message handler is passed an idempotent + // function 'unblock' which it may call to allow other messages to + // begin running in parallel in another fiber (for example, a method + // that wants to yield.) Otherwise, it is automatically unblocked + // when it returns. + // + // Actually, we don't have to 'totally order' the messages in this + // way, but it's the easiest thing that's correct. (unsub needs to + // be ordered against sub, methods need to be ordered against each + // other.) + processMessage: function (msg_in) { + var self = this; + if (!self.inQueue) // we have been destroyed. + return; + + // Respond to ping and pong messages immediately without queuing. + // If the negotiated DDP version is "pre1" which didn't support + // pings, preserve the "pre1" behavior of responding with a "bad + // request" for the unknown messages. + // + // Fibers are needed because heartbeat uses Meteor.setTimeout, which + // needs a Fiber. We could actually use regular setTimeout and avoid + // these new fibers, but it is easier to just make everything use + // Meteor.setTimeout and not think too hard. + // + // Any message counts as receiving a pong, as it demonstrates that + // the client is still alive. + if (self.heartbeat) { + Fiber(function () { + self.heartbeat.messageReceived(); + }).run(); + } + + if (self.version !== 'pre1' && msg_in.msg === 'ping') { + if (self._respondToPings) + self.send({msg: "pong", id: msg_in.id}); + return; + } + if (self.version !== 'pre1' && msg_in.msg === 'pong') { + // Since everything is a pong, nothing to do + return; + } + + self.inQueue.push(msg_in); + if (self.workerRunning) + return; + self.workerRunning = true; + + var processNext = function () { + var msg = self.inQueue && self.inQueue.shift(); + if (!msg) { + self.workerRunning = false; + return; + } + + Fiber(function () { + var blocked = true; + + var unblock = function () { + if (!blocked) + return; // idempotent + blocked = false; + processNext(); + }; + + self.server.onMessageHook.each(function (callback) { + callback(msg, self); + return true; + }); + + if (_.has(self.protocol_handlers, msg.msg)) + self.protocol_handlers[msg.msg].call(self, msg, unblock); + else + self.sendError('Bad request', msg); + unblock(); // in case the handler didn't already do it + }).run(); + }; + + processNext(); + }, + + protocol_handlers: { + sub: function (msg) { + var self = this; + + // reject malformed messages + if (typeof (msg.id) !== "string" || + typeof (msg.name) !== "string" || + (('params' in msg) && !(msg.params instanceof Array))) { + self.sendError("Malformed subscription", msg); + return; + } + + if (!self.server.publish_handlers[msg.name]) { + self.send({ + msg: 'nosub', id: msg.id, + error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)}); + return; + } + + if (self._namedSubs.has(msg.id)) + // subs are idempotent, or rather, they are ignored if a sub + // with that id already exists. this is important during + // reconnect. + return; + + // XXX It'd be much better if we had generic hooks where any package can + // hook into subscription handling, but in the mean while we special case + // ddp-rate-limiter package. This is also done for weak requirements to + // add the ddp-rate-limiter package in case we don't have Accounts. A + // user trying to use the ddp-rate-limiter must explicitly require it. + if (Package['ddp-rate-limiter']) { + var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter; + var rateLimiterInput = { + userId: self.userId, + clientAddress: self.connectionHandle.clientAddress, + type: "subscription", + name: msg.name, + connectionId: self.id + }; + + DDPRateLimiter._increment(rateLimiterInput); + var rateLimitResult = DDPRateLimiter._check(rateLimiterInput); + if (!rateLimitResult.allowed) { + self.send({ + msg: 'nosub', id: msg.id, + error: new Meteor.Error( + 'too-many-requests', + DDPRateLimiter.getErrorMessage(rateLimitResult), + {timeToReset: rateLimitResult.timeToReset}) + }); + return; + } + } + + var handler = self.server.publish_handlers[msg.name]; + + self._startSubscription(handler, msg.id, msg.params, msg.name); + + }, + + unsub: function (msg) { + var self = this; + + self._stopSubscription(msg.id); + }, + + method: function (msg, unblock) { + var self = this; + + // reject malformed messages + // For now, we silently ignore unknown attributes, + // for forwards compatibility. + if (typeof (msg.id) !== "string" || + typeof (msg.method) !== "string" || + (('params' in msg) && !(msg.params instanceof Array)) || + (('randomSeed' in msg) && (typeof msg.randomSeed !== "string"))) { + self.sendError("Malformed method invocation", msg); + return; + } + + var randomSeed = msg.randomSeed || null; + + // set up to mark the method as satisfied once all observers + // (and subscriptions) have reacted to any writes that were + // done. + var fence = new DDPServer._WriteFence; + fence.onAllCommitted(function () { + // Retire the fence so that future writes are allowed. + // This means that callbacks like timers are free to use + // the fence, and if they fire before it's armed (for + // example, because the method waits for them) their + // writes will be included in the fence. + fence.retire(); + self.send({ + msg: 'updated', methods: [msg.id]}); + }); + + // find the handler + var handler = self.server.method_handlers[msg.method]; + if (!handler) { + self.send({ + msg: 'result', id: msg.id, + error: new Meteor.Error(404, `Method '${msg.method}' not found`)}); + fence.arm(); + return; + } + + var setUserId = function(userId) { + self._setUserId(userId); + }; + + var invocation = new DDPCommon.MethodInvocation({ + isSimulation: false, + userId: self.userId, + setUserId: setUserId, + unblock: unblock, + connection: self.connectionHandle, + randomSeed: randomSeed + }); + + const promise = new Promise((resolve, reject) => { + // XXX It'd be better if we could hook into method handlers better but + // for now, we need to check if the ddp-rate-limiter exists since we + // have a weak requirement for the ddp-rate-limiter package to be added + // to our application. + if (Package['ddp-rate-limiter']) { + var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter; + var rateLimiterInput = { + userId: self.userId, + clientAddress: self.connectionHandle.clientAddress, + type: "method", + name: msg.method, + connectionId: self.id + }; + DDPRateLimiter._increment(rateLimiterInput); + var rateLimitResult = DDPRateLimiter._check(rateLimiterInput) + if (!rateLimitResult.allowed) { + reject(new Meteor.Error( + "too-many-requests", + DDPRateLimiter.getErrorMessage(rateLimitResult), + {timeToReset: rateLimitResult.timeToReset} + )); + return; + } + } + + resolve(DDPServer._CurrentWriteFence.withValue( + fence, + () => DDP._CurrentMethodInvocation.withValue( + invocation, + () => maybeAuditArgumentChecks( + handler, invocation, msg.params, + "call to '" + msg.method + "'" + ) + ) + )); + }); + + function finish() { + fence.arm(); + unblock(); + } + + const payload = { + msg: "result", + id: msg.id + }; + + promise.then((result) => { + finish(); + if (result !== undefined) { + payload.result = result; + } + self.send(payload); + }, (exception) => { + finish(); + payload.error = wrapInternalException( + exception, + `while invoking method '${msg.method}'` + ); + self.send(payload); + }); + } + }, + + _eachSub: function (f) { + var self = this; + self._namedSubs.forEach(f); + self._universalSubs.forEach(f); + }, + + _diffCollectionViews: function (beforeCVs) { + var self = this; + DiffSequence.diffMaps(beforeCVs, self.collectionViews, { + both: function (collectionName, leftValue, rightValue) { + rightValue.diff(leftValue); + }, + rightOnly: function (collectionName, rightValue) { + rightValue.documents.forEach(function (docView, id) { + self.sendAdded(collectionName, id, docView.getFields()); + }); + }, + leftOnly: function (collectionName, leftValue) { + leftValue.documents.forEach(function (doc, id) { + self.sendRemoved(collectionName, id); + }); + } + }); + }, + + // Sets the current user id in all appropriate contexts and reruns + // all subscriptions + _setUserId: function(userId) { + var self = this; + + if (userId !== null && typeof userId !== "string") + throw new Error("setUserId must be called on string or null, not " + + typeof userId); + + // Prevent newly-created universal subscriptions from being added to our + // session; they will be found below when we call startUniversalSubs. + // + // (We don't have to worry about named subscriptions, because we only add + // them when we process a 'sub' message. We are currently processing a + // 'method' message, and the method did not unblock, because it is illegal + // to call setUserId after unblock. Thus we cannot be concurrently adding a + // new named subscription.) + self._dontStartNewUniversalSubs = true; + + // Prevent current subs from updating our collectionViews and call their + // stop callbacks. This may yield. + self._eachSub(function (sub) { + sub._deactivate(); + }); + + // All subs should now be deactivated. Stop sending messages to the client, + // save the state of the published collections, reset to an empty view, and + // update the userId. + self._isSending = false; + var beforeCVs = self.collectionViews; + self.collectionViews = new Map(); + self.userId = userId; + + // _setUserId is normally called from a Meteor method with + // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not + // expected to be set inside a publish function, so we temporary unset it. + // Inside a publish function DDP._CurrentPublicationInvocation is set. + DDP._CurrentMethodInvocation.withValue(undefined, function () { + // Save the old named subs, and reset to having no subscriptions. + var oldNamedSubs = self._namedSubs; + self._namedSubs = new Map(); + self._universalSubs = []; + + oldNamedSubs.forEach(function (sub, subscriptionId) { + var newSub = sub._recreate(); + self._namedSubs.set(subscriptionId, newSub); + // nb: if the handler throws or calls this.error(), it will in fact + // immediately send its 'nosub'. This is OK, though. + newSub._runHandler(); + }); + + // Allow newly-created universal subs to be started on our connection in + // parallel with the ones we're spinning up here, and spin up universal + // subs. + self._dontStartNewUniversalSubs = false; + self.startUniversalSubs(); + }); + + // Start sending messages again, beginning with the diff from the previous + // state of the world to the current state. No yields are allowed during + // this diff, so that other changes cannot interleave. + Meteor._noYieldsAllowed(function () { + self._isSending = true; + self._diffCollectionViews(beforeCVs); + if (!_.isEmpty(self._pendingReady)) { + self.sendReady(self._pendingReady); + self._pendingReady = []; + } + }); + }, + + _startSubscription: function (handler, subId, params, name) { + var self = this; + + var sub = new Subscription( + self, handler, subId, params, name); + if (subId) + self._namedSubs.set(subId, sub); + else + self._universalSubs.push(sub); + + sub._runHandler(); + }, + + // tear down specified subscription + _stopSubscription: function (subId, error) { + var self = this; + + var subName = null; + if (subId) { + var maybeSub = self._namedSubs.get(subId); + if (maybeSub) { + subName = maybeSub._name; + maybeSub._removeAllDocuments(); + maybeSub._deactivate(); + self._namedSubs.delete(subId); + } + } + + var response = {msg: 'nosub', id: subId}; + + if (error) { + response.error = wrapInternalException( + error, + subName ? ("from sub " + subName + " id " + subId) + : ("from sub id " + subId)); + } + + self.send(response); + }, + + // tear down all subscriptions. Note that this does NOT send removed or nosub + // messages, since we assume the client is gone. + _deactivateAllSubscriptions: function () { + var self = this; + + self._namedSubs.forEach(function (sub, id) { + sub._deactivate(); + }); + self._namedSubs = new Map(); + + self._universalSubs.forEach(function (sub) { + sub._deactivate(); + }); + self._universalSubs = []; + }, + + // Determine the remote client's IP address, based on the + // HTTP_FORWARDED_COUNT environment variable representing how many + // proxies the server is behind. + _clientAddress: function () { + var self = this; + + // For the reported client address for a connection to be correct, + // the developer must set the HTTP_FORWARDED_COUNT environment + // variable to an integer representing the number of hops they + // expect in the `x-forwarded-for` header. E.g., set to "1" if the + // server is behind one proxy. + // + // This could be computed once at startup instead of every time. + var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0; + + if (httpForwardedCount === 0) + return self.socket.remoteAddress; + + var forwardedFor = self.socket.headers["x-forwarded-for"]; + if (! _.isString(forwardedFor)) + return null; + forwardedFor = forwardedFor.trim().split(/\s*,\s*/); + + // Typically the first value in the `x-forwarded-for` header is + // the original IP address of the client connecting to the first + // proxy. However, the end user can easily spoof the header, in + // which case the first value(s) will be the fake IP address from + // the user pretending to be a proxy reporting the original IP + // address value. By counting HTTP_FORWARDED_COUNT back from the + // end of the list, we ensure that we get the IP address being + // reported by *our* first proxy. + + if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length) + return null; + + return forwardedFor[forwardedFor.length - httpForwardedCount]; + } +}); + +/******************************************************************************/ +/* Subscription */ +/******************************************************************************/ + +// ctor for a sub handle: the input to each publish function + +// Instance name is this because it's usually referred to as this inside a +// publish +/** + * @summary The server's side of a subscription + * @class Subscription + * @instanceName this + * @showInstanceName true + */ +var Subscription = function ( + session, handler, subscriptionId, params, name) { + var self = this; + self._session = session; // type is Session + + /** + * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription. + * @locus Server + * @name connection + * @memberOf Subscription + * @instance + */ + self.connection = session.connectionHandle; // public API object + + self._handler = handler; + + // my subscription ID (generated by client, undefined for universal subs). + self._subscriptionId = subscriptionId; + // undefined for universal subs + self._name = name; + + self._params = params || []; + + // Only named subscriptions have IDs, but we need some sort of string + // internally to keep track of all subscriptions inside + // SessionDocumentViews. We use this subscriptionHandle for that. + if (self._subscriptionId) { + self._subscriptionHandle = 'N' + self._subscriptionId; + } else { + self._subscriptionHandle = 'U' + Random.id(); + } + + // has _deactivate been called? + self._deactivated = false; + + // stop callbacks to g/c this sub. called w/ zero arguments. + self._stopCallbacks = []; + + // the set of (collection, documentid) that this subscription has + // an opinion about + self._documents = new Map(); + + // remember if we are ready. + self._ready = false; + + // Part of the public API: the user of this sub. + + /** + * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in. + * @locus Server + * @memberOf Subscription + * @name userId + * @instance + */ + self.userId = session.userId; + + // For now, the id filter is going to default to + // the to/from DDP methods on MongoID, to + // specifically deal with mongo/minimongo ObjectIds. + + // Later, you will be able to make this be "raw" + // if you want to publish a collection that you know + // just has strings for keys and no funny business, to + // a ddp consumer that isn't minimongo + + self._idFilter = { + idStringify: MongoID.idStringify, + idParse: MongoID.idParse + }; + + Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact( + "livedata", "subscriptions", 1); +}; + +_.extend(Subscription.prototype, { + _runHandler: function () { + // XXX should we unblock() here? Either before running the publish + // function, or before running _publishCursor. + // + // Right now, each publish function blocks all future publishes and + // methods waiting on data from Mongo (or whatever else the function + // blocks on). This probably slows page load in common cases. + + var self = this; + try { + var res = DDP._CurrentPublicationInvocation.withValue( + self, + () => maybeAuditArgumentChecks( + self._handler, self, EJSON.clone(self._params), + // It's OK that this would look weird for universal subscriptions, + // because they have no arguments so there can never be an + // audit-argument-checks failure. + "publisher '" + self._name + "'" + ) + ); + } catch (e) { + self.error(e); + return; + } + + // Did the handler call this.error or this.stop? + if (self._isDeactivated()) + return; + + self._publishHandlerResult(res); + }, + + _publishHandlerResult: function (res) { + // SPECIAL CASE: Instead of writing their own callbacks that invoke + // this.added/changed/ready/etc, the user can just return a collection + // cursor or array of cursors from the publish function; we call their + // _publishCursor method which starts observing the cursor and publishes the + // results. Note that _publishCursor does NOT call ready(). + // + // XXX This uses an undocumented interface which only the Mongo cursor + // interface publishes. Should we make this interface public and encourage + // users to implement it themselves? Arguably, it's unnecessary; users can + // already write their own functions like + // var publishMyReactiveThingy = function (name, handler) { + // Meteor.publish(name, function () { + // var reactiveThingy = handler(); + // reactiveThingy.publishMe(); + // }); + // }; + + var self = this; + var isCursor = function (c) { + return c && c._publishCursor; + }; + if (isCursor(res)) { + try { + res._publishCursor(self); + } catch (e) { + self.error(e); + return; + } + // _publishCursor only returns after the initial added callbacks have run. + // mark subscription as ready. + self.ready(); + } else if (_.isArray(res)) { + // check all the elements are cursors + if (! _.all(res, isCursor)) { + self.error(new Error("Publish function returned an array of non-Cursors")); + return; + } + // find duplicate collection names + // XXX we should support overlapping cursors, but that would require the + // merge box to allow overlap within a subscription + var collectionNames = {}; + for (var i = 0; i < res.length; ++i) { + var collectionName = res[i]._getCollectionName(); + if (_.has(collectionNames, collectionName)) { + self.error(new Error( + "Publish function returned multiple cursors for collection " + + collectionName)); + return; + } + collectionNames[collectionName] = true; + }; + + try { + _.each(res, function (cur) { + cur._publishCursor(self); + }); + } catch (e) { + self.error(e); + return; + } + self.ready(); + } else if (res) { + // truthy values other than cursors or arrays are probably a + // user mistake (possible returning a Mongo document via, say, + // `coll.findOne()`). + self.error(new Error("Publish function can only return a Cursor or " + + "an array of Cursors")); + } + }, + + // This calls all stop callbacks and prevents the handler from updating any + // SessionCollectionViews further. It's used when the user unsubscribes or + // disconnects, as well as during setUserId re-runs. It does *NOT* send + // removed messages for the published objects; if that is necessary, call + // _removeAllDocuments first. + _deactivate: function() { + var self = this; + if (self._deactivated) + return; + self._deactivated = true; + self._callStopCallbacks(); + Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact( + "livedata", "subscriptions", -1); + }, + + _callStopCallbacks: function () { + var self = this; + // tell listeners, so they can clean up + var callbacks = self._stopCallbacks; + self._stopCallbacks = []; + _.each(callbacks, function (callback) { + callback(); + }); + }, + + // Send remove messages for every document. + _removeAllDocuments: function () { + var self = this; + Meteor._noYieldsAllowed(function () { + self._documents.forEach(function (collectionDocs, collectionName) { + collectionDocs.forEach(function (strId) { + self.removed(collectionName, self._idFilter.idParse(strId)); + }); + }); + }); + }, + + // Returns a new Subscription for the same session with the same + // initial creation parameters. This isn't a clone: it doesn't have + // the same _documents cache, stopped state or callbacks; may have a + // different _subscriptionHandle, and gets its userId from the + // session, not from this object. + _recreate: function () { + var self = this; + return new Subscription( + self._session, self._handler, self._subscriptionId, self._params, + self._name); + }, + + /** + * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error). + * @locus Server + * @param {Error} error The error to pass to the client. + * @instance + * @memberOf Subscription + */ + error: function (error) { + var self = this; + if (self._isDeactivated()) + return; + self._session._stopSubscription(self._subscriptionId, error); + }, + + // Note that while our DDP client will notice that you've called stop() on the + // server (and clean up its _subscriptions table) we don't actually provide a + // mechanism for an app to notice this (the subscribe onError callback only + // triggers if there is an error). + + /** + * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error. + * @locus Server + * @instance + * @memberOf Subscription + */ + stop: function () { + var self = this; + if (self._isDeactivated()) + return; + self._session._stopSubscription(self._subscriptionId); + }, + + /** + * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped. + * @locus Server + * @memberOf Subscription + * @instance + * @param {Function} func The callback function + */ + onStop: function (callback) { + var self = this; + callback = Meteor.bindEnvironment(callback, 'onStop callback', self); + if (self._isDeactivated()) + callback(); + else + self._stopCallbacks.push(callback); + }, + + // This returns true if the sub has been deactivated, *OR* if the session was + // destroyed but the deferred call to _deactivateAllSubscriptions hasn't + // happened yet. + _isDeactivated: function () { + var self = this; + return self._deactivated || self._session.inQueue === null; + }, + + /** + * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set. + * @locus Server + * @memberOf Subscription + * @instance + * @param {String} collection The name of the collection that contains the new document. + * @param {String} id The new document's ID. + * @param {Object} fields The fields in the new document. If `_id` is present it is ignored. + */ + added: function (collectionName, id, fields) { + var self = this; + if (self._isDeactivated()) + return; + id = self._idFilter.idStringify(id); + let ids = self._documents.get(collectionName); + if (ids == null) { + ids = new Set(); + self._documents.set(collectionName, ids); + } + ids.add(id); + self._session.added(self._subscriptionHandle, collectionName, id, fields); + }, + + /** + * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified. + * @locus Server + * @memberOf Subscription + * @instance + * @param {String} collection The name of the collection that contains the changed document. + * @param {String} id The changed document's ID. + * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored. + */ + changed: function (collectionName, id, fields) { + var self = this; + if (self._isDeactivated()) + return; + id = self._idFilter.idStringify(id); + self._session.changed(self._subscriptionHandle, collectionName, id, fields); + }, + + /** + * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set. + * @locus Server + * @memberOf Subscription + * @instance + * @param {String} collection The name of the collection that the document has been removed from. + * @param {String} id The ID of the document that has been removed. + */ + removed: function (collectionName, id) { + var self = this; + if (self._isDeactivated()) + return; + id = self._idFilter.idStringify(id); + // We don't bother to delete sets of things in a collection if the + // collection is empty. It could break _removeAllDocuments. + self._documents.get(collectionName).delete(id); + self._session.removed(self._subscriptionHandle, collectionName, id); + }, + + /** + * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. + * @locus Server + * @memberOf Subscription + * @instance + */ + ready: function () { + var self = this; + if (self._isDeactivated()) + return; + if (!self._subscriptionId) + return; // unnecessary but ignored for universal sub + if (!self._ready) { + self._session.sendReady([self._subscriptionId]); + self._ready = true; + } + } +}); + +/******************************************************************************/ +/* Server */ +/******************************************************************************/ + +Server = function (options) { + var self = this; + + // The default heartbeat interval is 30 seconds on the server and 35 + // seconds on the client. Since the client doesn't need to send a + // ping as long as it is receiving pings, this means that pings + // normally go from the server to the client. + // + // Note: Troposphere depends on the ability to mutate + // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life. + self.options = _.defaults(options || {}, { + heartbeatInterval: 15000, + heartbeatTimeout: 15000, + // For testing, allow responding to pings to be disabled. + respondToPings: true + }); + + // Map of callbacks to call when a new connection comes in to the + // server and completes DDP version negotiation. Use an object instead + // of an array so we can safely remove one from the list while + // iterating over it. + self.onConnectionHook = new Hook({ + debugPrintExceptions: "onConnection callback" + }); + + // Map of callbacks to call when a new message comes in. + self.onMessageHook = new Hook({ + debugPrintExceptions: "onMessage callback" + }); + + self.publish_handlers = {}; + self.universal_publish_handlers = []; + + self.method_handlers = {}; + + self.sessions = new Map(); // map from id to session + + self.stream_server = new StreamServer; + + self.stream_server.register(function (socket) { + // socket implements the SockJSConnection interface + socket._meteorSession = null; + + var sendError = function (reason, offendingMessage) { + var msg = {msg: 'error', reason: reason}; + if (offendingMessage) + msg.offendingMessage = offendingMessage; + socket.send(DDPCommon.stringifyDDP(msg)); + }; + + socket.on('data', function (raw_msg) { + if (Meteor._printReceivedDDP) { + Meteor._debug("Received DDP", raw_msg); + } + try { + try { + var msg = DDPCommon.parseDDP(raw_msg); + } catch (err) { + sendError('Parse error'); + return; + } + if (msg === null || !msg.msg) { + sendError('Bad request', msg); + return; + } + + if (msg.msg === 'connect') { + if (socket._meteorSession) { + sendError("Already connected", msg); + return; + } + Fiber(function () { + self._handleConnect(socket, msg); + }).run(); + return; + } + + if (!socket._meteorSession) { + sendError('Must connect first', msg); + return; + } + socket._meteorSession.processMessage(msg); + } catch (e) { + // XXX print stack nicely + Meteor._debug("Internal exception while processing message", msg, e); + } + }); + + socket.on('close', function () { + if (socket._meteorSession) { + Fiber(function () { + socket._meteorSession.close(); + }).run(); + } + }); + }); +}; + +_.extend(Server.prototype, { + + /** + * @summary Register a callback to be called when a new DDP connection is made to the server. + * @locus Server + * @param {function} callback The function to call when a new DDP connection is established. + * @memberOf Meteor + * @importFromPackage meteor + */ + onConnection: function (fn) { + var self = this; + return self.onConnectionHook.register(fn); + }, + + /** + * @summary Register a callback to be called when a new DDP message is received. + * @locus Server + * @param {function} callback The function to call when a new DDP message is received. + * @memberOf Meteor + * @importFromPackage meteor + */ + onMessage: function (fn) { + var self = this; + return self.onMessageHook.register(fn); + }, + + _handleConnect: function (socket, msg) { + var self = this; + + // The connect message must specify a version and an array of supported + // versions, and it must claim to support what it is proposing. + if (!(typeof (msg.version) === 'string' && + _.isArray(msg.support) && + _.all(msg.support, _.isString) && + _.contains(msg.support, msg.version))) { + socket.send(DDPCommon.stringifyDDP({msg: 'failed', + version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]})); + socket.close(); + return; + } + + // In the future, handle session resumption: something like: + // socket._meteorSession = self.sessions[msg.session] + var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS); + + if (msg.version !== version) { + // The best version to use (according to the client's stated preferences) + // is not the one the client is trying to use. Inform them about the best + // version to use. + socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version})); + socket.close(); + return; + } + + // Yay, version matches! Create a new session. + // Note: Troposphere depends on the ability to mutate + // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life. + socket._meteorSession = new Session(self, version, socket, self.options); + self.sessions.set(socket._meteorSession.id, socket._meteorSession); + self.onConnectionHook.each(function (callback) { + if (socket._meteorSession) + callback(socket._meteorSession.connectionHandle); + return true; + }); + }, + /** + * Register a publish handler function. + * + * @param name {String} identifier for query + * @param handler {Function} publish handler + * @param options {Object} + * + * Server will call handler function on each new subscription, + * either when receiving DDP sub message for a named subscription, or on + * DDP connect for a universal subscription. + * + * If name is null, this will be a subscription that is + * automatically established and permanently on for all connected + * client, instead of a subscription that can be turned on and off + * with subscribe(). + * + * options to contain: + * - (mostly internal) is_auto: true if generated automatically + * from an autopublish hook. this is for cosmetic purposes only + * (it lets us determine whether to print a warning suggesting + * that you turn off autopublish.) + */ + + /** + * @summary Publish a record set. + * @memberOf Meteor + * @importFromPackage meteor + * @locus Server + * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients. + * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments. + */ + publish: function (name, handler, options) { + var self = this; + + if (! _.isObject(name)) { + options = options || {}; + + if (name && name in self.publish_handlers) { + Meteor._debug("Ignoring duplicate publish named '" + name + "'"); + return; + } + + if (Package.autopublish && !options.is_auto) { + // They have autopublish on, yet they're trying to manually + // picking stuff to publish. They probably should turn off + // autopublish. (This check isn't perfect -- if you create a + // publish before you turn on autopublish, it won't catch + // it. But this will definitely handle the simple case where + // you've added the autopublish package to your app, and are + // calling publish from your app code.) + if (!self.warned_about_autopublish) { + self.warned_about_autopublish = true; + Meteor._debug( + "** You've set up some data subscriptions with Meteor.publish(), but\n" + + "** you still have autopublish turned on. Because autopublish is still\n" + + "** on, your Meteor.publish() calls won't have much effect. All data\n" + + "** will still be sent to all clients.\n" + + "**\n" + + "** Turn off autopublish by removing the autopublish package:\n" + + "**\n" + + "** $ meteor remove autopublish\n" + + "**\n" + + "** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\n" + + "** for each collection that you want clients to see.\n"); + } + } + + if (name) + self.publish_handlers[name] = handler; + else { + self.universal_publish_handlers.push(handler); + // Spin up the new publisher on any existing session too. Run each + // session's subscription in a new Fiber, so that there's no change for + // self.sessions to change while we're running this loop. + self.sessions.forEach(function (session) { + if (!session._dontStartNewUniversalSubs) { + Fiber(function() { + session._startSubscription(handler); + }).run(); + } + }); + } + } + else{ + _.each(name, function(value, key) { + self.publish(key, value, {}); + }); + } + }, + + _removeSession: function (session) { + var self = this; + self.sessions.delete(session.id); + }, + + /** + * @summary Defines functions that can be invoked over the network by clients. + * @locus Anywhere + * @param {Object} methods Dictionary whose keys are method names and values are functions. + * @memberOf Meteor + * @importFromPackage meteor + */ + methods: function (methods) { + var self = this; + _.each(methods, function (func, name) { + if (typeof func !== 'function') + throw new Error("Method '" + name + "' must be a function"); + if (self.method_handlers[name]) + throw new Error("A method named '" + name + "' is already defined"); + self.method_handlers[name] = func; + }); + }, + + call: function (name, ...args) { + if (args.length && typeof args[args.length - 1] === "function") { + // If it's a function, the last argument is the result callback, not + // a parameter to the remote method. + var callback = args.pop(); + } + + return this.apply(name, args, callback); + }, + + // A version of the call method that always returns a Promise. + callAsync: function (name, ...args) { + return this.applyAsync(name, args); + }, + + apply: function (name, args, options, callback) { + // We were passed 3 arguments. They may be either (name, args, options) + // or (name, args, callback) + if (! callback && typeof options === 'function') { + callback = options; + options = {}; + } else { + options = options || {}; + } + + const promise = this.applyAsync(name, args, options); + + // Return the result in whichever way the caller asked for it. Note that we + // do NOT block on the write fence in an analogous way to how the client + // blocks on the relevant data being visible, so you are NOT guaranteed that + // cursor observe callbacks have fired when your callback is invoked. (We + // can change this if there's a real use case.) + if (callback) { + promise.then( + result => callback(undefined, result), + exception => callback(exception) + ); + } else { + return promise.await(); + } + }, + + // @param options {Optional Object} + applyAsync: function (name, args, options) { + // Run the handler + var handler = this.method_handlers[name]; + if (! handler) { + return Promise.reject( + new Meteor.Error(404, `Method '${name}' not found`) + ); + } + + // If this is a method call from within another method or publish function, + // get the user state from the outer method or publish function, otherwise + // don't allow setUserId to be called + var userId = null; + var setUserId = function() { + throw new Error("Can't call setUserId on a server initiated method call"); + }; + var connection = null; + var currentMethodInvocation = DDP._CurrentMethodInvocation.get(); + var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get(); + var randomSeed = null; + if (currentMethodInvocation) { + userId = currentMethodInvocation.userId; + setUserId = function(userId) { + currentMethodInvocation.setUserId(userId); + }; + connection = currentMethodInvocation.connection; + randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name); + } else if (currentPublicationInvocation) { + userId = currentPublicationInvocation.userId; + setUserId = function(userId) { + currentPublicationInvocation._session._setUserId(userId); + }; + connection = currentPublicationInvocation.connection; + } + + var invocation = new DDPCommon.MethodInvocation({ + isSimulation: false, + userId, + setUserId, + connection, + randomSeed + }); + + return new Promise(resolve => resolve( + DDP._CurrentMethodInvocation.withValue( + invocation, + () => maybeAuditArgumentChecks( + handler, invocation, EJSON.clone(args), + "internal call to '" + name + "'" + ) + ) + )).then(EJSON.clone); + }, + + _urlForSession: function (sessionId) { + var self = this; + var session = self.sessions.get(sessionId); + if (session) + return session._socketUrl; + else + return null; + } +}); + +var calculateVersion = function (clientSupportedVersions, + serverSupportedVersions) { + var correctVersion = _.find(clientSupportedVersions, function (version) { + return _.contains(serverSupportedVersions, version); + }); + if (!correctVersion) { + correctVersion = serverSupportedVersions[0]; + } + return correctVersion; +}; + +DDPServer._calculateVersion = calculateVersion; + + +// "blind" exceptions other than those that were deliberately thrown to signal +// errors to the client +var wrapInternalException = function (exception, context) { + if (!exception) return exception; + + // To allow packages to throw errors intended for the client but not have to + // depend on the Meteor.Error class, `isClientSafe` can be set to true on any + // error before it is thrown. + if (exception.isClientSafe) { + if (!(exception instanceof Meteor.Error)) { + const originalMessage = exception.message; + exception = new Meteor.Error(exception.error, exception.reason, exception.details); + exception.message = originalMessage; + } + return exception; + } + + // Tests can set the '_expectedByTest' flag on an exception so it won't go to + // the server log. + if (!exception._expectedByTest) { + Meteor._debug("Exception " + context, exception.stack); + if (exception.sanitizedError) { + Meteor._debug("Sanitized and reported to the client as:", exception.sanitizedError); + Meteor._debug(); + } + } + + // Did the error contain more details that could have been useful if caught in + // server code (or if thrown from non-client-originated code), but also + // provided a "sanitized" version with more context than 500 Internal server + // error? Use that. + if (exception.sanitizedError) { + if (exception.sanitizedError.isClientSafe) + return exception.sanitizedError; + Meteor._debug("Exception " + context + " provides a sanitizedError that " + + "does not have isClientSafe property set; ignoring"); + } + + return new Meteor.Error(500, "Internal server error"); +}; + + +// Audit argument checks, if the audit-argument-checks package exists (it is a +// weak dependency of this package). +var maybeAuditArgumentChecks = function (f, context, args, description) { + args = args || []; + if (Package['audit-argument-checks']) { + return Match._failIfArgumentsAreNotAllChecked( + f, context, args, description); + } + return f.apply(context, args); +}; diff --git a/creator/packages/ddp-server/livedata_server_tests.js b/creator/packages/ddp-server/livedata_server_tests.js new file mode 100644 index 0000000000..cde56b6196 --- /dev/null +++ b/creator/packages/ddp-server/livedata_server_tests.js @@ -0,0 +1,411 @@ +var Fiber = Npm.require('fibers'); + + +Tinytest.addAsync( + "livedata server - connectionHandle.onClose()", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + // On the server side, wait for the connection to be closed. + serverConn.onClose(function () { + test.isTrue(true); + // Add a new onClose after the connection is already + // closed. See that it fires. + serverConn.onClose(function () { + onComplete(); + }); + }); + // Close the connection from the client. + clientConn.disconnect(); + }, + onComplete + ); + } +); + +Tinytest.addAsync( + "livedata server - connectionHandle.close()", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + // Wait for the connection to be closed from the server side. + simplePoll( + function () { + return ! clientConn.status().connected; + }, + onComplete, + function () { + test.fail("timeout waiting for the connection to be closed on the server side"); + onComplete(); + } + ); + + // Close the connection from the server. + serverConn.close(); + }, + onComplete + ); + } +); + + +testAsyncMulti( + "livedata server - onConnection doesn't get callback after stop.", + [function (test, expect) { + var afterStop = false; + var expectStop1 = expect(); + var stopHandle1 = Meteor.onConnection(function (conn) { + stopHandle2.stop(); + stopHandle1.stop(); + afterStop = true; + // yield to the event loop for a moment to see that no other calls + // to listener2 are called. + Meteor.setTimeout(expectStop1, 10); + }); + var stopHandle2 = Meteor.onConnection(function (conn) { + test.isFalse(afterStop); + }); + + // trigger a connection + var expectConnection = expect(); + makeTestConnection( + test, + function (clientConn, serverConn) { + // Close the connection from the client. + clientConn.disconnect(); + expectConnection(); + }, + expectConnection + ); + }] +); + +Meteor.methods({ + livedata_server_test_inner: function () { + return this.connection && this.connection.id; + }, + + livedata_server_test_outer: function () { + return Meteor.call('livedata_server_test_inner'); + }, + + livedata_server_test_setuserid: function (userId) { + this.setUserId(userId); + } +}); + + +Tinytest.addAsync( + "livedata server - onMessage hook", + function (test, onComplete) { + + var cb = Meteor.onMessage(function (msg, session) { + test.equal(msg.method, 'livedata_server_test_inner'); + cb.stop(); + onComplete(); + }); + + makeTestConnection( + test, + function (clientConn, serverConn) { + clientConn.call('livedata_server_test_inner'); + clientConn.disconnect(); + }, + onComplete + ); + } +); + + +Tinytest.addAsync( + "livedata server - connection in method invocation", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + var res = clientConn.call('livedata_server_test_inner'); + test.equal(res, serverConn.id); + clientConn.disconnect(); + onComplete(); + }, + onComplete + ); + } +); + + +Tinytest.addAsync( + "livedata server - connection in nested method invocation", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + var res = clientConn.call('livedata_server_test_outer'); + test.equal(res, serverConn.id); + clientConn.disconnect(); + onComplete(); + }, + onComplete + ); + } +); + + +// connectionId -> callback +var onSubscription = {}; + +Meteor.publish("livedata_server_test_sub", function (connectionId) { + var callback = onSubscription[connectionId]; + if (callback) + callback(this); + this.stop(); +}); + +Meteor.publish("livedata_server_test_sub_method", function (connectionId) { + var callback = onSubscription[connectionId]; + if (callback) { + var id = Meteor.call('livedata_server_test_inner'); + callback(id); + } + this.stop(); +}); + +Meteor.publish("livedata_server_test_sub_context", function (connectionId, userId) { + var callback = onSubscription[connectionId]; + var methodInvocation = DDP._CurrentMethodInvocation.get(); + var publicationInvocation = DDP._CurrentPublicationInvocation.get(); + + // Check the publish function's environment variables and context. + if (callback) { + callback.call(this, methodInvocation, publicationInvocation); + } + + // Check that onStop callback is have the same context as the publish function + // and that it runs with the same environment variables as this publish function. + this.onStop(function () { + var onStopMethodInvocation = DDP._CurrentMethodInvocation.get(); + var onStopPublicationInvocation = DDP._CurrentPublicationInvocation.get(); + callback.call(this, onStopMethodInvocation, onStopPublicationInvocation, true); + }); + + if (this.userId) { + this.stop(); + } else { + this.ready(); + Meteor.call('livedata_server_test_setuserid', userId); + } +}); + + +Tinytest.addAsync( + "livedata server - connection in publish function", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + onSubscription[serverConn.id] = function (subscription) { + delete onSubscription[serverConn.id]; + test.equal(subscription.connection.id, serverConn.id); + clientConn.disconnect(); + onComplete(); + }; + clientConn.subscribe("livedata_server_test_sub", serverConn.id); + } + ); + } +); + +Tinytest.addAsync( + "livedata server - connection in method called from publish function", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + onSubscription[serverConn.id] = function (id) { + delete onSubscription[serverConn.id]; + test.equal(id, serverConn.id); + clientConn.disconnect(); + onComplete(); + }; + clientConn.subscribe("livedata_server_test_sub_method", serverConn.id); + } + ); + } +); + +Tinytest.addAsync( + "livedata server - verify context in publish function", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + var userId = 'someUserId'; + onSubscription[serverConn.id] = function (methodInvocation, publicationInvocation, fromOnStop) { + // DDP._CurrentMethodInvocation should be undefined in a publish function + test.isUndefined(methodInvocation, 'Should have been undefined'); + // DDP._CurrentPublicationInvocation should be set in a publish function + test.isNotUndefined(publicationInvocation, 'Should have been defined'); + if (this.userId === userId && fromOnStop) { + delete onSubscription[serverConn.id]; + clientConn.disconnect(); + onComplete(); + } + } + clientConn.subscribe("livedata_server_test_sub_context", serverConn.id, userId); + } + ); + } +); + +let onSubscriptions = {}; + +Meteor.publish({ + publicationObject () { + let callback = onSubscriptions; + if (callback) + callback(); + this.stop(); + } +}); + +Meteor.publish({ + "publication_object": function () { + let callback = onSubscriptions; + if (callback) + callback(); + this.stop(); + } +}); + +Meteor.publish("publication_compatibility", function () { + let callback = onSubscriptions; + if (callback) + callback(); + this.stop(); +}); + +Tinytest.addAsync( + "livedata server - publish object", + function (test, onComplete) { + makeTestConnection( + test, + function (clientConn, serverConn) { + let testsLength = 0; + + onSubscriptions = function (subscription) { + delete onSubscriptions; + clientConn.disconnect(); + testsLength++; + if(testsLength == 3){ + onComplete(); + } + }; + clientConn.subscribe("publicationObject"); + clientConn.subscribe("publication_object"); + clientConn.subscribe("publication_compatibility"); + } + ); + } +); + +Meteor.methods({ + testResolvedPromise(arg) { + const invocation1 = DDP._CurrentMethodInvocation.get(); + return Promise.resolve(arg).then(result => { + const invocation2 = DDP._CurrentMethodInvocation.get(); + // This equality holds because Promise callbacks are bound to the + // dynamic environment where .then was called. + if (invocation1 !== invocation2) { + throw new Meteor.Error("invocation mismatch"); + } + return result + " after waiting"; + }); + }, + + testRejectedPromise(arg) { + return Promise.resolve(arg).then(result => { + throw new Meteor.Error(result + " raised Meteor.Error"); + }); + }, + + testRejectedPromiseWithGenericError(arg) { + return Promise.resolve(arg).then(result => { + const error = new Error('MESSAGE'); + error.error = 'ERROR'; + error.reason = 'REASON'; + error.details = { foo: 'bar' }; + error.isClientSafe = true; + throw error; + }); + } +}); + +Tinytest.addAsync( + "livedata server - waiting for Promise", + (test, onComplete) => makeTestConnection(test, (clientConn, serverConn) => { + test.equal( + clientConn.call("testResolvedPromise", "clientConn.call"), + "clientConn.call after waiting" + ); + + const clientCallPromise = new Promise( + (resolve, reject) => clientConn.call( + "testResolvedPromise", + "clientConn.call with callback", + (error, result) => error ? reject(error) : resolve(result) + ) + ); + + const serverCallAsyncPromise = Meteor.server.callAsync( + "testResolvedPromise", + "Meteor.server.callAsync" + ); + + const serverApplyAsyncPromise = Meteor.server.applyAsync( + "testResolvedPromise", + ["Meteor.server.applyAsync"] + ); + + const clientCallRejectedPromise = new Promise(resolve => { + clientConn.call( + "testRejectedPromise", + "with callback", + (error, result) => resolve(error.message) + ); + }); + + const clientCallRejectedPromiseWithGenericError = new Promise(resolve => { + clientConn.call( + "testRejectedPromiseWithGenericError", + (error, result) => resolve({ + message: error.message, + error: error.error, + reason: error.reason, + details: error.details, + }) + ); + }); + + Promise.all([ + clientCallPromise, + clientCallRejectedPromise, + clientCallRejectedPromiseWithGenericError, + serverCallAsyncPromise, + serverApplyAsyncPromise + ]).then(results => test.equal(results, [ + "clientConn.call with callback after waiting", + "[with callback raised Meteor.Error]", + { + message: 'REASON [ERROR]', + error: 'ERROR', + reason: 'REASON', + details: { foo: 'bar' }, + }, + "Meteor.server.callAsync after waiting", + "Meteor.server.applyAsync after waiting" + ]), error => test.fail(error)) + .then(onComplete); + }) +); diff --git a/creator/packages/ddp-server/package.js b/creator/packages/ddp-server/package.js new file mode 100644 index 0000000000..a662b14325 --- /dev/null +++ b/creator/packages/ddp-server/package.js @@ -0,0 +1,60 @@ +Package.describe({ + summary: "Meteor's latency-compensated distributed data server", + version: '2.3.0', + documentation: null +}); + +Npm.depends({ + "permessage-deflate": "0.1.6", + sockjs: "0.3.19" +}); + +Package.onUse(function (api) { + api.use(['check', 'random', 'ejson', 'underscore', + 'retry', 'mongo-id', 'diff-sequence', 'ecmascript'], + 'server'); + + // common functionality + api.use('ddp-common', 'server'); // heartbeat + api.use('ddp-rate-limiter', 'server', {weak: true}); + // Transport + api.use('ddp-client', 'server'); + api.imply('ddp-client'); + + api.use(['webapp', 'routepolicy'], 'server'); + + // Detect whether or not the user wants us to audit argument checks. + api.use(['audit-argument-checks'], 'server', {weak: true}); + + // Allow us to detect 'autopublish', so we can print a warning if the user + // runs Meteor.publish while it's loaded. + api.use('autopublish', 'server', {weak: true}); + + // If the facts package is loaded, publish some statistics. + api.use('facts-base', 'server', {weak: true}); + + api.use('callback-hook', 'server'); + api.export('DDPServer', 'server'); + + api.addFiles('stream_server.js', 'server'); + + api.addFiles('livedata_server.js', 'server'); + api.addFiles('writefence.js', 'server'); + api.addFiles('crossbar.js', 'server'); + + api.addFiles('server_convenience.js', 'server'); +}); + + + +Package.onTest(function (api) { + api.use('ecmascript', ['client', 'server']); + api.use('livedata', ['client', 'server']); + api.use('mongo', ['client', 'server']); + api.use('test-helpers', ['client', 'server']); + api.use(['underscore', 'tinytest', 'random', 'tracker', 'minimongo', 'reactive-var']); + + api.addFiles('livedata_server_tests.js', 'server'); + api.addFiles('session_view_tests.js', ['server']); + api.addFiles('crossbar_tests.js', ['server']); +}); diff --git a/creator/packages/ddp-server/server_convenience.js b/creator/packages/ddp-server/server_convenience.js new file mode 100755 index 0000000000..28fca40b2b --- /dev/null +++ b/creator/packages/ddp-server/server_convenience.js @@ -0,0 +1,22 @@ +if (process.env.DDP_DEFAULT_CONNECTION_URL) { + __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL = + process.env.DDP_DEFAULT_CONNECTION_URL; +} + +Meteor.server = new Server; + +Meteor.refresh = function (notification) { + DDPServer._InvalidationCrossbar.fire(notification); +}; + +// Proxy the public methods of Meteor.server so they can +// be called directly on Meteor. +_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'], + function (name) { + Meteor[name] = _.bind(Meteor.server[name], Meteor.server); + }); + +// Meteor.server used to be called Meteor.default_server. Provide +// backcompat as a courtesy even though it was never documented. +// XXX COMPAT WITH 0.6.4 +Meteor.default_server = Meteor.server; diff --git a/creator/packages/ddp-server/session_view_tests.js b/creator/packages/ddp-server/session_view_tests.js new file mode 100644 index 0000000000..0459a45107 --- /dev/null +++ b/creator/packages/ddp-server/session_view_tests.js @@ -0,0 +1,393 @@ +var newView = function(test) { + var results = []; + var view = new DDPServer._SessionCollectionView('test', { + added: function (collection, id, fields) { + results.push({fun: 'added', id: id, fields: fields}); + }, + changed: function (collection, id, changed) { + if (_.isEmpty(changed)) + return; + results.push({fun: 'changed', id: id, changed: changed}); + }, + removed: function (collection, id) { + results.push({fun: 'removed', id: id}); + } + }); + var v = { + view: view, + results: results + }; + _.each(["added", "changed", "removed"], function (it) { + v[it] = _.bind(view[it], view); + }); + v.expectResult = function (result) { + test.equal(results.shift(), result); + }; + v.expectNoResult = function () { + test.equal(results, []); + }; + v.drain = function() { + var ret = results; + results = []; + return ret; + }; + return v; +}; + +Tinytest.add('livedata - sessionview - exists reveal', function (test) { + var v = newView(test); + + v.added("A", "A1", {}); + v.expectResult({fun: 'added', id: "A1", fields: {}}); + v.expectNoResult(); + + v.added("B", "A1", {}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - added a second field in another sub', function (test) { + var v = newView(test); + + v.added("A", "A1", {a: "foo"}); + v.expectResult({fun: 'added', id: "A1", fields: {a: "foo"}}); + v.expectNoResult(); + + v.added("B", "A1", {a: "foo", b: "bar"}); + v.expectResult({fun: 'changed', 'id': "A1", changed: {b: "bar"}}); + + v.removed("A", "A1"); + v.expectNoResult(); + + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + + +Tinytest.add('livedata - sessionview - field reveal', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.added("B", "A1", {foo: "baz"}); + v.removed("A", "A1"); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz"}}); + v.expectNoResult(); + // Somewhere in here we must have changed foo to baz. Legal either on the + // added or on the removed, but only once. + + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - field change', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.changed("A", "A1", {foo: "baz"}, []); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz"}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - field clear', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.changed("A", "A1", {foo: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: undefined}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - change makes a new field', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.changed("A", "A1", {baz:"quux"}); + v.expectResult({fun: 'changed', id: "A1", changed: {baz: "quux"}}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - add, remove, add', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + +}); + +Tinytest.add('livedata - sessionview - field clear reveal', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + + v.added("B", "A1", {foo: "baz"}); + v.changed("A", "A1", {foo: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz"}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - change to canonical value produces no change', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + + v.added("B", "A1", {foo: "baz"}); + var canon = "bar"; + var maybeResults = v.drain(); + if (!_.isEmpty(maybeResults)) { + // if something happened, it was a change message to baz. + // if nothing did, canon is still bar. + test.length(maybeResults, 1); + test.equal(maybeResults[0], {fun: 'changed', id: "A1", changed: {foo: "baz"}}); + canon = "baz"; + } + v.changed("B", "A1", {foo: canon}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - new field of canonical value produces no change', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + + v.added("B", "A1", {}); + + v.changed("B", "A1", {foo: "bar"}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - clear all clears only once', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.added("B", "A1", {foo: "bar"}); + v.added("C", "A1", {foo: "bar"}); + v.changed("A", "A1", {foo: undefined}); + v.changed("B", "A1", {foo: undefined}); + v.changed("C", "A1", {foo: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: undefined}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - change all changes only once', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar"}}); + v.expectNoResult(); + + v.added("B", "A1", {foo: "bar"}); + v.added("C", "A1", {foo: "bar"}); + v.changed("B", "A1", {foo: "baz"}); + v.changed("A", "A1", {foo: "baz"}); + v.changed("C", "A1", {foo: "baz"}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz"}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - multiple operations at once in a change', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar", baz: "quux"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar", baz: "quux"}}); + v.expectNoResult(); + + + v.added("B", "A1", {foo: "baz"}); + v.changed("A", "A1", {thing: "stuff", foo: undefined, baz: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz", thing: "stuff", baz: undefined}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'changed', id: "A1", changed: {thing: undefined}}); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - more than one document', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar", baz: "quux"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar", baz: "quux"}}); + v.expectNoResult(); + + + v.added("A", "A2", {foo: "baz"}); + v.expectResult({fun: 'added', id: "A2", fields: {foo: "baz"}}); + v.changed("A", "A1", {thing: "stuff", foo: undefined, baz: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {thing: "stuff", foo: undefined, baz: undefined}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); + v.removed("A", "A2"); + v.expectResult({fun: 'removed', id: "A2"}); + v.expectNoResult(); + +}); + +Tinytest.add('livedata - sessionview - multiple docs removed', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar", baz: "quux"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar", baz: "quux"}}); + v.expectNoResult(); + + + v.added("A", "A2", {foo: "baz"}); + v.expectResult({fun: 'added', id: "A2", fields: {foo: "baz"}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.removed("A", "A2"); + v.expectResult({fun: 'removed', id: "A2"}); + v.expectNoResult(); +}); + + +Tinytest.add('livedata - sessionview - complicated sequence', function (test) { + var v = newView(test); + + v.added("A", "A1", {foo: "bar", baz: "quux"}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: "bar", baz: "quux"}}); + v.expectNoResult(); + + v.added("A", "A2", {foo: "eats"}); + v.expectResult({fun: 'added', id: "A2", fields: {foo: "eats"}}); + + v.added("B", "A1", {foo: "baz"}); + v.changed("A", "A1", {thing: "stuff", foo: undefined, baz: undefined}); + v.expectResult({fun: 'changed', id: "A1", changed: {foo: "baz", thing: "stuff", baz: undefined}}); + v.expectNoResult(); + + v.removed("A", "A1"); + v.removed("A", "A2"); + v.expectResult({fun: 'changed', id: "A1", changed: {thing: undefined}}); + v.expectResult({fun: 'removed', id: "A2"}); + v.expectNoResult(); + v.removed("B", "A1"); + v.expectResult({fun: 'removed', id: "A1"}); + v.expectNoResult(); +}); + +Tinytest.add('livedata - sessionview - added becomes changed', function (test) { + var v = newView(test); + + v.added('A', "A1", {foo: 'bar'}); + v.expectResult({fun: 'added', id: "A1", fields: {foo: 'bar'}}); + + v.added('B', "A1", {hi: 'there'}); + v.expectResult({fun: 'changed', id: 'A1', changed: {hi: 'there'}}); + + v.removed('A', 'A1'); + v.expectResult({fun: 'changed', id: 'A1', changed: {foo: undefined}}); + + v.removed('B', 'A1'); + v.expectResult({fun: 'removed', id: 'A1'}); +}); + +Tinytest.add('livedata - sessionview - weird key names', function (test) { + var v = newView(test); + + v.added('A', "A1", {}); + v.expectResult({fun: 'added', id: "A1", fields: {}}); + + v.changed('A', "A1", {constructor: 'bla'}); + v.expectResult({fun: 'changed', id: 'A1', changed: {constructor: 'bla'}}); +}); + +Tinytest.add('livedata - sessionview - clear undefined value', function (test) { + var v = newView(test); + + v.added("A", "A1", {field: "value"}); + v.expectResult({fun: 'added', id: "A1", fields: {field: "value"}}); + v.expectNoResult(); + + v.changed("A", "A1", {field: undefined}); + v.expectResult({fun: 'changed', id: 'A1', changed: {field: undefined}}); + v.expectNoResult(); + + v.changed("A", "A1", {field: undefined}); + v.expectNoResult(); + +}); diff --git a/creator/packages/ddp-server/stream_server.js b/creator/packages/ddp-server/stream_server.js new file mode 100644 index 0000000000..1996d9088c --- /dev/null +++ b/creator/packages/ddp-server/stream_server.js @@ -0,0 +1,184 @@ +var url = Npm.require('url'); + +// By default, we use the permessage-deflate extension with default +// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid +// JSON. If it represents a falsey value, then we do not use permessage-deflate +// at all; otherwise, the JSON value is used as an argument to deflate's +// configure method; see +// https://github.com/faye/permessage-deflate-node/blob/master/README.md +// +// (We do this in an _.once instead of at startup, because we don't want to +// crash the tool during isopacket load if your JSON doesn't parse. This is only +// a problem because the tool has to load the DDP server code just in order to +// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .) +var websocketExtensions = _.once(function () { + var extensions = []; + + var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION + ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {}; + if (websocketCompressionConfig) { + extensions.push(Npm.require('permessage-deflate').configure( + websocketCompressionConfig + )); + } + + return extensions; +}); + +var pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; + +StreamServer = function () { + var self = this; + self.registration_callbacks = []; + self.open_sockets = []; + + // Because we are installing directly onto WebApp.httpServer instead of using + // WebApp.app, we have to process the path prefix ourselves. + self.prefix = pathPrefix + '/sockjs'; + RoutePolicy.declare(self.prefix + '/', 'network'); + + // set up sockjs + var sockjs = Npm.require('sockjs'); + var serverOptions = { + prefix: self.prefix, + log: function() {}, + // this is the default, but we code it explicitly because we depend + // on it in stream_client:HEARTBEAT_TIMEOUT + heartbeat_delay: 45000, + // The default disconnect_delay is 5 seconds, but if the server ends up CPU + // bound for that much time, SockJS might not notice that the user has + // reconnected because the timer (of disconnect_delay ms) can fire before + // SockJS processes the new connection. Eventually we'll fix this by not + // combining CPU-heavy processing with SockJS termination (eg a proxy which + // converts to Unix sockets) but for now, raise the delay. + disconnect_delay: 60 * 1000, + // Set the USE_JSESSIONID environment variable to enable setting the + // JSESSIONID cookie. This is useful for setting up proxies with + // session affinity. + jsessionid: !!process.env.USE_JSESSIONID + }; + + // If you know your server environment (eg, proxies) will prevent websockets + // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie, + // browsers) will not waste time attempting to use them. + // (Your server will still have a /websocket endpoint.) + if (process.env.DISABLE_WEBSOCKETS) { + serverOptions.websocket = false; + } else { + serverOptions.faye_server_options = { + extensions: websocketExtensions() + }; + } + + self.server = sockjs.createServer(serverOptions); + + // Install the sockjs handlers, but we want to keep around our own particular + // request handler that adjusts idle timeouts while we have an outstanding + // request. This compensates for the fact that sockjs removes all listeners + // for "request" to add its own. + WebApp.httpServer.removeListener( + 'request', WebApp._timeoutAdjustmentRequestCallback); + self.server.installHandlers(WebApp.httpServer); + WebApp.httpServer.addListener( + 'request', WebApp._timeoutAdjustmentRequestCallback); + + // Support the /websocket endpoint + self._redirectWebsocketEndpoint(); + + self.server.on('connection', function (socket) { + // We want to make sure that if a client connects to us and does the initial + // Websocket handshake but never gets to the DDP handshake, that we + // eventually kill the socket. Once the DDP handshake happens, DDP + // heartbeating will work. And before the Websocket handshake, the timeouts + // we set at the server level in webapp_server.js will work. But + // faye-websocket calls setTimeout(0) on any socket it takes over, so there + // is an "in between" state where this doesn't happen. We work around this + // by explicitly setting the socket timeout to a relatively large time here, + // and setting it back to zero when we set up the heartbeat in + // livedata_server.js. + socket.setWebsocketTimeout = function (timeout) { + if ((socket.protocol === 'websocket' || + socket.protocol === 'websocket-raw') + && socket._session.recv) { + socket._session.recv.connection.setTimeout(timeout); + } + }; + socket.setWebsocketTimeout(45 * 1000); + + socket.send = function (data) { + socket.write(data); + }; + socket.on('close', function () { + self.open_sockets = _.without(self.open_sockets, socket); + }); + self.open_sockets.push(socket); + + // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which + // will force old clients to reload. Remove this once we're not + // concerned about people upgrading from a pre-0.7.0 release. Also, + // remove the clause in the client that ignores the welcome message + // (livedata_connection.js) + socket.send(JSON.stringify({server_id: "0"})); + + // call all our callbacks when we get a new socket. they will do the + // work of setting up handlers and such for specific messages. + _.each(self.registration_callbacks, function (callback) { + callback(socket); + }); + }); + +}; + +_.extend(StreamServer.prototype, { + // call my callback when a new socket connects. + // also call it for all current connections. + register: function (callback) { + var self = this; + self.registration_callbacks.push(callback); + _.each(self.all_sockets(), function (socket) { + callback(socket); + }); + }, + + // get a list of all sockets + all_sockets: function () { + var self = this; + return _.values(self.open_sockets); + }, + + // Redirect /websocket to /sockjs/websocket in order to not expose + // sockjs to clients that want to use raw websockets + _redirectWebsocketEndpoint: function() { + var self = this; + // Unfortunately we can't use a connect middleware here since + // sockjs installs itself prior to all existing listeners + // (meaning prior to any connect middlewares) so we need to take + // an approach similar to overshadowListeners in + // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee + _.each(['request', 'upgrade'], function(event) { + var httpServer = WebApp.httpServer; + var oldHttpServerListeners = httpServer.listeners(event).slice(0); + httpServer.removeAllListeners(event); + + // request and upgrade have different arguments passed but + // we only care about the first one which is always request + var newListener = function(request /*, moreArguments */) { + // Store arguments for use within the closure below + var args = arguments; + + // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while + // preserving query string. + var parsedUrl = url.parse(request.url); + if (parsedUrl.pathname === pathPrefix + '/websocket' || + parsedUrl.pathname === pathPrefix + '/websocket/') { + parsedUrl.pathname = self.prefix + '/websocket'; + request.url = url.format(parsedUrl); + } + _.each(oldHttpServerListeners, function(oldListener) { + oldListener.apply(httpServer, args); + }); + }; + httpServer.addListener(event, newListener); + }); + } +}); diff --git a/creator/packages/ddp-server/writefence.js b/creator/packages/ddp-server/writefence.js new file mode 100644 index 0000000000..e9310c9f7f --- /dev/null +++ b/creator/packages/ddp-server/writefence.js @@ -0,0 +1,131 @@ +var Future = Npm.require('fibers/future'); + +// A write fence collects a group of writes, and provides a callback +// when all of the writes are fully committed and propagated (all +// observers have been notified of the write and acknowledged it.) +// +DDPServer._WriteFence = function () { + var self = this; + + self.armed = false; + self.fired = false; + self.retired = false; + self.outstanding_writes = 0; + self.before_fire_callbacks = []; + self.completion_callbacks = []; +}; + +// The current write fence. When there is a current write fence, code +// that writes to databases should register their writes with it using +// beginWrite(). +// +DDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable; + +_.extend(DDPServer._WriteFence.prototype, { + // Start tracking a write, and return an object to represent it. The + // object has a single method, committed(). This method should be + // called when the write is fully committed and propagated. You can + // continue to add writes to the WriteFence up until it is triggered + // (calls its callbacks because all writes have committed.) + beginWrite: function () { + var self = this; + + if (self.retired) + return { committed: function () {} }; + + if (self.fired) + throw new Error("fence has already activated -- too late to add writes"); + + self.outstanding_writes++; + var committed = false; + return { + committed: function () { + if (committed) + throw new Error("committed called twice on the same write"); + committed = true; + self.outstanding_writes--; + self._maybeFire(); + } + }; + }, + + // Arm the fence. Once the fence is armed, and there are no more + // uncommitted writes, it will activate. + arm: function () { + var self = this; + if (self === DDPServer._CurrentWriteFence.get()) + throw Error("Can't arm the current fence"); + self.armed = true; + self._maybeFire(); + }, + + // Register a function to be called once before firing the fence. + // Callback function can add new writes to the fence, in which case + // it won't fire until those writes are done as well. + onBeforeFire: function (func) { + var self = this; + if (self.fired) + throw new Error("fence has already activated -- too late to " + + "add a callback"); + self.before_fire_callbacks.push(func); + }, + + // Register a function to be called when the fence fires. + onAllCommitted: function (func) { + var self = this; + if (self.fired) + throw new Error("fence has already activated -- too late to " + + "add a callback"); + self.completion_callbacks.push(func); + }, + + // Convenience function. Arms the fence, then blocks until it fires. + armAndWait: function () { + var self = this; + var future = new Future; + self.onAllCommitted(function () { + future['return'](); + }); + self.arm(); + future.wait(); + }, + + _maybeFire: function () { + var self = this; + if (self.fired) + throw new Error("write fence already activated?"); + if (self.armed && !self.outstanding_writes) { + function invokeCallback (func) { + try { + func(self); + } catch (err) { + Meteor._debug("exception in write fence callback", err); + } + } + + self.outstanding_writes++; + while (self.before_fire_callbacks.length > 0) { + var callbacks = self.before_fire_callbacks; + self.before_fire_callbacks = []; + _.each(callbacks, invokeCallback); + } + self.outstanding_writes--; + + if (!self.outstanding_writes) { + self.fired = true; + var callbacks = self.completion_callbacks; + self.completion_callbacks = []; + _.each(callbacks, invokeCallback); + } + } + }, + + // Deactivate this fence so that adding more writes has no effect. + // The fence must have already fired. + retire: function () { + var self = this; + if (! self.fired) + throw new Error("Can't retire a fence that hasn't fired."); + self.retired = true; + } +}); diff --git a/server/bundle/programs/server/packages/ddp-server.js b/server/bundle/programs/server/packages/ddp-server.js index 7ac14f117c..4cd5085e6d 100644 --- a/server/bundle/programs/server/packages/ddp-server.js +++ b/server/bundle/programs/server/packages/ddp-server.js @@ -1854,7 +1854,7 @@ var wrapInternalException = function (exception, context) { if (!exception._expectedByTest) { - Meteor._debug("Exception " + context, exception); + Meteor._debug("Exception " + context, exception.stack); if (exception.sanitizedError) { Meteor._debug("Sanitized and reported to the client as:", exception.sanitizedError); @@ -2245,4 +2245,4 @@ Package._define("ddp-server", { })(); //# sourceURL=meteor://💻app/packages/ddp-server.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJqc2Vzc2lvbmlkIiwiVVNFX0pTRVNTSU9OSUQiLCJESVNBQkxFX1dFQlNPQ0tFVFMiLCJ3ZWJzb2NrZXQiLCJmYXllX3NlcnZlcl9vcHRpb25zIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiV2ViQXBwIiwiaHR0cFNlcnZlciIsInJlbW92ZUxpc3RlbmVyIiwiX3RpbWVvdXRBZGp1c3RtZW50UmVxdWVzdENhbGxiYWNrIiwiaW5zdGFsbEhhbmRsZXJzIiwiYWRkTGlzdGVuZXIiLCJfcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCIsIm9uIiwic29ja2V0Iiwic2V0V2Vic29ja2V0VGltZW91dCIsInRpbWVvdXQiLCJwcm90b2NvbCIsIl9zZXNzaW9uIiwicmVjdiIsImNvbm5lY3Rpb24iLCJzZXRUaW1lb3V0Iiwic2VuZCIsImRhdGEiLCJ3cml0ZSIsIndpdGhvdXQiLCJzdHJpbmdpZnkiLCJzZXJ2ZXJfaWQiLCJlYWNoIiwiY2FsbGJhY2siLCJleHRlbmQiLCJwcm90b3R5cGUiLCJyZWdpc3RlciIsImFsbF9zb2NrZXRzIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIdHRwU2VydmVyTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwic2xpY2UiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJuZXdMaXN0ZW5lciIsInJlcXVlc3QiLCJhcmdzIiwiYXJndW1lbnRzIiwicGFyc2VkVXJsIiwicGF0aG5hbWUiLCJmb3JtYXQiLCJvbGRMaXN0ZW5lciIsImFwcGx5IiwiRERQU2VydmVyIiwiRmliZXIiLCJTZXNzaW9uRG9jdW1lbnRWaWV3IiwiZXhpc3RzSW4iLCJTZXQiLCJkYXRhQnlLZXkiLCJNYXAiLCJfU2Vzc2lvbkRvY3VtZW50VmlldyIsImdldEZpZWxkcyIsInJldCIsImZvckVhY2giLCJwcmVjZWRlbmNlTGlzdCIsImtleSIsInZhbHVlIiwiY2xlYXJGaWVsZCIsInN1YnNjcmlwdGlvbkhhbmRsZSIsImNoYW5nZUNvbGxlY3RvciIsImdldCIsInJlbW92ZWRWYWx1ZSIsInVuZGVmaW5lZCIsImkiLCJsZW5ndGgiLCJwcmVjZWRlbmNlIiwic3BsaWNlIiwiZGVsZXRlIiwiRUpTT04iLCJlcXVhbHMiLCJjaGFuZ2VGaWVsZCIsImlzQWRkIiwiY2xvbmUiLCJoYXMiLCJzZXQiLCJlbHQiLCJmaW5kIiwiU2Vzc2lvbkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbk5hbWUiLCJzZXNzaW9uQ2FsbGJhY2tzIiwiZG9jdW1lbnRzIiwiY2FsbGJhY2tzIiwiX1Nlc3Npb25Db2xsZWN0aW9uVmlldyIsImlzRW1wdHkiLCJzaXplIiwiZGlmZiIsInByZXZpb3VzIiwiRGlmZlNlcXVlbmNlIiwiZGlmZk1hcHMiLCJib3RoIiwiYmluZCIsImRpZmZEb2N1bWVudCIsInJpZ2h0T25seSIsImlkIiwibm93RFYiLCJhZGRlZCIsImxlZnRPbmx5IiwicHJldkRWIiwicmVtb3ZlZCIsImZpZWxkcyIsImRpZmZPYmplY3RzIiwicHJldiIsIm5vdyIsImNoYW5nZWQiLCJkb2NWaWV3IiwiYWRkIiwiY2hhbmdlZFJlc3VsdCIsIkVycm9yIiwiZXJyIiwiU2Vzc2lvbiIsInZlcnNpb24iLCJvcHRpb25zIiwiUmFuZG9tIiwiaW5pdGlhbGl6ZWQiLCJpblF1ZXVlIiwiTWV0ZW9yIiwiX0RvdWJsZUVuZGVkUXVldWUiLCJibG9ja2VkIiwid29ya2VyUnVubmluZyIsIl9uYW1lZFN1YnMiLCJfdW5pdmVyc2FsU3VicyIsInVzZXJJZCIsImNvbGxlY3Rpb25WaWV3cyIsIl9pc1NlbmRpbmciLCJfZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyIsIl9wZW5kaW5nUmVhZHkiLCJfY2xvc2VDYWxsYmFja3MiLCJfc29ja2V0VXJsIiwiX3Jlc3BvbmRUb1BpbmdzIiwicmVzcG9uZFRvUGluZ3MiLCJjb25uZWN0aW9uSGFuZGxlIiwiY2xvc2UiLCJvbkNsb3NlIiwiZm4iLCJjYiIsImJpbmRFbnZpcm9ubWVudCIsImRlZmVyIiwiY2xpZW50QWRkcmVzcyIsIl9jbGllbnRBZGRyZXNzIiwiaHR0cEhlYWRlcnMiLCJoZWFkZXJzIiwibXNnIiwic2Vzc2lvbiIsInN0YXJ0VW5pdmVyc2FsU3VicyIsInJ1biIsImhlYXJ0YmVhdEludGVydmFsIiwiaGVhcnRiZWF0IiwiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiaGVhcnRiZWF0VGltZW91dCIsIm9uVGltZW91dCIsInNlbmRQaW5nIiwic3RhcnQiLCJQYWNrYWdlIiwiRmFjdHMiLCJpbmNyZW1lbnRTZXJ2ZXJGYWN0Iiwic2VuZFJlYWR5Iiwic3Vic2NyaXB0aW9uSWRzIiwic3VicyIsInN1YnNjcmlwdGlvbklkIiwic2VuZEFkZGVkIiwiY29sbGVjdGlvbiIsInNlbmRDaGFuZ2VkIiwic2VuZFJlbW92ZWQiLCJnZXRTZW5kQ2FsbGJhY2tzIiwiZ2V0Q29sbGVjdGlvblZpZXciLCJ2aWV3IiwiaGFuZGxlcnMiLCJ1bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyIsImhhbmRsZXIiLCJfc3RhcnRTdWJzY3JpcHRpb24iLCJzdG9wIiwiX21ldGVvclNlc3Npb24iLCJfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMiLCJfcmVtb3ZlU2Vzc2lvbiIsIl9wcmludFNlbnRERFAiLCJfZGVidWciLCJzdHJpbmdpZnlERFAiLCJzZW5kRXJyb3IiLCJyZWFzb24iLCJvZmZlbmRpbmdNZXNzYWdlIiwicHJvY2Vzc01lc3NhZ2UiLCJtc2dfaW4iLCJtZXNzYWdlUmVjZWl2ZWQiLCJwcm9jZXNzTmV4dCIsInNoaWZ0IiwidW5ibG9jayIsIm9uTWVzc2FnZUhvb2siLCJwcm90b2NvbF9oYW5kbGVycyIsImNhbGwiLCJzdWIiLCJuYW1lIiwicGFyYW1zIiwiQXJyYXkiLCJwdWJsaXNoX2hhbmRsZXJzIiwiZXJyb3IiLCJERFBSYXRlTGltaXRlciIsInJhdGVMaW1pdGVySW5wdXQiLCJ0eXBlIiwiY29ubmVjdGlvbklkIiwiX2luY3JlbWVudCIsInJhdGVMaW1pdFJlc3VsdCIsIl9jaGVjayIsImFsbG93ZWQiLCJnZXRFcnJvck1lc3NhZ2UiLCJ0aW1lVG9SZXNldCIsInVuc3ViIiwiX3N0b3BTdWJzY3JpcHRpb24iLCJtZXRob2QiLCJyYW5kb21TZWVkIiwiZmVuY2UiLCJfV3JpdGVGZW5jZSIsIm9uQWxsQ29tbWl0dGVkIiwicmV0aXJlIiwibWV0aG9kcyIsIm1ldGhvZF9oYW5kbGVycyIsImFybSIsInNldFVzZXJJZCIsIl9zZXRVc2VySWQiLCJpbnZvY2F0aW9uIiwiTWV0aG9kSW52b2NhdGlvbiIsImlzU2ltdWxhdGlvbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9DdXJyZW50V3JpdGVGZW5jZSIsIndpdGhWYWx1ZSIsIkREUCIsIl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsIm1heWJlQXVkaXRBcmd1bWVudENoZWNrcyIsImZpbmlzaCIsInBheWxvYWQiLCJ0aGVuIiwicmVzdWx0IiwiZXhjZXB0aW9uIiwid3JhcEludGVybmFsRXhjZXB0aW9uIiwiX2VhY2hTdWIiLCJmIiwiX2RpZmZDb2xsZWN0aW9uVmlld3MiLCJiZWZvcmVDVnMiLCJsZWZ0VmFsdWUiLCJyaWdodFZhbHVlIiwiZG9jIiwiX2RlYWN0aXZhdGUiLCJvbGROYW1lZFN1YnMiLCJuZXdTdWIiLCJfcmVjcmVhdGUiLCJfcnVuSGFuZGxlciIsIl9ub1lpZWxkc0FsbG93ZWQiLCJzdWJJZCIsIlN1YnNjcmlwdGlvbiIsInN1Yk5hbWUiLCJtYXliZVN1YiIsIl9uYW1lIiwiX3JlbW92ZUFsbERvY3VtZW50cyIsInJlc3BvbnNlIiwiaHR0cEZvcndhcmRlZENvdW50IiwicGFyc2VJbnQiLCJyZW1vdGVBZGRyZXNzIiwiZm9yd2FyZGVkRm9yIiwiaXNTdHJpbmciLCJ0cmltIiwic3BsaXQiLCJfaGFuZGxlciIsIl9zdWJzY3JpcHRpb25JZCIsIl9wYXJhbXMiLCJfc3Vic2NyaXB0aW9uSGFuZGxlIiwiX2RlYWN0aXZhdGVkIiwiX3N0b3BDYWxsYmFja3MiLCJfZG9jdW1lbnRzIiwiX3JlYWR5IiwiX2lkRmlsdGVyIiwiaWRTdHJpbmdpZnkiLCJNb25nb0lEIiwiaWRQYXJzZSIsInJlcyIsIl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIiwiZSIsIl9pc0RlYWN0aXZhdGVkIiwiX3B1Ymxpc2hIYW5kbGVyUmVzdWx0IiwiaXNDdXJzb3IiLCJjIiwiX3B1Ymxpc2hDdXJzb3IiLCJyZWFkeSIsImlzQXJyYXkiLCJhbGwiLCJjb2xsZWN0aW9uTmFtZXMiLCJfZ2V0Q29sbGVjdGlvbk5hbWUiLCJjdXIiLCJfY2FsbFN0b3BDYWxsYmFja3MiLCJjb2xsZWN0aW9uRG9jcyIsInN0cklkIiwib25TdG9wIiwiaWRzIiwiU2VydmVyIiwiZGVmYXVsdHMiLCJvbkNvbm5lY3Rpb25Ib29rIiwiSG9vayIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwic2Vzc2lvbnMiLCJzdHJlYW1fc2VydmVyIiwicmF3X21zZyIsIl9wcmludFJlY2VpdmVkRERQIiwicGFyc2VERFAiLCJfaGFuZGxlQ29ubmVjdCIsIm9uQ29ubmVjdGlvbiIsIm9uTWVzc2FnZSIsInN1cHBvcnQiLCJjb250YWlucyIsIlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMiLCJjYWxjdWxhdGVWZXJzaW9uIiwicHVibGlzaCIsImlzT2JqZWN0IiwiYXV0b3B1Ymxpc2giLCJpc19hdXRvIiwid2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoIiwiZnVuYyIsInBvcCIsImNhbGxBc3luYyIsImFwcGx5QXN5bmMiLCJhd2FpdCIsImN1cnJlbnRNZXRob2RJbnZvY2F0aW9uIiwiY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsIm1ha2VScGNTZWVkIiwiX3VybEZvclNlc3Npb24iLCJzZXNzaW9uSWQiLCJjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyIsInNlcnZlclN1cHBvcnRlZFZlcnNpb25zIiwiY29ycmVjdFZlcnNpb24iLCJfY2FsY3VsYXRlVmVyc2lvbiIsImNvbnRleHQiLCJpc0NsaWVudFNhZmUiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtZXNzYWdlIiwiZGV0YWlscyIsIl9leHBlY3RlZEJ5VGVzdCIsInNhbml0aXplZEVycm9yIiwiZGVzY3JpcHRpb24iLCJNYXRjaCIsIl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkIiwiRnV0dXJlIiwiYXJtZWQiLCJmaXJlZCIsInJldGlyZWQiLCJvdXRzdGFuZGluZ193cml0ZXMiLCJiZWZvcmVfZmlyZV9jYWxsYmFja3MiLCJjb21wbGV0aW9uX2NhbGxiYWNrcyIsIkVudmlyb25tZW50VmFyaWFibGUiLCJiZWdpbldyaXRlIiwiY29tbWl0dGVkIiwiX21heWJlRmlyZSIsIm9uQmVmb3JlRmlyZSIsImFybUFuZFdhaXQiLCJmdXR1cmUiLCJ3YWl0IiwiaW52b2tlQ2FsbGJhY2siLCJfQ3Jvc3NiYXIiLCJuZXh0SWQiLCJsaXN0ZW5lcnNCeUNvbGxlY3Rpb24iLCJsaXN0ZW5lcnNCeUNvbGxlY3Rpb25Db3VudCIsImZhY3RQYWNrYWdlIiwiZmFjdE5hbWUiLCJfY29sbGVjdGlvbkZvck1lc3NhZ2UiLCJsaXN0ZW4iLCJ0cmlnZ2VyIiwicmVjb3JkIiwiZmlyZSIsIm5vdGlmaWNhdGlvbiIsImxpc3RlbmVyc0ZvckNvbGxlY3Rpb24iLCJjYWxsYmFja0lkcyIsImwiLCJfbWF0Y2hlcyIsIk9iamVjdElEIiwidHJpZ2dlclZhbHVlIiwiX0ludmFsaWRhdGlvbkNyb3NzYmFyIiwiRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwiLCJyZWZyZXNoIiwiZGVmYXVsdF9zZXJ2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUlBLEdBQUcsR0FBR0MsR0FBRyxDQUFDQyxPQUFKLENBQVksS0FBWixDQUFWLEMsQ0FFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFJQyxtQkFBbUIsR0FBR0MsQ0FBQyxDQUFDQyxJQUFGLENBQU8sWUFBWTtBQUMzQyxNQUFJQyxVQUFVLEdBQUcsRUFBakI7QUFFQSxNQUFJQywwQkFBMEIsR0FBR0MsT0FBTyxDQUFDQyxHQUFSLENBQVlDLDRCQUFaLEdBQ3pCQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0osT0FBTyxDQUFDQyxHQUFSLENBQVlDLDRCQUF2QixDQUR5QixHQUM4QixFQUQvRDs7QUFFQSxNQUFJSCwwQkFBSixFQUFnQztBQUM5QkQsY0FBVSxDQUFDTyxJQUFYLENBQWdCWixHQUFHLENBQUNDLE9BQUosQ0FBWSxvQkFBWixFQUFrQ1ksU0FBbEMsQ0FDZFAsMEJBRGMsQ0FBaEI7QUFHRDs7QUFFRCxTQUFPRCxV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QUF3QjtBQUN2Q3JVLFdBQVMsQ0FBQzRVLHFCQUFWLENBQWdDUixJQUFoQyxDQUFxQ0MsWUFBckM7QUFDRCxDQUZELEMsQ0FJQTtBQUNBOzs7QUFDQWpaLENBQUMsQ0FBQ3VELElBQUYsQ0FBTyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCLE9BQS9CLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELENBQVAsRUFDTyxVQUFVeUssSUFBVixFQUFnQjtBQUNkNUUsUUFBTSxDQUFDNEUsSUFBRCxDQUFOLEdBQWVoTyxDQUFDLENBQUMySCxJQUFGLENBQU95QixNQUFNLENBQUNySCxNQUFQLENBQWNpTSxJQUFkLENBQVAsRUFBNEI1RSxNQUFNLENBQUNySCxNQUFuQyxDQUFmO0FBQ0QsQ0FIUixFLENBS0E7QUFDQTtBQUNBOzs7QUFDQXFILE1BQU0sQ0FBQ3VRLGNBQVAsR0FBd0J2USxNQUFNLENBQUNySCxNQUEvQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9kZHAtc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHVybCA9IE5wbS5yZXF1aXJlKCd1cmwnKTtcblxuLy8gQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBwZXJtZXNzYWdlLWRlZmxhdGUgZXh0ZW5zaW9uIHdpdGggZGVmYXVsdFxuLy8gY29uZmlndXJhdGlvbi4gSWYgJFNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04gaXMgc2V0LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRcbi8vIEpTT04uIElmIGl0IHJlcHJlc2VudHMgYSBmYWxzZXkgdmFsdWUsIHRoZW4gd2UgZG8gbm90IHVzZSBwZXJtZXNzYWdlLWRlZmxhdGVcbi8vIGF0IGFsbDsgb3RoZXJ3aXNlLCB0aGUgSlNPTiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGRlZmxhdGUnc1xuLy8gY29uZmlndXJlIG1ldGhvZDsgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmF5ZS9wZXJtZXNzYWdlLWRlZmxhdGUtbm9kZS9ibG9iL21hc3Rlci9SRUFETUUubWRcbi8vXG4vLyAoV2UgZG8gdGhpcyBpbiBhbiBfLm9uY2UgaW5zdGVhZCBvZiBhdCBzdGFydHVwLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG9cbi8vIGNyYXNoIHRoZSB0b29sIGR1cmluZyBpc29wYWNrZXQgbG9hZCBpZiB5b3VyIEpTT04gZG9lc24ndCBwYXJzZS4gVGhpcyBpcyBvbmx5XG4vLyBhIHByb2JsZW0gYmVjYXVzZSB0aGUgdG9vbCBoYXMgdG8gbG9hZCB0aGUgRERQIHNlcnZlciBjb2RlIGp1c3QgaW4gb3JkZXIgdG9cbi8vIGJlIGEgRERQIGNsaWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRlb3IvbWV0ZW9yL2lzc3Vlcy8zNDUyIC4pXG52YXIgd2Vic29ja2V0RXh0ZW5zaW9ucyA9IF8ub25jZShmdW5jdGlvbiAoKSB7XG4gIHZhciBleHRlbnNpb25zID0gW107XG5cbiAgdmFyIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnID0gcHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTlxuICAgICAgICA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTikgOiB7fTtcbiAgaWYgKHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnKSB7XG4gICAgZXh0ZW5zaW9ucy5wdXNoKE5wbS5yZXF1aXJlKCdwZXJtZXNzYWdlLWRlZmxhdGUnKS5jb25maWd1cmUoXG4gICAgICB3ZWJzb2NrZXRDb21wcmVzc2lvbkNvbmZpZ1xuICAgICkpO1xuICB9XG5cbiAgcmV0dXJuIGV4dGVuc2lvbnM7XG59KTtcblxudmFyIHBhdGhQcmVmaXggPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYIHx8ICBcIlwiO1xuXG5TdHJlYW1TZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzID0gW107XG4gIHNlbGYub3Blbl9zb2NrZXRzID0gW107XG5cbiAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zdGFsbGluZyBkaXJlY3RseSBvbnRvIFdlYkFwcC5odHRwU2VydmVyIGluc3RlYWQgb2YgdXNpbmdcbiAgLy8gV2ViQXBwLmFwcCwgd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBwYXRoIHByZWZpeCBvdXJzZWx2ZXMuXG4gIHNlbGYucHJlZml4ID0gcGF0aFByZWZpeCArICcvc29ja2pzJztcbiAgUm91dGVQb2xpY3kuZGVjbGFyZShzZWxmLnByZWZpeCArICcvJywgJ25ldHdvcmsnKTtcblxuICAvLyBzZXQgdXAgc29ja2pzXG4gIHZhciBzb2NranMgPSBOcG0ucmVxdWlyZSgnc29ja2pzJyk7XG4gIHZhciBzZXJ2ZXJPcHRpb25zID0ge1xuICAgIHByZWZpeDogc2VsZi5wcmVmaXgsXG4gICAgbG9nOiBmdW5jdGlvbigpIHt9LFxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBjb2RlIGl0IGV4cGxpY2l0bHkgYmVjYXVzZSB3ZSBkZXBlbmRcbiAgICAvLyBvbiBpdCBpbiBzdHJlYW1fY2xpZW50OkhFQVJUQkVBVF9USU1FT1VUXG4gICAgaGVhcnRiZWF0X2RlbGF5OiA0NTAwMCxcbiAgICAvLyBUaGUgZGVmYXVsdCBkaXNjb25uZWN0X2RlbGF5IGlzIDUgc2Vjb25kcywgYnV0IGlmIHRoZSBzZXJ2ZXIgZW5kcyB1cCBDUFVcbiAgICAvLyBib3VuZCBmb3IgdGhhdCBtdWNoIHRpbWUsIFNvY2tKUyBtaWdodCBub3Qgbm90aWNlIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgLy8gcmVjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdGltZXIgKG9mIGRpc2Nvbm5lY3RfZGVsYXkgbXMpIGNhbiBmaXJlIGJlZm9yZVxuICAgIC8vIFNvY2tKUyBwcm9jZXNzZXMgdGhlIG5ldyBjb25uZWN0aW9uLiBFdmVudHVhbGx5IHdlJ2xsIGZpeCB0aGlzIGJ5IG5vdFxuICAgIC8vIGNvbWJpbmluZyBDUFUtaGVhdnkgcHJvY2Vzc2luZyB3aXRoIFNvY2tKUyB0ZXJtaW5hdGlvbiAoZWcgYSBwcm94eSB3aGljaFxuICAgIC8vIGNvbnZlcnRzIHRvIFVuaXggc29ja2V0cykgYnV0IGZvciBub3csIHJhaXNlIHRoZSBkZWxheS5cbiAgICBkaXNjb25uZWN0X2RlbGF5OiA2MCAqIDEwMDAsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklEXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICAgJiYgc29ja2V0Ll9zZXNzaW9uLnJlY3YpIHtcbiAgICAgICAgc29ja2V0Ll9zZXNzaW9uLnJlY3YuY29ubmVjdGlvbi5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgc29ja2V0LnNldFdlYnNvY2tldFRpbWVvdXQoNDUgKiAxMDAwKTtcblxuICAgIHNvY2tldC5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHNvY2tldC53cml0ZShkYXRhKTtcbiAgICB9O1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9wZW5fc29ja2V0cyA9IF8ud2l0aG91dChzZWxmLm9wZW5fc29ja2V0cywgc29ja2V0KTtcbiAgICB9KTtcbiAgICBzZWxmLm9wZW5fc29ja2V0cy5wdXNoKHNvY2tldCk7XG5cbiAgICAvLyBYWFggQ09NUEFUIFdJVEggMC42LjYuIFNlbmQgdGhlIG9sZCBzdHlsZSB3ZWxjb21lIG1lc3NhZ2UsIHdoaWNoXG4gICAgLy8gd2lsbCBmb3JjZSBvbGQgY2xpZW50cyB0byByZWxvYWQuIFJlbW92ZSB0aGlzIG9uY2Ugd2UncmUgbm90XG4gICAgLy8gY29uY2VybmVkIGFib3V0IHBlb3BsZSB1cGdyYWRpbmcgZnJvbSBhIHByZS0wLjcuMCByZWxlYXNlLiBBbHNvLFxuICAgIC8vIHJlbW92ZSB0aGUgY2xhdXNlIGluIHRoZSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZSB3ZWxjb21lIG1lc3NhZ2VcbiAgICAvLyAobGl2ZWRhdGFfY29ubmVjdGlvbi5qcylcbiAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7c2VydmVyX2lkOiBcIjBcIn0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgYSBjb25uZWN0IG1pZGRsZXdhcmUgaGVyZSBzaW5jZVxuICAgIC8vIHNvY2tqcyBpbnN0YWxscyBpdHNlbGYgcHJpb3IgdG8gYWxsIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgIC8vIChtZWFuaW5nIHByaW9yIHRvIGFueSBjb25uZWN0IG1pZGRsZXdhcmVzKSBzbyB3ZSBuZWVkIHRvIHRha2VcbiAgICAvLyBhbiBhcHByb2FjaCBzaW1pbGFyIHRvIG92ZXJzaGFkb3dMaXN0ZW5lcnMgaW5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc29ja2pzL3NvY2tqcy1ub2RlL2Jsb2IvY2Y4MjBjNTVhZjZhOTk1M2UxNjU1ODU1NWEzMWRlY2VhNTU0ZjcwZS9zcmMvdXRpbHMuY29mZmVlXG4gICAgXy5lYWNoKFsncmVxdWVzdCcsICd1cGdyYWRlJ10sIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgaHR0cFNlcnZlciA9IFdlYkFwcC5odHRwU2VydmVyO1xuICAgICAgdmFyIG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMgPSBodHRwU2VydmVyLmxpc3RlbmVycyhldmVudCkuc2xpY2UoMCk7XG4gICAgICBodHRwU2VydmVyLnJlbW92ZUFsbExpc3RlbmVycyhldmVudCk7XG5cbiAgICAgIC8vIHJlcXVlc3QgYW5kIHVwZ3JhZGUgaGF2ZSBkaWZmZXJlbnQgYXJndW1lbnRzIHBhc3NlZCBidXRcbiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3Qgb25lIHdoaWNoIGlzIGFsd2F5cyByZXF1ZXN0XG4gICAgICB2YXIgbmV3TGlzdGVuZXIgPSBmdW5jdGlvbihyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgICBwYXJzZWRVcmwucGF0aG5hbWUgPT09IHBhdGhQcmVmaXggKyAnL3dlYnNvY2tldC8nKSB7XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID0gc2VsZi5wcmVmaXggKyAnL3dlYnNvY2tldCc7XG4gICAgICAgICAgcmVxdWVzdC51cmwgPSB1cmwuZm9ybWF0KHBhcnNlZFVybCk7XG4gICAgICAgIH1cbiAgICAgICAgXy5lYWNoKG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMsIGZ1bmN0aW9uKG9sZExpc3RlbmVyKSB7XG4gICAgICAgICAgb2xkTGlzdGVuZXIuYXBwbHkoaHR0cFNlcnZlciwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGh0dHBTZXJ2ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIG5ld0xpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufSk7XG4iLCJERFBTZXJ2ZXIgPSB7fTtcblxudmFyIEZpYmVyID0gTnBtLnJlcXVpcmUoJ2ZpYmVycycpO1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3Nlczpcbi8vICogU2Vzc2lvbiAtIFRoZSBzZXJ2ZXIncyBjb25uZWN0aW9uIHRvIGEgc2luZ2xlIEREUCBjbGllbnRcbi8vICogU3Vic2NyaXB0aW9uIC0gQSBzaW5nbGUgc3Vic2NyaXB0aW9uIGZvciBhIHNpbmdsZSBjbGllbnRcbi8vICogU2VydmVyIC0gQW4gZW50aXJlIHNlcnZlciB0aGF0IG1heSB0YWxrIHRvID4gMSBjbGllbnQuIEEgRERQIGVuZHBvaW50LlxuLy9cbi8vIFNlc3Npb24gYW5kIFN1YnNjcmlwdGlvbiBhcmUgZmlsZSBzY29wZS4gRm9yIG5vdywgdW50aWwgd2UgZnJlZXplXG4vLyB0aGUgaW50ZXJmYWNlLCBTZXJ2ZXIgaXMgcGFja2FnZSBzY29wZSAoaW4gdGhlIGZ1dHVyZSBpdCBzaG91bGQgYmVcbi8vIGV4cG9ydGVkLilcblxuLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBkb2N1bWVudCBpbiBhIFNlc3Npb25Db2xsZWN0aW9uVmlld1xudmFyIFNlc3Npb25Eb2N1bWVudFZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5leGlzdHNJbiA9IG5ldyBTZXQoKTsgLy8gc2V0IG9mIHN1YnNjcmlwdGlvbkhhbmRsZVxuICBzZWxmLmRhdGFCeUtleSA9IG5ldyBNYXAoKTsgLy8ga2V5LT4gWyB7c3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZX0gYnkgcHJlY2VkZW5jZV1cbn07XG5cbkREUFNlcnZlci5fU2Vzc2lvbkRvY3VtZW50VmlldyA9IFNlc3Npb25Eb2N1bWVudFZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkRvY3VtZW50Vmlldy5wcm90b3R5cGUsIHtcblxuICBnZXRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHNlbGYuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgIHJldFtrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBjbGVhckZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZUNvbGxlY3Rvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBQdWJsaXNoIEFQSSBpZ25vcmVzIF9pZCBpZiBwcmVzZW50IGluIGZpZWxkc1xuICAgIGlmIChrZXkgPT09IFwiX2lkXCIpXG4gICAgICByZXR1cm47XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAvLyBJdCdzIG9rYXkgdG8gY2xlYXIgZmllbGRzIHRoYXQgZGlkbid0IGV4aXN0LiBObyBuZWVkIHRvIHRocm93XG4gICAgLy8gYW4gZXJyb3IuXG4gICAgaWYgKCFwcmVjZWRlbmNlTGlzdClcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZW1vdmVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVjZWRlbmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlTGlzdFtpXTtcbiAgICAgIGlmIChwcmVjZWRlbmNlLnN1YnNjcmlwdGlvbkhhbmRsZSA9PT0gc3Vic2NyaXB0aW9uSGFuZGxlKSB7XG4gICAgICAgIC8vIFRoZSB2aWV3J3MgdmFsdWUgY2FuIG9ubHkgY2hhbmdlIGlmIHRoaXMgc3Vic2NyaXB0aW9uIGlzIHRoZSBvbmUgdGhhdFxuICAgICAgICAvLyB1c2VkIHRvIGhhdmUgcHJlY2VkZW5jZS5cbiAgICAgICAgaWYgKGkgPT09IDApXG4gICAgICAgICAgcmVtb3ZlZFZhbHVlID0gcHJlY2VkZW5jZS52YWx1ZTtcbiAgICAgICAgcHJlY2VkZW5jZUxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZWNlZGVuY2VMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAhRUpTT04uZXF1YWxzKHJlbW92ZWRWYWx1ZSwgcHJlY2VkZW5jZUxpc3RbMF0udmFsdWUpKSB7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHByZWNlZGVuY2VMaXN0WzBdLnZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VGaWVsZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VDb2xsZWN0b3IsIGlzQWRkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERvbid0IHNoYXJlIHN0YXRlIHdpdGggdGhlIGRhdGEgcGFzc2VkIGluIGJ5IHRoZSB1c2VyLlxuICAgIHZhbHVlID0gRUpTT04uY2xvbmUodmFsdWUpO1xuXG4gICAgaWYgKCFzZWxmLmRhdGFCeUtleS5oYXMoa2V5KSkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuc2V0KGtleSwgW3tzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlfV0pO1xuICAgICAgY2hhbmdlQ29sbGVjdG9yW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG4gICAgdmFyIGVsdDtcbiAgICBpZiAoIWlzQWRkKSB7XG4gICAgICBlbHQgPSBwcmVjZWRlbmNlTGlzdC5maW5kKGZ1bmN0aW9uIChwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZWx0KSB7XG4gICAgICBpZiAoZWx0ID09PSBwcmVjZWRlbmNlTGlzdFswXSAmJiAhRUpTT04uZXF1YWxzKHZhbHVlLCBlbHQudmFsdWUpKSB7XG4gICAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZWx0LnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIG5ld2x5IGNhcmluZyBhYm91dCB0aGlzIGZpZWxkXG4gICAgICBwcmVjZWRlbmNlTGlzdC5wdXNoKHtzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSwgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gIH1cbn0pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjbGllbnQncyB2aWV3IG9mIGEgc2luZ2xlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGl0IHJlcHJlc2VudHNcbiAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIEZ1bmN0aW9uPn0gc2Vzc2lvbkNhbGxiYWNrcyBUaGUgY2FsbGJhY2tzIGZvciBhZGRlZCwgY2hhbmdlZCwgcmVtb3ZlZFxuICogQGNsYXNzIFNlc3Npb25Db2xsZWN0aW9uVmlld1xuICovXG52YXIgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3ID0gZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBzZXNzaW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lO1xuICBzZWxmLmRvY3VtZW50cyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5jYWxsYmFja3MgPSBzZXNzaW9uQ2FsbGJhY2tzO1xufTtcblxuRERQU2VydmVyLl9TZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBTZXNzaW9uQ29sbGVjdGlvblZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkNvbGxlY3Rpb25WaWV3LnByb3RvdHlwZSwge1xuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuZG9jdW1lbnRzLnNpemUgPT09IDA7XG4gIH0sXG5cbiAgZGlmZjogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhwcmV2aW91cy5kb2N1bWVudHMsIHNlbGYuZG9jdW1lbnRzLCB7XG4gICAgICBib3RoOiBfLmJpbmQoc2VsZi5kaWZmRG9jdW1lbnQsIHNlbGYpLFxuXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChpZCwgbm93RFYpIHtcbiAgICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIG5vd0RWLmdldEZpZWxkcygpKTtcbiAgICAgIH0sXG5cbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoaWQsIHByZXZEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBkaWZmRG9jdW1lbnQ6IGZ1bmN0aW9uIChpZCwgcHJldkRWLCBub3dEVikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZmllbGRzID0ge307XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZPYmplY3RzKHByZXZEVi5nZXRGaWVsZHMoKSwgbm93RFYuZ2V0RmllbGRzKCksIHtcbiAgICAgIGJvdGg6IGZ1bmN0aW9uIChrZXksIHByZXYsIG5vdykge1xuICAgICAgICBpZiAoIUVKU09OLmVxdWFscyhwcmV2LCBub3cpKVxuICAgICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGtleSwgbm93KSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbihrZXksIHByZXYpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgdmFyIGFkZGVkID0gZmFsc2U7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgICBkb2NWaWV3ID0gbmV3IFNlc3Npb25Eb2N1bWVudFZpZXcoKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLnNldChpZCwgZG9jVmlldyk7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uYWRkKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgdmFyIGNoYW5nZUNvbGxlY3RvciA9IHt9O1xuICAgIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKFxuICAgICAgICBzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgdmFsdWUsIGNoYW5nZUNvbGxlY3RvciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgaWYgKGFkZGVkKVxuICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZUNvbGxlY3Rvcik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgY2hhbmdlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2hhbmdlZFJlc3VsdCA9IHt9O1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICBpZiAoIWRvY1ZpZXcpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBlbGVtZW50IHdpdGggaWQgXCIgKyBpZCArIFwiIHRvIGNoYW5nZVwiKTtcbiAgICBfLmVhY2goY2hhbmdlZCwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWRSZXN1bHQpO1xuICAgICAgZWxzZVxuICAgICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlZFJlc3VsdCk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldykge1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlJlbW92ZWQgbm9uZXhpc3RlbnQgZG9jdW1lbnQgXCIgKyBpZCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uZGVsZXRlKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgaWYgKGRvY1ZpZXcuZXhpc3RzSW4uc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gaXQgaXMgZ29uZSBmcm9tIGV2ZXJ5b25lXG4gICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGFuZ2VkID0ge307XG4gICAgICAvLyByZW1vdmUgdGhpcyBzdWJzY3JpcHRpb24gZnJvbSBldmVyeSBwcmVjZWRlbmNlIGxpc3RcbiAgICAgIC8vIGFuZCByZWNvcmQgdGhlIGNoYW5nZXNcbiAgICAgIGRvY1ZpZXcuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgICAgZG9jVmlldy5jbGVhckZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCBjaGFuZ2VkKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2Vzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbnZhciBTZXNzaW9uID0gZnVuY3Rpb24gKHNlcnZlciwgdmVyc2lvbiwgc29ja2V0LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5pZCA9IFJhbmRvbS5pZCgpO1xuXG4gIHNlbGYuc2VydmVyID0gc2VydmVyO1xuICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gIHNlbGYuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgc2VsZi5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgLy8gc2V0IHRvIG51bGwgd2hlbiB0aGUgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuIG11bHRpcGxlIHBsYWNlcyBiZWxvd1xuICAvLyB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlIHNlc3Npb24gaXMgYWxpdmUgb3Igbm90LlxuICBzZWxmLmluUXVldWUgPSBuZXcgTWV0ZW9yLl9Eb3VibGVFbmRlZFF1ZXVlKCk7XG5cbiAgc2VsZi5ibG9ja2VkID0gZmFsc2U7XG4gIHNlbGYud29ya2VyUnVubmluZyA9IGZhbHNlO1xuXG4gIC8vIFN1YiBvYmplY3RzIGZvciBhY3RpdmUgc3Vic2NyaXB0aW9uc1xuICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG4gIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICBzZWxmLnVzZXJJZCA9IG51bGw7XG5cbiAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgLy8gU2V0IHRoaXMgdG8gZmFsc2UgdG8gbm90IHNlbmQgbWVzc2FnZXMgd2hlbiBjb2xsZWN0aW9uVmlld3MgYXJlXG4gIC8vIG1vZGlmaWVkLiBUaGlzIGlzIGRvbmUgd2hlbiByZXJ1bm5pbmcgc3VicyBpbiBfc2V0VXNlcklkIGFuZCB0aG9zZSBtZXNzYWdlc1xuICAvLyBhcmUgY2FsY3VsYXRlZCB2aWEgYSBkaWZmIGluc3RlYWQuXG4gIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG5cbiAgLy8gSWYgdGhpcyBpcyB0cnVlLCBkb24ndCBzdGFydCBhIG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHB1Ymxpc2hlciBvbiB0aGlzXG4gIC8vIHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgdGFrZSBjYXJlIG9mIHN0YXJ0aW5nIGl0IHdoZW4gYXBwcm9wcmlhdGUuXG4gIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcblxuICAvLyB3aGVuIHdlIGFyZSByZXJ1bm5pbmcgc3Vic2NyaXB0aW9ucywgYW55IHJlYWR5IG1lc3NhZ2VzXG4gIC8vIHdlIHdhbnQgdG8gYnVmZmVyIHVwIGZvciB3aGVuIHdlIGFyZSBkb25lIHJlcnVubmluZyBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiB0aGlzIGNvbm5lY3Rpb24gaXMgY2xvc2VkLlxuICBzZWxmLl9jbG9zZUNhbGxiYWNrcyA9IFtdO1xuXG5cbiAgLy8gWFhYIEhBQ0s6IElmIGEgc29ja2pzIGNvbm5lY3Rpb24sIHNhdmUgb2ZmIHRoZSBVUkwuIFRoaXMgaXNcbiAgLy8gdGVtcG9yYXJ5IGFuZCB3aWxsIGdvIGF3YXkgaW4gdGhlIG5lYXIgZnV0dXJlLlxuICBzZWxmLl9zb2NrZXRVcmwgPSBzb2NrZXQudXJsO1xuXG4gIC8vIEFsbG93IHRlc3RzIHRvIGRpc2FibGUgcmVzcG9uZGluZyB0byBwaW5ncy5cbiAgc2VsZi5fcmVzcG9uZFRvUGluZ3MgPSBvcHRpb25zLnJlc3BvbmRUb1BpbmdzO1xuXG4gIC8vIFRoaXMgb2JqZWN0IGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBzZXNzaW9uLiBJbiB0aGUgcHVibGljXG4gIC8vIEFQSSwgaXQgaXMgY2FsbGVkIHRoZSBgY29ubmVjdGlvbmAgb2JqZWN0LiAgSW50ZXJuYWxseSB3ZSBjYWxsIGl0XG4gIC8vIGEgYGNvbm5lY3Rpb25IYW5kbGVgIHRvIGF2b2lkIGFtYmlndWl0eS5cbiAgc2VsZi5jb25uZWN0aW9uSGFuZGxlID0ge1xuICAgIGlkOiBzZWxmLmlkLFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNsb3NlKCk7XG4gICAgfSxcbiAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHZhciBjYiA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZm4sIFwiY29ubmVjdGlvbiBvbkNsb3NlIGNhbGxiYWNrXCIpO1xuICAgICAgaWYgKHNlbGYuaW5RdWV1ZSkge1xuICAgICAgICBzZWxmLl9jbG9zZUNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgY2xvc2VkLCBjYWxsIHRoZSBjYWxsYmFjay5cbiAgICAgICAgTWV0ZW9yLmRlZmVyKGNiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuX2NsaWVudEFkZHJlc3MoKSxcbiAgICBodHRwSGVhZGVyczogc2VsZi5zb2NrZXQuaGVhZGVyc1xuICB9O1xuXG4gIHNlbGYuc2VuZCh7IG1zZzogJ2Nvbm5lY3RlZCcsIHNlc3Npb246IHNlbGYuaWQgfSk7XG5cbiAgLy8gT24gaW5pdGlhbCBjb25uZWN0LCBzcGluIHVwIGFsbCB0aGUgdW5pdmVyc2FsIHB1Ymxpc2hlcnMuXG4gIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICB9KS5ydW4oKTtcblxuICBpZiAodmVyc2lvbiAhPT0gJ3ByZTEnICYmIG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwgIT09IDApIHtcbiAgICAvLyBXZSBubyBsb25nZXIgbmVlZCB0aGUgbG93IGxldmVsIHRpbWVvdXQgYmVjYXVzZSB3ZSBoYXZlIGhlYXJ0YmVhdGluZy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCgwKTtcblxuICAgIHNlbGYuaGVhcnRiZWF0ID0gbmV3IEREUENvbW1vbi5IZWFydGJlYXQoe1xuICAgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwsXG4gICAgICBoZWFydGJlYXRUaW1lb3V0OiBvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQsXG4gICAgICBvblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgfSxcbiAgICAgIHNlbmRQaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7bXNnOiAncGluZyd9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmhlYXJ0YmVhdC5zdGFydCgpO1xuICB9XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFNlc3Npb24ucHJvdG90eXBlLCB7XG5cbiAgc2VuZFJlYWR5OiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSWRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZWFkeVwiLCBzdWJzOiBzdWJzY3JpcHRpb25JZHN9KTtcbiAgICBlbHNlIHtcbiAgICAgIF8uZWFjaChzdWJzY3JpcHRpb25JZHMsIGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkucHVzaChzdWJzY3JpcHRpb25JZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZEFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcImFkZGVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWQsIGZpZWxkczogZmllbGRzfSk7XG4gIH0sXG5cbiAgc2VuZENoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoXy5pc0VtcHR5KGZpZWxkcykpXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKSB7XG4gICAgICBzZWxmLnNlbmQoe1xuICAgICAgICBtc2c6IFwiY2hhbmdlZFwiLFxuICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNlbmRSZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZW1vdmVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWR9KTtcbiAgfSxcblxuICBnZXRTZW5kQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICBhZGRlZDogXy5iaW5kKHNlbGYuc2VuZEFkZGVkLCBzZWxmKSxcbiAgICAgIGNoYW5nZWQ6IF8uYmluZChzZWxmLnNlbmRDaGFuZ2VkLCBzZWxmKSxcbiAgICAgIHJlbW92ZWQ6IF8uYmluZChzZWxmLnNlbmRSZW1vdmVkLCBzZWxmKVxuICAgIH07XG4gIH0sXG5cbiAgZ2V0Q29sbGVjdGlvblZpZXc6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0gc2VsZi5jb2xsZWN0aW9uVmlld3MuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcmV0ID0gbmV3IFNlc3Npb25Db2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFNlbmRDYWxsYmFja3MoKSk7XG4gICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5zZXQoY29sbGVjdGlvbk5hbWUsIHJldCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgYWRkZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5hZGRlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHJlbW92ZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcucmVtb3ZlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkKTtcbiAgICBpZiAodmlldy5pc0VtcHR5KCkpIHtcbiAgICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5kZWxldGUoY29sbGVjdGlvbk5hbWUpO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcuY2hhbmdlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHN0YXJ0VW5pdmVyc2FsU3ViczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBzZXQgb2YgdW5pdmVyc2FsIGhhbmRsZXJzIGFuZCBzdGFydCB0aGVtLiBJZlxuICAgIC8vIGFkZGl0aW9uYWwgdW5pdmVyc2FsIHB1Ymxpc2hlcnMgc3RhcnQgd2hpbGUgd2UncmUgcnVubmluZyB0aGVtIChkdWUgdG9cbiAgICAvLyB5aWVsZGluZyksIHRoZXkgd2lsbCBydW4gc2VwYXJhdGVseSBhcyBwYXJ0IG9mIFNlcnZlci5wdWJsaXNoLlxuICAgIHZhciBoYW5kbGVycyA9IF8uY2xvbmUoc2VsZi5zZXJ2ZXIudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMpO1xuICAgIF8uZWFjaChoYW5kbGVycywgZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIERlc3Ryb3kgdGhpcyBzZXNzaW9uIGFuZCB1bnJlZ2lzdGVyIGl0IGF0IHRoZSBzZXJ2ZXIuXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24sIGV2ZW4gaWYgaXQncyBub3QgcmVnaXN0ZXJlZCBhdCB0aGVcbiAgICAvLyBzZXJ2ZXIuIFN0b3AgYWxsIHByb2Nlc3NpbmcgYW5kIHRlYXIgZXZlcnl0aGluZyBkb3duLiBJZiBhIHNvY2tldFxuICAgIC8vIHdhcyBhdHRhY2hlZCwgY2xvc2UgaXQuXG5cbiAgICAvLyBBbHJlYWR5IGRlc3Ryb3llZC5cbiAgICBpZiAoISBzZWxmLmluUXVldWUpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBEcm9wIHRoZSBtZXJnZSBib3ggZGF0YSBpbW1lZGlhdGVseS5cbiAgICBzZWxmLmluUXVldWUgPSBudWxsO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBzZWxmLmhlYXJ0YmVhdC5zdG9wKCk7XG4gICAgICBzZWxmLmhlYXJ0YmVhdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBzZWxmLnNvY2tldC5jbG9zZSgpO1xuICAgICAgc2VsZi5zb2NrZXQuX21ldGVvclNlc3Npb24gPSBudWxsO1xuICAgIH1cblxuICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAtMSk7XG5cbiAgICBNZXRlb3IuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RvcCBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBkZWZlciB0aGlzIG9uIGNsb3NlLlxuICAgICAgLy8gc3ViLl9pc0RlYWN0aXZhdGVkKCkgZGV0ZWN0cyB0aGF0IHdlIHNldCBpblF1ZXVlIHRvIG51bGwgYW5kXG4gICAgICAvLyB0cmVhdHMgaXQgYXMgc2VtaS1kZWFjdGl2YXRlZCAoaXQgd2lsbCBpZ25vcmUgaW5jb21pbmcgY2FsbGJhY2tzLCBldGMpLlxuICAgICAgc2VsZi5fZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMoKTtcblxuICAgICAgLy8gRGVmZXIgY2FsbGluZyB0aGUgY2xvc2UgY2FsbGJhY2tzLCBzbyB0aGF0IHRoZSBjYWxsZXIgY2xvc2luZ1xuICAgICAgLy8gdGhlIHNlc3Npb24gaXNuJ3Qgd2FpdGluZyBmb3IgYWxsIHRoZSBjYWxsYmFja3MgdG8gY29tcGxldGUuXG4gICAgICBfLmVhY2goc2VsZi5fY2xvc2VDYWxsYmFja3MsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBVbnJlZ2lzdGVyIHRoZSBzZXNzaW9uLlxuICAgIHNlbGYuc2VydmVyLl9yZW1vdmVTZXNzaW9uKHNlbGYpO1xuICB9LFxuXG4gIC8vIFNlbmQgYSBtZXNzYWdlIChkb2luZyBub3RoaW5nIGlmIG5vIHNvY2tldCBpcyBjb25uZWN0ZWQgcmlnaHQgbm93LilcbiAgLy8gSXQgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QgKGl0IHdpbGwgYmUgc3RyaW5naWZpZWQuKVxuICBzZW5kOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLnNvY2tldCkge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRTZW50RERQKVxuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiU2VudCBERFBcIiwgRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICAgIHNlbGYuc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU2VuZCBhIGNvbm5lY3Rpb24gZXJyb3IuXG4gIHNlbmRFcnJvcjogZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgbXNnLm9mZmVuZGluZ01lc3NhZ2UgPSBvZmZlbmRpbmdNZXNzYWdlO1xuICAgIHNlbGYuc2VuZChtc2cpO1xuICB9LFxuXG4gIC8vIFByb2Nlc3MgJ21zZycgYXMgYW4gaW5jb21pbmcgbWVzc2FnZS4gKEJ1dCBhcyBhIGd1YXJkIGFnYWluc3RcbiAgLy8gcmFjZSBjb25kaXRpb25zIGR1cmluZyByZWNvbm5lY3Rpb24sIGlnbm9yZSB0aGUgbWVzc2FnZSBpZlxuICAvLyAnc29ja2V0JyBpcyBub3QgdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgc29ja2V0LilcbiAgLy9cbiAgLy8gV2UgcnVuIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgb25lIGF0IGEgdGltZSwgaW4gdGhlIG9yZGVyXG4gIC8vIGdpdmVuIGJ5IHRoZSBjbGllbnQuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaXMgcGFzc2VkIGFuIGlkZW1wb3RlbnRcbiAgLy8gZnVuY3Rpb24gJ3VuYmxvY2snIHdoaWNoIGl0IG1heSBjYWxsIHRvIGFsbG93IG90aGVyIG1lc3NhZ2VzIHRvXG4gIC8vIGJlZ2luIHJ1bm5pbmcgaW4gcGFyYWxsZWwgaW4gYW5vdGhlciBmaWJlciAoZm9yIGV4YW1wbGUsIGEgbWV0aG9kXG4gIC8vIHRoYXQgd2FudHMgdG8geWllbGQuKSBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkgdW5ibG9ja2VkXG4gIC8vIHdoZW4gaXQgcmV0dXJucy5cbiAgLy9cbiAgLy8gQWN0dWFsbHksIHdlIGRvbid0IGhhdmUgdG8gJ3RvdGFsbHkgb3JkZXInIHRoZSBtZXNzYWdlcyBpbiB0aGlzXG4gIC8vIHdheSwgYnV0IGl0J3MgdGhlIGVhc2llc3QgdGhpbmcgdGhhdCdzIGNvcnJlY3QuICh1bnN1YiBuZWVkcyB0b1xuICAvLyBiZSBvcmRlcmVkIGFnYWluc3Qgc3ViLCBtZXRob2RzIG5lZWQgdG8gYmUgb3JkZXJlZCBhZ2FpbnN0IGVhY2hcbiAgLy8gb3RoZXIuKVxuICBwcm9jZXNzTWVzc2FnZTogZnVuY3Rpb24gKG1zZ19pbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoIXNlbGYuaW5RdWV1ZSkgLy8gd2UgaGF2ZSBiZWVuIGRlc3Ryb3llZC5cbiAgICAgIHJldHVybjtcblxuICAgIC8vIFJlc3BvbmQgdG8gcGluZyBhbmQgcG9uZyBtZXNzYWdlcyBpbW1lZGlhdGVseSB3aXRob3V0IHF1ZXVpbmcuXG4gICAgLy8gSWYgdGhlIG5lZ290aWF0ZWQgRERQIHZlcnNpb24gaXMgXCJwcmUxXCIgd2hpY2ggZGlkbid0IHN1cHBvcnRcbiAgICAvLyBwaW5ncywgcHJlc2VydmUgdGhlIFwicHJlMVwiIGJlaGF2aW9yIG9mIHJlc3BvbmRpbmcgd2l0aCBhIFwiYmFkXG4gICAgLy8gcmVxdWVzdFwiIGZvciB0aGUgdW5rbm93biBtZXNzYWdlcy5cbiAgICAvL1xuICAgIC8vIEZpYmVycyBhcmUgbmVlZGVkIGJlY2F1c2UgaGVhcnRiZWF0IHVzZXMgTWV0ZW9yLnNldFRpbWVvdXQsIHdoaWNoXG4gICAgLy8gbmVlZHMgYSBGaWJlci4gV2UgY291bGQgYWN0dWFsbHkgdXNlIHJlZ3VsYXIgc2V0VGltZW91dCBhbmQgYXZvaWRcbiAgICAvLyB0aGVzZSBuZXcgZmliZXJzLCBidXQgaXQgaXMgZWFzaWVyIHRvIGp1c3QgbWFrZSBldmVyeXRoaW5nIHVzZVxuICAgIC8vIE1ldGVvci5zZXRUaW1lb3V0IGFuZCBub3QgdGhpbmsgdG9vIGhhcmQuXG4gICAgLy9cbiAgICAvLyBBbnkgbWVzc2FnZSBjb3VudHMgYXMgcmVjZWl2aW5nIGEgcG9uZywgYXMgaXQgZGVtb25zdHJhdGVzIHRoYXRcbiAgICAvLyB0aGUgY2xpZW50IGlzIHN0aWxsIGFsaXZlLlxuICAgIGlmIChzZWxmLmhlYXJ0YmVhdCkge1xuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmhlYXJ0YmVhdC5tZXNzYWdlUmVjZWl2ZWQoKTtcbiAgICAgIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncGluZycpIHtcbiAgICAgIGlmIChzZWxmLl9yZXNwb25kVG9QaW5ncylcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6IFwicG9uZ1wiLCBpZDogbXNnX2luLmlkfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncG9uZycpIHtcbiAgICAgIC8vIFNpbmNlIGV2ZXJ5dGhpbmcgaXMgYSBwb25nLCBub3RoaW5nIHRvIGRvXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pblF1ZXVlLnB1c2gobXNnX2luKTtcbiAgICBpZiAoc2VsZi53b3JrZXJSdW5uaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIHNlbGYud29ya2VyUnVubmluZyA9IHRydWU7XG5cbiAgICB2YXIgcHJvY2Vzc05leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbXNnID0gc2VsZi5pblF1ZXVlICYmIHNlbGYuaW5RdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKCFtc2cpIHtcbiAgICAgICAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFibG9ja2VkKVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBpZGVtcG90ZW50XG4gICAgICAgICAgYmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHByb2Nlc3NOZXh0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VsZi5zZXJ2ZXIub25NZXNzYWdlSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKG1zZywgc2VsZik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfLmhhcyhzZWxmLnByb3RvY29sX2hhbmRsZXJzLCBtc2cubXNnKSlcbiAgICAgICAgICBzZWxmLnByb3RvY29sX2hhbmRsZXJzW21zZy5tc2ddLmNhbGwoc2VsZiwgbXNnLCB1bmJsb2NrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHNlbGYuc2VuZEVycm9yKCdCYWQgcmVxdWVzdCcsIG1zZyk7XG4gICAgICAgIHVuYmxvY2soKTsgLy8gaW4gY2FzZSB0aGUgaGFuZGxlciBkaWRuJ3QgYWxyZWFkeSBkbyBpdFxuICAgICAgfSkucnVuKCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3NOZXh0KCk7XG4gIH0sXG5cbiAgcHJvdG9jb2xfaGFuZGxlcnM6IHtcbiAgICBzdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm5hbWUpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkpIHtcbiAgICAgICAgc2VsZi5zZW5kRXJyb3IoXCJNYWxmb3JtZWQgc3Vic2NyaXB0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXSkge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ25vc3ViJywgaWQ6IG1zZy5pZCxcbiAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcig0MDQsIGBTdWJzY3JpcHRpb24gJyR7bXNnLm5hbWV9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9uYW1lZFN1YnMuaGFzKG1zZy5pZCkpXG4gICAgICAgIC8vIHN1YnMgYXJlIGlkZW1wb3RlbnQsIG9yIHJhdGhlciwgdGhleSBhcmUgaWdub3JlZCBpZiBhIHN1YlxuICAgICAgICAvLyB3aXRoIHRoYXQgaWQgYWxyZWFkeSBleGlzdHMuIHRoaXMgaXMgaW1wb3J0YW50IGR1cmluZ1xuICAgICAgICAvLyByZWNvbm5lY3QuXG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gWFhYIEl0J2QgYmUgbXVjaCBiZXR0ZXIgaWYgd2UgaGFkIGdlbmVyaWMgaG9va3Mgd2hlcmUgYW55IHBhY2thZ2UgY2FuXG4gICAgICAvLyBob29rIGludG8gc3Vic2NyaXB0aW9uIGhhbmRsaW5nLCBidXQgaW4gdGhlIG1lYW4gd2hpbGUgd2Ugc3BlY2lhbCBjYXNlXG4gICAgICAvLyBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UuIFRoaXMgaXMgYWxzbyBkb25lIGZvciB3ZWFrIHJlcXVpcmVtZW50cyB0b1xuICAgICAgLy8gYWRkIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlIEFjY291bnRzLiBBXG4gICAgICAvLyB1c2VyIHRyeWluZyB0byB1c2UgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgbXVzdCBleHBsaWNpdGx5IHJlcXVpcmUgaXQuXG4gICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgIHZhciBERFBSYXRlTGltaXRlciA9IFBhY2thZ2VbJ2RkcC1yYXRlLWxpbWl0ZXInXS5ERFBSYXRlTGltaXRlcjtcbiAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICBjbGllbnRBZGRyZXNzOiBzZWxmLmNvbm5lY3Rpb25IYW5kbGUuY2xpZW50QWRkcmVzcyxcbiAgICAgICAgICB0eXBlOiBcInN1YnNjcmlwdGlvblwiLFxuICAgICAgICAgIG5hbWU6IG1zZy5uYW1lLFxuICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIHZhciByYXRlTGltaXRSZXN1bHQgPSBERFBSYXRlTGltaXRlci5fY2hlY2socmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgICd0b28tbWFueS1yZXF1ZXN0cycsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVyID0gc2VsZi5zZXJ2ZXIucHVibGlzaF9oYW5kbGVyc1ttc2cubmFtZV07XG5cbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIsIG1zZy5pZCwgbXNnLnBhcmFtcywgbXNnLm5hbWUpO1xuXG4gICAgfSxcblxuICAgIHVuc3ViOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHNlbGYuX3N0b3BTdWJzY3JpcHRpb24obXNnLmlkKTtcbiAgICB9LFxuXG4gICAgbWV0aG9kOiBmdW5jdGlvbiAobXNnLCB1bmJsb2NrKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIHJlamVjdCBtYWxmb3JtZWQgbWVzc2FnZXNcbiAgICAgIC8vIEZvciBub3csIHdlIHNpbGVudGx5IGlnbm9yZSB1bmtub3duIGF0dHJpYnV0ZXMsXG4gICAgICAvLyBmb3IgZm9yd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgIGlmICh0eXBlb2YgKG1zZy5pZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICB0eXBlb2YgKG1zZy5tZXRob2QpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkgfHxcbiAgICAgICAgICAoKCdyYW5kb21TZWVkJyBpbiBtc2cpICYmICh0eXBlb2YgbXNnLnJhbmRvbVNlZWQgIT09IFwic3RyaW5nXCIpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBtZXRob2QgaW52b2NhdGlvblwiLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByYW5kb21TZWVkID0gbXNnLnJhbmRvbVNlZWQgfHwgbnVsbDtcblxuICAgICAgLy8gc2V0IHVwIHRvIG1hcmsgdGhlIG1ldGhvZCBhcyBzYXRpc2ZpZWQgb25jZSBhbGwgb2JzZXJ2ZXJzXG4gICAgICAvLyAoYW5kIHN1YnNjcmlwdGlvbnMpIGhhdmUgcmVhY3RlZCB0byBhbnkgd3JpdGVzIHRoYXQgd2VyZVxuICAgICAgLy8gZG9uZS5cbiAgICAgIHZhciBmZW5jZSA9IG5ldyBERFBTZXJ2ZXIuX1dyaXRlRmVuY2U7XG4gICAgICBmZW5jZS5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJldGlyZSB0aGUgZmVuY2Ugc28gdGhhdCBmdXR1cmUgd3JpdGVzIGFyZSBhbGxvd2VkLlxuICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgY2FsbGJhY2tzIGxpa2UgdGltZXJzIGFyZSBmcmVlIHRvIHVzZVxuICAgICAgICAvLyB0aGUgZmVuY2UsIGFuZCBpZiB0aGV5IGZpcmUgYmVmb3JlIGl0J3MgYXJtZWQgKGZvclxuICAgICAgICAvLyBleGFtcGxlLCBiZWNhdXNlIHRoZSBtZXRob2Qgd2FpdHMgZm9yIHRoZW0pIHRoZWlyXG4gICAgICAgIC8vIHdyaXRlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmZW5jZS5cbiAgICAgICAgZmVuY2UucmV0aXJlKCk7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAndXBkYXRlZCcsIG1ldGhvZHM6IFttc2cuaWRdfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZmluZCB0aGUgaGFuZGxlclxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5tZXRob2RfaGFuZGxlcnNbbXNnLm1ldGhvZF07XG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICdyZXN1bHQnLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHttc2cubWV0aG9kfScgbm90IGZvdW5kYCl9KTtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBzZWxmLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgICAgaXNTaW11bGF0aW9uOiBmYWxzZSxcbiAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgc2V0VXNlcklkOiBzZXRVc2VySWQsXG4gICAgICAgIHVuYmxvY2s6IHVuYmxvY2ssXG4gICAgICAgIGNvbm5lY3Rpb246IHNlbGYuY29ubmVjdGlvbkhhbmRsZSxcbiAgICAgICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIFhYWCBJdCdkIGJlIGJldHRlciBpZiB3ZSBjb3VsZCBob29rIGludG8gbWV0aG9kIGhhbmRsZXJzIGJldHRlciBidXRcbiAgICAgICAgLy8gZm9yIG5vdywgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGRwLXJhdGUtbGltaXRlciBleGlzdHMgc2luY2Ugd2VcbiAgICAgICAgLy8gaGF2ZSBhIHdlYWsgcmVxdWlyZW1lbnQgZm9yIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgdG8gYmUgYWRkZWRcbiAgICAgICAgLy8gdG8gb3VyIGFwcGxpY2F0aW9uLlxuICAgICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICAgIHZhciByYXRlTGltaXRlcklucHV0ID0ge1xuICAgICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgdHlwZTogXCJtZXRob2RcIixcbiAgICAgICAgICAgIG5hbWU6IG1zZy5tZXRob2QsXG4gICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHNlbGYuaWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KVxuICAgICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgTWV0ZW9yLkVycm9yKFxuICAgICAgICAgICAgICBcInRvby1tYW55LXJlcXVlc3RzXCIsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH1cbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS53aXRoVmFsdWUoXG4gICAgICAgICAgZmVuY2UsXG4gICAgICAgICAgKCkgPT4gRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgICAgICBoYW5kbGVyLCBpbnZvY2F0aW9uLCBtc2cucGFyYW1zLFxuICAgICAgICAgICAgICBcImNhbGwgdG8gJ1wiICsgbXNnLm1ldGhvZCArIFwiJ1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICAgIGZlbmNlLmFybSgpO1xuICAgICAgICB1bmJsb2NrKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIG1zZzogXCJyZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZFxuICAgICAgfTtcblxuICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBheWxvYWQucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIHBheWxvYWQuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgICAgZXhjZXB0aW9uLFxuICAgICAgICAgIGB3aGlsZSBpbnZva2luZyBtZXRob2QgJyR7bXNnLm1ldGhvZH0nYFxuICAgICAgICApO1xuICAgICAgICBzZWxmLnNlbmQocGF5bG9hZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2VhY2hTdWI6IGZ1bmN0aW9uIChmKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGYpO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMuZm9yRWFjaChmKTtcbiAgfSxcblxuICBfZGlmZkNvbGxlY3Rpb25WaWV3czogZnVuY3Rpb24gKGJlZm9yZUNWcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk1hcHMoYmVmb3JlQ1ZzLCBzZWxmLmNvbGxlY3Rpb25WaWV3cywge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kaWZmKGxlZnRWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9jVmlldywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRBZGRlZChjb2xsZWN0aW9uTmFtZSwgaWQsIGRvY1ZpZXcuZ2V0RmllbGRzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBsZWZ0T25seTogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUpIHtcbiAgICAgICAgbGVmdFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MsIGlkKSB7XG4gICAgICAgICAgc2VsZi5zZW5kUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICAvLyBTZXRzIHRoZSBjdXJyZW50IHVzZXIgaWQgaW4gYWxsIGFwcHJvcHJpYXRlIGNvbnRleHRzIGFuZCByZXJ1bnNcbiAgLy8gYWxsIHN1YnNjcmlwdGlvbnNcbiAgX3NldFVzZXJJZDogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHVzZXJJZCAhPT0gbnVsbCAmJiB0eXBlb2YgdXNlcklkICE9PSBcInN0cmluZ1wiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VXNlcklkIG11c3QgYmUgY2FsbGVkIG9uIHN0cmluZyBvciBudWxsLCBub3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB1c2VySWQpO1xuXG4gICAgLy8gUHJldmVudCBuZXdseS1jcmVhdGVkIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zIGZyb20gYmVpbmcgYWRkZWQgdG8gb3VyXG4gICAgLy8gc2Vzc2lvbjsgdGhleSB3aWxsIGJlIGZvdW5kIGJlbG93IHdoZW4gd2UgY2FsbCBzdGFydFVuaXZlcnNhbFN1YnMuXG4gICAgLy9cbiAgICAvLyAoV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBuYW1lZCBzdWJzY3JpcHRpb25zLCBiZWNhdXNlIHdlIG9ubHkgYWRkXG4gICAgLy8gdGhlbSB3aGVuIHdlIHByb2Nlc3MgYSAnc3ViJyBtZXNzYWdlLiBXZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYVxuICAgIC8vICdtZXRob2QnIG1lc3NhZ2UsIGFuZCB0aGUgbWV0aG9kIGRpZCBub3QgdW5ibG9jaywgYmVjYXVzZSBpdCBpcyBpbGxlZ2FsXG4gICAgLy8gdG8gY2FsbCBzZXRVc2VySWQgYWZ0ZXIgdW5ibG9jay4gVGh1cyB3ZSBjYW5ub3QgYmUgY29uY3VycmVudGx5IGFkZGluZyBhXG4gICAgLy8gbmV3IG5hbWVkIHN1YnNjcmlwdGlvbi4pXG4gICAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IHRydWU7XG5cbiAgICAvLyBQcmV2ZW50IGN1cnJlbnQgc3VicyBmcm9tIHVwZGF0aW5nIG91ciBjb2xsZWN0aW9uVmlld3MgYW5kIGNhbGwgdGhlaXJcbiAgICAvLyBzdG9wIGNhbGxiYWNrcy4gVGhpcyBtYXkgeWllbGQuXG4gICAgc2VsZi5fZWFjaFN1YihmdW5jdGlvbiAoc3ViKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEFsbCBzdWJzIHNob3VsZCBub3cgYmUgZGVhY3RpdmF0ZWQuIFN0b3Agc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgY2xpZW50LFxuICAgIC8vIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBwdWJsaXNoZWQgY29sbGVjdGlvbnMsIHJlc2V0IHRvIGFuIGVtcHR5IHZpZXcsIGFuZFxuICAgIC8vIHVwZGF0ZSB0aGUgdXNlcklkLlxuICAgIHNlbGYuX2lzU2VuZGluZyA9IGZhbHNlO1xuICAgIHZhciBiZWZvcmVDVnMgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cztcbiAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcbiAgICBzZWxmLnVzZXJJZCA9IHVzZXJJZDtcblxuICAgIC8vIF9zZXRVc2VySWQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gYSBNZXRlb3IgbWV0aG9kIHdpdGhcbiAgICAvLyBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uIHNldC4gQnV0IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gaXMgbm90XG4gICAgLy8gZXhwZWN0ZWQgdG8gYmUgc2V0IGluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24sIHNvIHdlIHRlbXBvcmFyeSB1bnNldCBpdC5cbiAgICAvLyBJbnNpZGUgYSBwdWJsaXNoIGZ1bmN0aW9uIEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiBpcyBzZXQuXG4gICAgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTYXZlIHRoZSBvbGQgbmFtZWQgc3VicywgYW5kIHJlc2V0IHRvIGhhdmluZyBubyBzdWJzY3JpcHRpb25zLlxuICAgICAgdmFyIG9sZE5hbWVkU3VicyA9IHNlbGYuX25hbWVkU3VicztcbiAgICAgIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICAgICAgb2xkTmFtZWRTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yiwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgdmFyIG5ld1N1YiA9IHN1Yi5fcmVjcmVhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLnNldChzdWJzY3JpcHRpb25JZCwgbmV3U3ViKTtcbiAgICAgICAgLy8gbmI6IGlmIHRoZSBoYW5kbGVyIHRocm93cyBvciBjYWxscyB0aGlzLmVycm9yKCksIGl0IHdpbGwgaW4gZmFjdFxuICAgICAgICAvLyBpbW1lZGlhdGVseSBzZW5kIGl0cyAnbm9zdWInLiBUaGlzIGlzIE9LLCB0aG91Z2guXG4gICAgICAgIG5ld1N1Yi5fcnVuSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnMgdG8gYmUgc3RhcnRlZCBvbiBvdXIgY29ubmVjdGlvbiBpblxuICAgICAgLy8gcGFyYWxsZWwgd2l0aCB0aGUgb25lcyB3ZSdyZSBzcGlubmluZyB1cCBoZXJlLCBhbmQgc3BpbiB1cCB1bml2ZXJzYWxcbiAgICAgIC8vIHN1YnMuXG4gICAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gZmFsc2U7XG4gICAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgc2VuZGluZyBtZXNzYWdlcyBhZ2FpbiwgYmVnaW5uaW5nIHdpdGggdGhlIGRpZmYgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBzdGF0ZSBvZiB0aGUgd29ybGQgdG8gdGhlIGN1cnJlbnQgc3RhdGUuIE5vIHlpZWxkcyBhcmUgYWxsb3dlZCBkdXJpbmdcbiAgICAvLyB0aGlzIGRpZmYsIHNvIHRoYXQgb3RoZXIgY2hhbmdlcyBjYW5ub3QgaW50ZXJsZWF2ZS5cbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9pc1NlbmRpbmcgPSB0cnVlO1xuICAgICAgc2VsZi5fZGlmZkNvbGxlY3Rpb25WaWV3cyhiZWZvcmVDVnMpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZi5fcGVuZGluZ1JlYWR5KSkge1xuICAgICAgICBzZWxmLnNlbmRSZWFkeShzZWxmLl9wZW5kaW5nUmVhZHkpO1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBfc3RhcnRTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLCBoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKTtcbiAgICBpZiAoc3ViSWQpXG4gICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YklkLCBzdWIpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMucHVzaChzdWIpO1xuXG4gICAgc3ViLl9ydW5IYW5kbGVyKCk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIHNwZWNpZmllZCBzdWJzY3JpcHRpb25cbiAgX3N0b3BTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChzdWJJZCwgZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViTmFtZSA9IG51bGw7XG4gICAgaWYgKHN1YklkKSB7XG4gICAgICB2YXIgbWF5YmVTdWIgPSBzZWxmLl9uYW1lZFN1YnMuZ2V0KHN1YklkKTtcbiAgICAgIGlmIChtYXliZVN1Yikge1xuICAgICAgICBzdWJOYW1lID0gbWF5YmVTdWIuX25hbWU7XG4gICAgICAgIG1heWJlU3ViLl9yZW1vdmVBbGxEb2N1bWVudHMoKTtcbiAgICAgICAgbWF5YmVTdWIuX2RlYWN0aXZhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLmRlbGV0ZShzdWJJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3BvbnNlID0ge21zZzogJ25vc3ViJywgaWQ6IHN1YklkfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgcmVzcG9uc2UuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgIGVycm9yLFxuICAgICAgICBzdWJOYW1lID8gKFwiZnJvbSBzdWIgXCIgKyBzdWJOYW1lICsgXCIgaWQgXCIgKyBzdWJJZClcbiAgICAgICAgICA6IChcImZyb20gc3ViIGlkIFwiICsgc3ViSWQpKTtcbiAgICB9XG5cbiAgICBzZWxmLnNlbmQocmVzcG9uc2UpO1xuICB9LFxuXG4gIC8vIHRlYXIgZG93biBhbGwgc3Vic2NyaXB0aW9ucy4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1Qgc2VuZCByZW1vdmVkIG9yIG5vc3ViXG4gIC8vIG1lc3NhZ2VzLCBzaW5jZSB3ZSBhc3N1bWUgdGhlIGNsaWVudCBpcyBnb25lLlxuICBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLl9uYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBpZCkge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuXG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcbiAgfSxcblxuICAvLyBEZXRlcm1pbmUgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzLCBiYXNlZCBvbiB0aGVcbiAgLy8gSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVwcmVzZW50aW5nIGhvdyBtYW55XG4gIC8vIHByb3hpZXMgdGhlIHNlcnZlciBpcyBiZWhpbmQuXG4gIF9jbGllbnRBZGRyZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRm9yIHRoZSByZXBvcnRlZCBjbGllbnQgYWRkcmVzcyBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGNvcnJlY3QsXG4gICAgLy8gdGhlIGRldmVsb3BlciBtdXN0IHNldCB0aGUgSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnRcbiAgICAvLyB2YXJpYWJsZSB0byBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGhvcHMgdGhleVxuICAgIC8vIGV4cGVjdCBpbiB0aGUgYHgtZm9yd2FyZGVkLWZvcmAgaGVhZGVyLiBFLmcuLCBzZXQgdG8gXCIxXCIgaWYgdGhlXG4gICAgLy8gc2VydmVyIGlzIGJlaGluZCBvbmUgcHJveHkuXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvdWxkIGJlIGNvbXB1dGVkIG9uY2UgYXQgc3RhcnR1cCBpbnN0ZWFkIG9mIGV2ZXJ5IHRpbWUuXG4gICAgdmFyIGh0dHBGb3J3YXJkZWRDb3VudCA9IHBhcnNlSW50KHByb2Nlc3MuZW52WydIVFRQX0ZPUldBUkRFRF9DT1VOVCddKSB8fCAwO1xuXG4gICAgaWYgKGh0dHBGb3J3YXJkZWRDb3VudCA9PT0gMClcbiAgICAgIHJldHVybiBzZWxmLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuXG4gICAgdmFyIGZvcndhcmRlZEZvciA9IHNlbGYuc29ja2V0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1mb3JcIl07XG4gICAgaWYgKCEgXy5pc1N0cmluZyhmb3J3YXJkZWRGb3IpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgZm9yd2FyZGVkRm9yID0gZm9yd2FyZGVkRm9yLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqLyk7XG5cbiAgICAvLyBUeXBpY2FsbHkgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIgaXNcbiAgICAvLyB0aGUgb3JpZ2luYWwgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50IGNvbm5lY3RpbmcgdG8gdGhlIGZpcnN0XG4gICAgLy8gcHJveHkuICBIb3dldmVyLCB0aGUgZW5kIHVzZXIgY2FuIGVhc2lseSBzcG9vZiB0aGUgaGVhZGVyLCBpblxuICAgIC8vIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHZhbHVlKHMpIHdpbGwgYmUgdGhlIGZha2UgSVAgYWRkcmVzcyBmcm9tXG4gICAgLy8gdGhlIHVzZXIgcHJldGVuZGluZyB0byBiZSBhIHByb3h5IHJlcG9ydGluZyB0aGUgb3JpZ2luYWwgSVBcbiAgICAvLyBhZGRyZXNzIHZhbHVlLiAgQnkgY291bnRpbmcgSFRUUF9GT1JXQVJERURfQ09VTlQgYmFjayBmcm9tIHRoZVxuICAgIC8vIGVuZCBvZiB0aGUgbGlzdCwgd2UgZW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBJUCBhZGRyZXNzIGJlaW5nXG4gICAgLy8gcmVwb3J0ZWQgYnkgKm91ciogZmlyc3QgcHJveHkuXG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50IDwgMCB8fCBodHRwRm9yd2FyZGVkQ291bnQgPiBmb3J3YXJkZWRGb3IubGVuZ3RoKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZm9yd2FyZGVkRm9yW2ZvcndhcmRlZEZvci5sZW5ndGggLSBodHRwRm9yd2FyZGVkQ291bnRdO1xuICB9XG59KTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIFN1YnNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBjdG9yIGZvciBhIHN1YiBoYW5kbGU6IHRoZSBpbnB1dCB0byBlYWNoIHB1Ymxpc2ggZnVuY3Rpb25cblxuLy8gSW5zdGFuY2UgbmFtZSBpcyB0aGlzIGJlY2F1c2UgaXQncyB1c3VhbGx5IHJlZmVycmVkIHRvIGFzIHRoaXMgaW5zaWRlIGFcbi8vIHB1Ymxpc2hcbi8qKlxuICogQHN1bW1hcnkgVGhlIHNlcnZlcidzIHNpZGUgb2YgYSBzdWJzY3JpcHRpb25cbiAqIEBjbGFzcyBTdWJzY3JpcHRpb25cbiAqIEBpbnN0YW5jZU5hbWUgdGhpc1xuICogQHNob3dJbnN0YW5jZU5hbWUgdHJ1ZVxuICovXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKFxuICAgIHNlc3Npb24sIGhhbmRsZXIsIHN1YnNjcmlwdGlvbklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLl9zZXNzaW9uID0gc2Vzc2lvbjsgLy8gdHlwZSBpcyBTZXNzaW9uXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFjY2VzcyBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uIFRoZSBpbmNvbWluZyBbY29ubmVjdGlvbl0oI21ldGVvcl9vbmNvbm5lY3Rpb24pIGZvciB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbmFtZSAgY29ubmVjdGlvblxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi5jb25uZWN0aW9uID0gc2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlOyAvLyBwdWJsaWMgQVBJIG9iamVjdFxuXG4gIHNlbGYuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXG4gIC8vIG15IHN1YnNjcmlwdGlvbiBJRCAoZ2VuZXJhdGVkIGJ5IGNsaWVudCwgdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3VicykuXG4gIHNlbGYuX3N1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7XG4gIC8vIHVuZGVmaW5lZCBmb3IgdW5pdmVyc2FsIHN1YnNcbiAgc2VsZi5fbmFtZSA9IG5hbWU7XG5cbiAgc2VsZi5fcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuXG4gIC8vIE9ubHkgbmFtZWQgc3Vic2NyaXB0aW9ucyBoYXZlIElEcywgYnV0IHdlIG5lZWQgc29tZSBzb3J0IG9mIHN0cmluZ1xuICAvLyBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIHN1YnNjcmlwdGlvbnMgaW5zaWRlXG4gIC8vIFNlc3Npb25Eb2N1bWVudFZpZXdzLiBXZSB1c2UgdGhpcyBzdWJzY3JpcHRpb25IYW5kbGUgZm9yIHRoYXQuXG4gIGlmIChzZWxmLl9zdWJzY3JpcHRpb25JZCkge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdOJyArIHNlbGYuX3N1YnNjcmlwdGlvbklkO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdVJyArIFJhbmRvbS5pZCgpO1xuICB9XG5cbiAgLy8gaGFzIF9kZWFjdGl2YXRlIGJlZW4gY2FsbGVkP1xuICBzZWxmLl9kZWFjdGl2YXRlZCA9IGZhbHNlO1xuXG4gIC8vIHN0b3AgY2FsbGJhY2tzIHRvIGcvYyB0aGlzIHN1Yi4gIGNhbGxlZCB3LyB6ZXJvIGFyZ3VtZW50cy5cbiAgc2VsZi5fc3RvcENhbGxiYWNrcyA9IFtdO1xuXG4gIC8vIHRoZSBzZXQgb2YgKGNvbGxlY3Rpb24sIGRvY3VtZW50aWQpIHRoYXQgdGhpcyBzdWJzY3JpcHRpb24gaGFzXG4gIC8vIGFuIG9waW5pb24gYWJvdXRcbiAgc2VsZi5fZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuXG4gIC8vIHJlbWVtYmVyIGlmIHdlIGFyZSByZWFkeS5cbiAgc2VsZi5fcmVhZHkgPSBmYWxzZTtcblxuICAvLyBQYXJ0IG9mIHRoZSBwdWJsaWMgQVBJOiB0aGUgdXNlciBvZiB0aGlzIHN1Yi5cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGlkIG9mIHRoZSBsb2dnZWQtaW4gdXNlciwgb3IgYG51bGxgIGlmIG5vIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQG5hbWUgIHVzZXJJZFxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHNlbGYudXNlcklkID0gc2Vzc2lvbi51c2VySWQ7XG5cbiAgLy8gRm9yIG5vdywgdGhlIGlkIGZpbHRlciBpcyBnb2luZyB0byBkZWZhdWx0IHRvXG4gIC8vIHRoZSB0by9mcm9tIEREUCBtZXRob2RzIG9uIE1vbmdvSUQsIHRvXG4gIC8vIHNwZWNpZmljYWxseSBkZWFsIHdpdGggbW9uZ28vbWluaW1vbmdvIE9iamVjdElkcy5cblxuICAvLyBMYXRlciwgeW91IHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaXMgYmUgXCJyYXdcIlxuICAvLyBpZiB5b3Ugd2FudCB0byBwdWJsaXNoIGEgY29sbGVjdGlvbiB0aGF0IHlvdSBrbm93XG4gIC8vIGp1c3QgaGFzIHN0cmluZ3MgZm9yIGtleXMgYW5kIG5vIGZ1bm55IGJ1c2luZXNzLCB0b1xuICAvLyBhIGRkcCBjb25zdW1lciB0aGF0IGlzbid0IG1pbmltb25nb1xuXG4gIHNlbGYuX2lkRmlsdGVyID0ge1xuICAgIGlkU3RyaW5naWZ5OiBNb25nb0lELmlkU3RyaW5naWZ5LFxuICAgIGlkUGFyc2U6IE1vbmdvSUQuaWRQYXJzZVxuICB9O1xuXG4gIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFN1YnNjcmlwdGlvbi5wcm90b3R5cGUsIHtcbiAgX3J1bkhhbmRsZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBYWFggc2hvdWxkIHdlIHVuYmxvY2soKSBoZXJlPyBFaXRoZXIgYmVmb3JlIHJ1bm5pbmcgdGhlIHB1Ymxpc2hcbiAgICAvLyBmdW5jdGlvbiwgb3IgYmVmb3JlIHJ1bm5pbmcgX3B1Ymxpc2hDdXJzb3IuXG4gICAgLy9cbiAgICAvLyBSaWdodCBub3csIGVhY2ggcHVibGlzaCBmdW5jdGlvbiBibG9ja3MgYWxsIGZ1dHVyZSBwdWJsaXNoZXMgYW5kXG4gICAgLy8gbWV0aG9kcyB3YWl0aW5nIG9uIGRhdGEgZnJvbSBNb25nbyAob3Igd2hhdGV2ZXIgZWxzZSB0aGUgZnVuY3Rpb25cbiAgICAvLyBibG9ja3Mgb24pLiBUaGlzIHByb2JhYmx5IHNsb3dzIHBhZ2UgbG9hZCBpbiBjb21tb24gY2FzZXMuXG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBzZWxmLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgc2VsZi5faGFuZGxlciwgc2VsZiwgRUpTT04uY2xvbmUoc2VsZi5fcGFyYW1zKSxcbiAgICAgICAgICAvLyBJdCdzIE9LIHRoYXQgdGhpcyB3b3VsZCBsb29rIHdlaXJkIGZvciB1bml2ZXJzYWwgc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgaGF2ZSBubyBhcmd1bWVudHMgc28gdGhlcmUgY2FuIG5ldmVyIGJlIGFuXG4gICAgICAgICAgLy8gYXVkaXQtYXJndW1lbnQtY2hlY2tzIGZhaWx1cmUuXG4gICAgICAgICAgXCJwdWJsaXNoZXIgJ1wiICsgc2VsZi5fbmFtZSArIFwiJ1wiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaWQgdGhlIGhhbmRsZXIgY2FsbCB0aGlzLmVycm9yIG9yIHRoaXMuc3RvcD9cbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgc2VsZi5fcHVibGlzaEhhbmRsZXJSZXN1bHQocmVzKTtcbiAgfSxcblxuICBfcHVibGlzaEhhbmRsZXJSZXN1bHQ6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAvLyBTUEVDSUFMIENBU0U6IEluc3RlYWQgb2Ygd3JpdGluZyB0aGVpciBvd24gY2FsbGJhY2tzIHRoYXQgaW52b2tlXG4gICAgLy8gdGhpcy5hZGRlZC9jaGFuZ2VkL3JlYWR5L2V0YywgdGhlIHVzZXIgY2FuIGp1c3QgcmV0dXJuIGEgY29sbGVjdGlvblxuICAgIC8vIGN1cnNvciBvciBhcnJheSBvZiBjdXJzb3JzIGZyb20gdGhlIHB1Ymxpc2ggZnVuY3Rpb247IHdlIGNhbGwgdGhlaXJcbiAgICAvLyBfcHVibGlzaEN1cnNvciBtZXRob2Qgd2hpY2ggc3RhcnRzIG9ic2VydmluZyB0aGUgY3Vyc29yIGFuZCBwdWJsaXNoZXMgdGhlXG4gICAgLy8gcmVzdWx0cy4gTm90ZSB0aGF0IF9wdWJsaXNoQ3Vyc29yIGRvZXMgTk9UIGNhbGwgcmVhZHkoKS5cbiAgICAvL1xuICAgIC8vIFhYWCBUaGlzIHVzZXMgYW4gdW5kb2N1bWVudGVkIGludGVyZmFjZSB3aGljaCBvbmx5IHRoZSBNb25nbyBjdXJzb3JcbiAgICAvLyBpbnRlcmZhY2UgcHVibGlzaGVzLiBTaG91bGQgd2UgbWFrZSB0aGlzIGludGVyZmFjZSBwdWJsaWMgYW5kIGVuY291cmFnZVxuICAgIC8vIHVzZXJzIHRvIGltcGxlbWVudCBpdCB0aGVtc2VsdmVzPyBBcmd1YWJseSwgaXQncyB1bm5lY2Vzc2FyeTsgdXNlcnMgY2FuXG4gICAgLy8gYWxyZWFkeSB3cml0ZSB0aGVpciBvd24gZnVuY3Rpb25zIGxpa2VcbiAgICAvLyAgIHZhciBwdWJsaXNoTXlSZWFjdGl2ZVRoaW5neSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgLy8gICAgIE1ldGVvci5wdWJsaXNoKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgICB2YXIgcmVhY3RpdmVUaGluZ3kgPSBoYW5kbGVyKCk7XG4gICAgLy8gICAgICAgcmVhY3RpdmVUaGluZ3kucHVibGlzaE1lKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgfTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXNDdXJzb3IgPSBmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMgJiYgYy5fcHVibGlzaEN1cnNvcjtcbiAgICB9O1xuICAgIGlmIChpc0N1cnNvcihyZXMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXMuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG9ubHkgcmV0dXJucyBhZnRlciB0aGUgaW5pdGlhbCBhZGRlZCBjYWxsYmFja3MgaGF2ZSBydW4uXG4gICAgICAvLyBtYXJrIHN1YnNjcmlwdGlvbiBhcyByZWFkeS5cbiAgICAgIHNlbGYucmVhZHkoKTtcbiAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShyZXMpKSB7XG4gICAgICAvLyBjaGVjayBhbGwgdGhlIGVsZW1lbnRzIGFyZSBjdXJzb3JzXG4gICAgICBpZiAoISBfLmFsbChyZXMsIGlzQ3Vyc29yKSkge1xuICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcIlB1Ymxpc2ggZnVuY3Rpb24gcmV0dXJuZWQgYW4gYXJyYXkgb2Ygbm9uLUN1cnNvcnNcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIGR1cGxpY2F0ZSBjb2xsZWN0aW9uIG5hbWVzXG4gICAgICAvLyBYWFggd2Ugc2hvdWxkIHN1cHBvcnQgb3ZlcmxhcHBpbmcgY3Vyc29ycywgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB0aGVcbiAgICAgIC8vIG1lcmdlIGJveCB0byBhbGxvdyBvdmVybGFwIHdpdGhpbiBhIHN1YnNjcmlwdGlvblxuICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lcyA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lID0gcmVzW2ldLl9nZXRDb2xsZWN0aW9uTmFtZSgpO1xuICAgICAgICBpZiAoXy5oYXMoY29sbGVjdGlvbk5hbWVzLCBjb2xsZWN0aW9uTmFtZSkpIHtcbiAgICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBtdWx0aXBsZSBjdXJzb3JzIGZvciBjb2xsZWN0aW9uIFwiICtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbk5hbWUpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sbGVjdGlvbk5hbWVzW2NvbGxlY3Rpb25OYW1lXSA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBfLmVhY2gocmVzLCBmdW5jdGlvbiAoY3VyKSB7XG4gICAgICAgICAgY3VyLl9wdWJsaXNoQ3Vyc29yKHNlbGYpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAocmVzKSB7XG4gICAgICAvLyB0cnV0aHkgdmFsdWVzIG90aGVyIHRoYW4gY3Vyc29ycyBvciBhcnJheXMgYXJlIHByb2JhYmx5IGFcbiAgICAgIC8vIHVzZXIgbWlzdGFrZSAocG9zc2libGUgcmV0dXJuaW5nIGEgTW9uZ28gZG9jdW1lbnQgdmlhLCBzYXksXG4gICAgICAvLyBgY29sbC5maW5kT25lKClgKS5cbiAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiBjYW4gb25seSByZXR1cm4gYSBDdXJzb3Igb3IgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXCJhbiBhcnJheSBvZiBDdXJzb3JzXCIpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhpcyBjYWxscyBhbGwgc3RvcCBjYWxsYmFja3MgYW5kIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gdXBkYXRpbmcgYW55XG4gIC8vIFNlc3Npb25Db2xsZWN0aW9uVmlld3MgZnVydGhlci4gSXQncyB1c2VkIHdoZW4gdGhlIHVzZXIgdW5zdWJzY3JpYmVzIG9yXG4gIC8vIGRpc2Nvbm5lY3RzLCBhcyB3ZWxsIGFzIGR1cmluZyBzZXRVc2VySWQgcmUtcnVucy4gSXQgZG9lcyAqTk9UKiBzZW5kXG4gIC8vIHJlbW92ZWQgbWVzc2FnZXMgZm9yIHRoZSBwdWJsaXNoZWQgb2JqZWN0czsgaWYgdGhhdCBpcyBuZWNlc3NhcnksIGNhbGxcbiAgLy8gX3JlbW92ZUFsbERvY3VtZW50cyBmaXJzdC5cbiAgX2RlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5fZGVhY3RpdmF0ZWQpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fZGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgIHNlbGYuX2NhbGxTdG9wQ2FsbGJhY2tzKCk7XG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInN1YnNjcmlwdGlvbnNcIiwgLTEpO1xuICB9LFxuXG4gIF9jYWxsU3RvcENhbGxiYWNrczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyB0ZWxsIGxpc3RlbmVycywgc28gdGhleSBjYW4gY2xlYW4gdXBcbiAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5fc3RvcENhbGxiYWNrcztcbiAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG4gICAgXy5lYWNoKGNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNlbmQgcmVtb3ZlIG1lc3NhZ2VzIGZvciBldmVyeSBkb2N1bWVudC5cbiAgX3JlbW92ZUFsbERvY3VtZW50czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29sbGVjdGlvbkRvY3MsIGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgICAgIGNvbGxlY3Rpb25Eb2NzLmZvckVhY2goZnVuY3Rpb24gKHN0cklkKSB7XG4gICAgICAgICAgc2VsZi5yZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBzZWxmLl9pZEZpbHRlci5pZFBhcnNlKHN0cklkKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIG5ldyBTdWJzY3JpcHRpb24gZm9yIHRoZSBzYW1lIHNlc3Npb24gd2l0aCB0aGUgc2FtZVxuICAvLyBpbml0aWFsIGNyZWF0aW9uIHBhcmFtZXRlcnMuIFRoaXMgaXNuJ3QgYSBjbG9uZTogaXQgZG9lc24ndCBoYXZlXG4gIC8vIHRoZSBzYW1lIF9kb2N1bWVudHMgY2FjaGUsIHN0b3BwZWQgc3RhdGUgb3IgY2FsbGJhY2tzOyBtYXkgaGF2ZSBhXG4gIC8vIGRpZmZlcmVudCBfc3Vic2NyaXB0aW9uSGFuZGxlLCBhbmQgZ2V0cyBpdHMgdXNlcklkIGZyb20gdGhlXG4gIC8vIHNlc3Npb24sIG5vdCBmcm9tIHRoaXMgb2JqZWN0LlxuICBfcmVjcmVhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLl9zZXNzaW9uLCBzZWxmLl9oYW5kbGVyLCBzZWxmLl9zdWJzY3JpcHRpb25JZCwgc2VsZi5fcGFyYW1zLFxuICAgICAgc2VsZi5fbmFtZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24sIHRyaWdnZXJpbmcgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblN0b3BgIGNhbGxiYWNrIHBhc3NlZCB0byBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS4gSWYgYGVycm9yYCBpcyBub3QgYSBbYE1ldGVvci5FcnJvcmBdKCNtZXRlb3JfZXJyb3IpLCBpdCB3aWxsIGJlIFtzYW5pdGl6ZWRdKCNtZXRlb3JfZXJyb3IpLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byBwYXNzIHRvIHRoZSBjbGllbnQuXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCwgZXJyb3IpO1xuICB9LFxuXG4gIC8vIE5vdGUgdGhhdCB3aGlsZSBvdXIgRERQIGNsaWVudCB3aWxsIG5vdGljZSB0aGF0IHlvdSd2ZSBjYWxsZWQgc3RvcCgpIG9uIHRoZVxuICAvLyBzZXJ2ZXIgKGFuZCBjbGVhbiB1cCBpdHMgX3N1YnNjcmlwdGlvbnMgdGFibGUpIHdlIGRvbid0IGFjdHVhbGx5IHByb3ZpZGUgYVxuICAvLyBtZWNoYW5pc20gZm9yIGFuIGFwcCB0byBub3RpY2UgdGhpcyAodGhlIHN1YnNjcmliZSBvbkVycm9yIGNhbGxiYWNrIG9ubHlcbiAgLy8gdHJpZ2dlcnMgaWYgdGhlcmUgaXMgYW4gZXJyb3IpLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIFN0b3BzIHRoaXMgY2xpZW50J3Mgc3Vic2NyaXB0aW9uIGFuZCBpbnZva2VzIHRoZSBjbGllbnQncyBgb25TdG9wYCBjYWxsYmFjayB3aXRoIG5vIGVycm9yLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBzdG9wcGVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBvblN0b3A6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYWxsYmFjayA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoY2FsbGJhY2ssICdvblN0b3AgY2FsbGJhY2snLCBzZWxmKTtcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgY2FsbGJhY2soKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWIgaGFzIGJlZW4gZGVhY3RpdmF0ZWQsICpPUiogaWYgdGhlIHNlc3Npb24gd2FzXG4gIC8vIGRlc3Ryb3llZCBidXQgdGhlIGRlZmVycmVkIGNhbGwgdG8gX2RlYWN0aXZhdGVBbGxTdWJzY3JpcHRpb25zIGhhc24ndFxuICAvLyBoYXBwZW5lZCB5ZXQuXG4gIF9pc0RlYWN0aXZhdGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLl9kZWFjdGl2YXRlZCB8fCBzZWxmLl9zZXNzaW9uLmluUXVldWUgPT09IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIG5ldyBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIG5ldyBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBsZXQgaWRzID0gc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSk7XG4gICAgaWYgKGlkcyA9PSBudWxsKSB7XG4gICAgICBpZHMgPSBuZXcgU2V0KCk7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuc2V0KGNvbGxlY3Rpb25OYW1lLCBpZHMpO1xuICAgIH1cbiAgICBpZHMuYWRkKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmFkZGVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhIGRvY3VtZW50IGluIHRoZSByZWNvcmQgc2V0IGhhcyBiZWVuIG1vZGlmaWVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgY2hhbmdlZCBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkLCB0b2dldGhlciB3aXRoIHRoZWlyIG5ldyB2YWx1ZXMuICBJZiBhIGZpZWxkIGlzIG5vdCBwcmVzZW50IGluIGBmaWVsZHNgIGl0IHdhcyBsZWZ0IHVuY2hhbmdlZDsgaWYgaXQgaXMgcHJlc2VudCBpbiBgZmllbGRzYCBhbmQgaGFzIGEgdmFsdWUgb2YgYHVuZGVmaW5lZGAgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBJZiBgX2lkYCBpcyBwcmVzZW50IGl0IGlzIGlnbm9yZWQuXG4gICAqL1xuICBjaGFuZ2VkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmNoYW5nZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZWNvcmQgc2V0LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIC8vIFdlIGRvbid0IGJvdGhlciB0byBkZWxldGUgc2V0cyBvZiB0aGluZ3MgaW4gYSBjb2xsZWN0aW9uIGlmIHRoZVxuICAgIC8vIGNvbGxlY3Rpb24gaXMgZW1wdHkuICBJdCBjb3VsZCBicmVhayBfcmVtb3ZlQWxsRG9jdW1lbnRzLlxuICAgIHNlbGYuX2RvY3VtZW50cy5nZXQoY29sbGVjdGlvbk5hbWUpLmRlbGV0ZShpZCk7XG4gICAgc2VsZi5fc2Vzc2lvbi5yZW1vdmVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYW4gaW5pdGlhbCwgY29tcGxldGUgc25hcHNob3Qgb2YgdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gc2VudC4gIFRoaXMgd2lsbCB0cmlnZ2VyIGEgY2FsbCBvbiB0aGUgY2xpZW50IHRvIHRoZSBgb25SZWFkeWAgY2FsbGJhY2sgcGFzc2VkIHRvICBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgcmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXNlbGYuX3N1YnNjcmlwdGlvbklkKVxuICAgICAgcmV0dXJuOyAgLy8gdW5uZWNlc3NhcnkgYnV0IGlnbm9yZWQgZm9yIHVuaXZlcnNhbCBzdWJcbiAgICBpZiAoIXNlbGYuX3JlYWR5KSB7XG4gICAgICBzZWxmLl9zZXNzaW9uLnNlbmRSZWFkeShbc2VsZi5fc3Vic2NyaXB0aW9uSWRdKTtcbiAgICAgIHNlbGYuX3JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblNlcnZlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBUaGUgZGVmYXVsdCBoZWFydGJlYXQgaW50ZXJ2YWwgaXMgMzAgc2Vjb25kcyBvbiB0aGUgc2VydmVyIGFuZCAzNVxuICAvLyBzZWNvbmRzIG9uIHRoZSBjbGllbnQuICBTaW5jZSB0aGUgY2xpZW50IGRvZXNuJ3QgbmVlZCB0byBzZW5kIGFcbiAgLy8gcGluZyBhcyBsb25nIGFzIGl0IGlzIHJlY2VpdmluZyBwaW5ncywgdGhpcyBtZWFucyB0aGF0IHBpbmdzXG4gIC8vIG5vcm1hbGx5IGdvIGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50LlxuICAvL1xuICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gIHNlbGYub3B0aW9ucyA9IF8uZGVmYXVsdHMob3B0aW9ucyB8fCB7fSwge1xuICAgIGhlYXJ0YmVhdEludGVydmFsOiAxNTAwMCxcbiAgICBoZWFydGJlYXRUaW1lb3V0OiAxNTAwMCxcbiAgICAvLyBGb3IgdGVzdGluZywgYWxsb3cgcmVzcG9uZGluZyB0byBwaW5ncyB0byBiZSBkaXNhYmxlZC5cbiAgICByZXNwb25kVG9QaW5nczogdHJ1ZVxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGNvbWVzIGluIHRvIHRoZVxuICAvLyBzZXJ2ZXIgYW5kIGNvbXBsZXRlcyBERFAgdmVyc2lvbiBuZWdvdGlhdGlvbi4gVXNlIGFuIG9iamVjdCBpbnN0ZWFkXG4gIC8vIG9mIGFuIGFycmF5IHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIG9uZSBmcm9tIHRoZSBsaXN0IHdoaWxlXG4gIC8vIGl0ZXJhdGluZyBvdmVyIGl0LlxuICBzZWxmLm9uQ29ubmVjdGlvbkhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25Db25uZWN0aW9uIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgLy8gTWFwIG9mIGNhbGxiYWNrcyB0byBjYWxsIHdoZW4gYSBuZXcgbWVzc2FnZSBjb21lcyBpbi5cbiAgc2VsZi5vbk1lc3NhZ2VIb29rID0gbmV3IEhvb2soe1xuICAgIGRlYnVnUHJpbnRFeGNlcHRpb25zOiBcIm9uTWVzc2FnZSBjYWxsYmFja1wiXG4gIH0pO1xuXG4gIHNlbGYucHVibGlzaF9oYW5kbGVycyA9IHt9O1xuICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzID0gW107XG5cbiAgc2VsZi5tZXRob2RfaGFuZGxlcnMgPSB7fTtcblxuICBzZWxmLnNlc3Npb25zID0gbmV3IE1hcCgpOyAvLyBtYXAgZnJvbSBpZCB0byBzZXNzaW9uXG5cbiAgc2VsZi5zdHJlYW1fc2VydmVyID0gbmV3IFN0cmVhbVNlcnZlcjtcblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIucmVnaXN0ZXIoZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIHNvY2tldCBpbXBsZW1lbnRzIHRoZSBTb2NrSlNDb25uZWN0aW9uIGludGVyZmFjZVxuICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG5cbiAgICB2YXIgc2VuZEVycm9yID0gZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgICAgdmFyIG1zZyA9IHttc2c6ICdlcnJvcicsIHJlYXNvbjogcmVhc29ufTtcbiAgICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH07XG5cbiAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbiAocmF3X21zZykge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRSZWNlaXZlZEREUCkge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiUmVjZWl2ZWQgRERQXCIsIHJhd19tc2cpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgbXNnID0gRERQQ29tbW9uLnBhcnNlRERQKHJhd19tc2cpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ1BhcnNlIGVycm9yJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtc2cgPT09IG51bGwgfHwgIW1zZy5tc2cpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobXNnLm1zZyA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgICAgc2VuZEVycm9yKFwiQWxyZWFkeSBjb25uZWN0ZWRcIiwgbXNnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5faGFuZGxlQ29ubmVjdChzb2NrZXQsIG1zZyk7XG4gICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb2NrZXQuX21ldGVvclNlc3Npb24pIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ011c3QgY29ubmVjdCBmaXJzdCcsIG1zZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5wcm9jZXNzTWVzc2FnZShtc2cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBYWFggcHJpbnQgc3RhY2sgbmljZWx5XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJJbnRlcm5hbCBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBtZXNzYWdlXCIsIG1zZywgZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIH0pLnJ1bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbl8uZXh0ZW5kKFNlcnZlci5wcm90b3R5cGUsIHtcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBvbkNvbm5lY3Rpb246IGZ1bmN0aW9uIChmbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5vbkNvbm5lY3Rpb25Ib29rLnJlZ2lzdGVyKGZuKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uTWVzc2FnZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uTWVzc2FnZUhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIF9oYW5kbGVDb25uZWN0OiBmdW5jdGlvbiAoc29ja2V0LCBtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBUaGUgY29ubmVjdCBtZXNzYWdlIG11c3Qgc3BlY2lmeSBhIHZlcnNpb24gYW5kIGFuIGFycmF5IG9mIHN1cHBvcnRlZFxuICAgIC8vIHZlcnNpb25zLCBhbmQgaXQgbXVzdCBjbGFpbSB0byBzdXBwb3J0IHdoYXQgaXQgaXMgcHJvcG9zaW5nLlxuICAgIGlmICghKHR5cGVvZiAobXNnLnZlcnNpb24pID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIF8uaXNBcnJheShtc2cuc3VwcG9ydCkgJiZcbiAgICAgICAgICBfLmFsbChtc2cuc3VwcG9ydCwgXy5pc1N0cmluZykgJiZcbiAgICAgICAgICBfLmNvbnRhaW5zKG1zZy5zdXBwb3J0LCBtc2cudmVyc2lvbikpKSB7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKHttc2c6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OU1swXX0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIHRoZSBmdXR1cmUsIGhhbmRsZSBzZXNzaW9uIHJlc3VtcHRpb246IHNvbWV0aGluZyBsaWtlOlxuICAgIC8vICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBzZWxmLnNlc3Npb25zW21zZy5zZXNzaW9uXVxuICAgIHZhciB2ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lvbihtc2cuc3VwcG9ydCwgRERQQ29tbW9uLlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMpO1xuXG4gICAgaWYgKG1zZy52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAvLyBUaGUgYmVzdCB2ZXJzaW9uIHRvIHVzZSAoYWNjb3JkaW5nIHRvIHRoZSBjbGllbnQncyBzdGF0ZWQgcHJlZmVyZW5jZXMpXG4gICAgICAvLyBpcyBub3QgdGhlIG9uZSB0aGUgY2xpZW50IGlzIHRyeWluZyB0byB1c2UuIEluZm9ybSB0aGVtIGFib3V0IHRoZSBiZXN0XG4gICAgICAvLyB2ZXJzaW9uIHRvIHVzZS5cbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsIHZlcnNpb246IHZlcnNpb259KSk7XG4gICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBZYXksIHZlcnNpb24gbWF0Y2hlcyEgQ3JlYXRlIGEgbmV3IHNlc3Npb24uXG4gICAgLy8gTm90ZTogVHJvcG9zcGhlcmUgZGVwZW5kcyBvbiB0aGUgYWJpbGl0eSB0byBtdXRhdGVcbiAgICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbmV3IFNlc3Npb24oc2VsZiwgdmVyc2lvbiwgc29ja2V0LCBzZWxmLm9wdGlvbnMpO1xuICAgIHNlbGYuc2Vzc2lvbnMuc2V0KHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5pZCwgc29ja2V0Ll9tZXRlb3JTZXNzaW9uKTtcbiAgICBzZWxmLm9uQ29ubmVjdGlvbkhvb2suZWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGlmIChzb2NrZXQuX21ldGVvclNlc3Npb24pXG4gICAgICAgIGNhbGxiYWNrKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBwdWJsaXNoIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIHtTdHJpbmd9IGlkZW50aWZpZXIgZm9yIHF1ZXJ5XG4gICAqIEBwYXJhbSBoYW5kbGVyIHtGdW5jdGlvbn0gcHVibGlzaCBoYW5kbGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtPYmplY3R9XG4gICAqXG4gICAqIFNlcnZlciB3aWxsIGNhbGwgaGFuZGxlciBmdW5jdGlvbiBvbiBlYWNoIG5ldyBzdWJzY3JpcHRpb24sXG4gICAqIGVpdGhlciB3aGVuIHJlY2VpdmluZyBERFAgc3ViIG1lc3NhZ2UgZm9yIGEgbmFtZWQgc3Vic2NyaXB0aW9uLCBvciBvblxuICAgKiBERFAgY29ubmVjdCBmb3IgYSB1bml2ZXJzYWwgc3Vic2NyaXB0aW9uLlxuICAgKlxuICAgKiBJZiBuYW1lIGlzIG51bGwsIHRoaXMgd2lsbCBiZSBhIHN1YnNjcmlwdGlvbiB0aGF0IGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZWQgYW5kIHBlcm1hbmVudGx5IG9uIGZvciBhbGwgY29ubmVjdGVkXG4gICAqIGNsaWVudCwgaW5zdGVhZCBvZiBhIHN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB0dXJuZWQgb24gYW5kIG9mZlxuICAgKiB3aXRoIHN1YnNjcmliZSgpLlxuICAgKlxuICAgKiBvcHRpb25zIHRvIGNvbnRhaW46XG4gICAqICAtIChtb3N0bHkgaW50ZXJuYWwpIGlzX2F1dG86IHRydWUgaWYgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICogICAgZnJvbSBhbiBhdXRvcHVibGlzaCBob29rLiB0aGlzIGlzIGZvciBjb3NtZXRpYyBwdXJwb3NlcyBvbmx5XG4gICAqICAgIChpdCBsZXRzIHVzIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IGEgd2FybmluZyBzdWdnZXN0aW5nXG4gICAqICAgIHRoYXQgeW91IHR1cm4gb2ZmIGF1dG9wdWJsaXNoLilcbiAgICovXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFB1Ymxpc2ggYSByZWNvcmQgc2V0LlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWUgSWYgU3RyaW5nLCBuYW1lIG9mIHRoZSByZWNvcmQgc2V0LiAgSWYgT2JqZWN0LCBwdWJsaWNhdGlvbnMgRGljdGlvbmFyeSBvZiBwdWJsaXNoIGZ1bmN0aW9ucyBieSBuYW1lLiAgSWYgYG51bGxgLCB0aGUgc2V0IGhhcyBubyBuYW1lLCBhbmQgdGhlIHJlY29yZCBzZXQgaXMgYXV0b21hdGljYWxseSBzZW50IHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiBjYWxsZWQgb24gdGhlIHNlcnZlciBlYWNoIHRpbWUgYSBjbGllbnQgc3Vic2NyaWJlcy4gIEluc2lkZSB0aGUgZnVuY3Rpb24sIGB0aGlzYCBpcyB0aGUgcHVibGlzaCBoYW5kbGVyIG9iamVjdCwgZGVzY3JpYmVkIGJlbG93LiAgSWYgdGhlIGNsaWVudCBwYXNzZWQgYXJndW1lbnRzIHRvIGBzdWJzY3JpYmVgLCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLlxuICAgKi9cbiAgcHVibGlzaDogZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoISBfLmlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKG5hbWUgJiYgbmFtZSBpbiBzZWxmLnB1Ymxpc2hfaGFuZGxlcnMpIHtcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIklnbm9yaW5nIGR1cGxpY2F0ZSBwdWJsaXNoIG5hbWVkICdcIiArIG5hbWUgKyBcIidcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFBhY2thZ2UuYXV0b3B1Ymxpc2ggJiYgIW9wdGlvbnMuaXNfYXV0bykge1xuICAgICAgICAvLyBUaGV5IGhhdmUgYXV0b3B1Ymxpc2ggb24sIHlldCB0aGV5J3JlIHRyeWluZyB0byBtYW51YWxseVxuICAgICAgICAvLyBwaWNraW5nIHN0dWZmIHRvIHB1Ymxpc2guIFRoZXkgcHJvYmFibHkgc2hvdWxkIHR1cm4gb2ZmXG4gICAgICAgIC8vIGF1dG9wdWJsaXNoLiAoVGhpcyBjaGVjayBpc24ndCBwZXJmZWN0IC0tIGlmIHlvdSBjcmVhdGUgYVxuICAgICAgICAvLyBwdWJsaXNoIGJlZm9yZSB5b3UgdHVybiBvbiBhdXRvcHVibGlzaCwgaXQgd29uJ3QgY2F0Y2hcbiAgICAgICAgLy8gaXQuIEJ1dCB0aGlzIHdpbGwgZGVmaW5pdGVseSBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlXG4gICAgICAgIC8vIHlvdSd2ZSBhZGRlZCB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZSB0byB5b3VyIGFwcCwgYW5kIGFyZVxuICAgICAgICAvLyBjYWxsaW5nIHB1Ymxpc2ggZnJvbSB5b3VyIGFwcCBjb2RlLilcbiAgICAgICAgaWYgKCFzZWxmLndhcm5lZF9hYm91dF9hdXRvcHVibGlzaCkge1xuICAgICAgICAgIHNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoID0gdHJ1ZTtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFxuICAgIFwiKiogWW91J3ZlIHNldCB1cCBzb21lIGRhdGEgc3Vic2NyaXB0aW9ucyB3aXRoIE1ldGVvci5wdWJsaXNoKCksIGJ1dFxcblwiICtcbiAgICBcIioqIHlvdSBzdGlsbCBoYXZlIGF1dG9wdWJsaXNoIHR1cm5lZCBvbi4gQmVjYXVzZSBhdXRvcHVibGlzaCBpcyBzdGlsbFxcblwiICtcbiAgICBcIioqIG9uLCB5b3VyIE1ldGVvci5wdWJsaXNoKCkgY2FsbHMgd29uJ3QgaGF2ZSBtdWNoIGVmZmVjdC4gQWxsIGRhdGFcXG5cIiArXG4gICAgXCIqKiB3aWxsIHN0aWxsIGJlIHNlbnQgdG8gYWxsIGNsaWVudHMuXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiBUdXJuIG9mZiBhdXRvcHVibGlzaCBieSByZW1vdmluZyB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZTpcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqICAgJCBtZXRlb3IgcmVtb3ZlIGF1dG9wdWJsaXNoXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiAuLiBhbmQgbWFrZSBzdXJlIHlvdSBoYXZlIE1ldGVvci5wdWJsaXNoKCkgYW5kIE1ldGVvci5zdWJzY3JpYmUoKSBjYWxsc1xcblwiICtcbiAgICBcIioqIGZvciBlYWNoIGNvbGxlY3Rpb24gdGhhdCB5b3Ugd2FudCBjbGllbnRzIHRvIHNlZS5cXG5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUpXG4gICAgICAgIHNlbGYucHVibGlzaF9oYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXI7XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VsZi51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICAvLyBTcGluIHVwIHRoZSBuZXcgcHVibGlzaGVyIG9uIGFueSBleGlzdGluZyBzZXNzaW9uIHRvby4gUnVuIGVhY2hcbiAgICAgICAgLy8gc2Vzc2lvbidzIHN1YnNjcmlwdGlvbiBpbiBhIG5ldyBGaWJlciwgc28gdGhhdCB0aGVyZSdzIG5vIGNoYW5nZSBmb3JcbiAgICAgICAgLy8gc2VsZi5zZXNzaW9ucyB0byBjaGFuZ2Ugd2hpbGUgd2UncmUgcnVubmluZyB0aGlzIGxvb3AuXG4gICAgICAgIHNlbGYuc2Vzc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIGlmICghc2Vzc2lvbi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3Vicykge1xuICAgICAgICAgICAgRmliZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlc3Npb24uX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIF8uZWFjaChuYW1lLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHNlbGYucHVibGlzaChrZXksIHZhbHVlLCB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZVNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb24uaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBpbnZva2VkIG92ZXIgdGhlIG5ldHdvcmsgYnkgY2xpZW50cy5cbiAgICogQGxvY3VzIEFueXdoZXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtZXRob2RzIERpY3Rpb25hcnkgd2hvc2Uga2V5cyBhcmUgbWV0aG9kIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGZ1bmN0aW9ucy5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBtZXRob2RzOiBmdW5jdGlvbiAobWV0aG9kcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBfLmVhY2gobWV0aG9kcywgZnVuY3Rpb24gKGZ1bmMsIG5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kICdcIiArIG5hbWUgKyBcIicgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgaWYgKHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIG1ldGhvZCBuYW1lZCAnXCIgKyBuYW1lICsgXCInIGlzIGFscmVhZHkgZGVmaW5lZFwiKTtcbiAgICAgIHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdID0gZnVuYztcbiAgICB9KTtcbiAgfSxcblxuICBjYWxsOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHJlc3VsdCBjYWxsYmFjaywgbm90XG4gICAgICAvLyBhIHBhcmFtZXRlciB0byB0aGUgcmVtb3RlIG1ldGhvZC5cbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHkobmFtZSwgYXJncywgY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIEEgdmVyc2lvbiBvZiB0aGUgY2FsbCBtZXRob2QgdGhhdCBhbHdheXMgcmV0dXJucyBhIFByb21pc2UuXG4gIGNhbGxBc3luYzogZnVuY3Rpb24gKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MpO1xuICB9LFxuXG4gIGFwcGx5OiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAvLyBXZSB3ZXJlIHBhc3NlZCAzIGFyZ3VtZW50cy4gVGhleSBtYXkgYmUgZWl0aGVyIChuYW1lLCBhcmdzLCBvcHRpb25zKVxuICAgIC8vIG9yIChuYW1lLCBhcmdzLCBjYWxsYmFjaylcbiAgICBpZiAoISBjYWxsYmFjayAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaW4gd2hpY2hldmVyIHdheSB0aGUgY2FsbGVyIGFza2VkIGZvciBpdC4gTm90ZSB0aGF0IHdlXG4gICAgLy8gZG8gTk9UIGJsb2NrIG9uIHRoZSB3cml0ZSBmZW5jZSBpbiBhbiBhbmFsb2dvdXMgd2F5IHRvIGhvdyB0aGUgY2xpZW50XG4gICAgLy8gYmxvY2tzIG9uIHRoZSByZWxldmFudCBkYXRhIGJlaW5nIHZpc2libGUsIHNvIHlvdSBhcmUgTk9UIGd1YXJhbnRlZWQgdGhhdFxuICAgIC8vIGN1cnNvciBvYnNlcnZlIGNhbGxiYWNrcyBoYXZlIGZpcmVkIHdoZW4geW91ciBjYWxsYmFjayBpcyBpbnZva2VkLiAoV2VcbiAgICAvLyBjYW4gY2hhbmdlIHRoaXMgaWYgdGhlcmUncyBhIHJlYWwgdXNlIGNhc2UuKVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcHJvbWlzZS50aGVuKFxuICAgICAgICByZXN1bHQgPT4gY2FsbGJhY2sodW5kZWZpbmVkLCByZXN1bHQpLFxuICAgICAgICBleGNlcHRpb24gPT4gY2FsbGJhY2soZXhjZXB0aW9uKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb21pc2UuYXdhaXQoKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHBhcmFtIG9wdGlvbnMge09wdGlvbmFsIE9iamVjdH1cbiAgYXBwbHlBc3luYzogZnVuY3Rpb24gKG5hbWUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAvLyBSdW4gdGhlIGhhbmRsZXJcbiAgICB2YXIgaGFuZGxlciA9IHRoaXMubWV0aG9kX2hhbmRsZXJzW25hbWVdO1xuICAgIGlmICghIGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IE1ldGVvci5FcnJvcig0MDQsIGBNZXRob2QgJyR7bmFtZX0nIG5vdCBmb3VuZGApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSBtZXRob2QgY2FsbCBmcm9tIHdpdGhpbiBhbm90aGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLFxuICAgIC8vIGdldCB0aGUgdXNlciBzdGF0ZSBmcm9tIHRoZSBvdXRlciBtZXRob2Qgb3IgcHVibGlzaCBmdW5jdGlvbiwgb3RoZXJ3aXNlXG4gICAgLy8gZG9uJ3QgYWxsb3cgc2V0VXNlcklkIHRvIGJlIGNhbGxlZFxuICAgIHZhciB1c2VySWQgPSBudWxsO1xuICAgIHZhciBzZXRVc2VySWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNhbGwgc2V0VXNlcklkIG9uIGEgc2VydmVyIGluaXRpYXRlZCBtZXRob2QgY2FsbFwiKTtcbiAgICB9O1xuICAgIHZhciBjb25uZWN0aW9uID0gbnVsbDtcbiAgICB2YXIgY3VycmVudE1ldGhvZEludm9jYXRpb24gPSBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uID0gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciByYW5kb21TZWVkID0gbnVsbDtcbiAgICBpZiAoY3VycmVudE1ldGhvZEludm9jYXRpb24pIHtcbiAgICAgIHVzZXJJZCA9IGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudE1ldGhvZEludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICAgIHJhbmRvbVNlZWQgPSBERFBDb21tb24ubWFrZVJwY1NlZWQoY3VycmVudE1ldGhvZEludm9jYXRpb24sIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi51c2VySWQ7XG4gICAgICBzZXRVc2VySWQgPSBmdW5jdGlvbih1c2VySWQpIHtcbiAgICAgICAgY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5fc2Vzc2lvbi5fc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9O1xuICAgICAgY29ubmVjdGlvbiA9IGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgaW52b2NhdGlvbiA9IG5ldyBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvbih7XG4gICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgdXNlcklkLFxuICAgICAgc2V0VXNlcklkLFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIHJhbmRvbVNlZWRcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlc29sdmUoXG4gICAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgaW52b2NhdGlvbixcbiAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIEVKU09OLmNsb25lKGFyZ3MpLFxuICAgICAgICAgIFwiaW50ZXJuYWwgY2FsbCB0byAnXCIgKyBuYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkpLnRoZW4oRUpTT04uY2xvbmUpO1xuICB9LFxuXG4gIF91cmxGb3JTZXNzaW9uOiBmdW5jdGlvbiAoc2Vzc2lvbklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzZXNzaW9uID0gc2VsZi5zZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoc2Vzc2lvbilcbiAgICAgIHJldHVybiBzZXNzaW9uLl9zb2NrZXRVcmw7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG52YXIgY2FsY3VsYXRlVmVyc2lvbiA9IGZ1bmN0aW9uIChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFZlcnNpb25zKSB7XG4gIHZhciBjb3JyZWN0VmVyc2lvbiA9IF8uZmluZChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucywgZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICByZXR1cm4gXy5jb250YWlucyhzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9ucywgdmVyc2lvbik7XG4gIH0pO1xuICBpZiAoIWNvcnJlY3RWZXJzaW9uKSB7XG4gICAgY29ycmVjdFZlcnNpb24gPSBzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9uc1swXTtcbiAgfVxuICByZXR1cm4gY29ycmVjdFZlcnNpb247XG59O1xuXG5ERFBTZXJ2ZXIuX2NhbGN1bGF0ZVZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uO1xuXG5cbi8vIFwiYmxpbmRcIiBleGNlcHRpb25zIG90aGVyIHRoYW4gdGhvc2UgdGhhdCB3ZXJlIGRlbGliZXJhdGVseSB0aHJvd24gdG8gc2lnbmFsXG4vLyBlcnJvcnMgdG8gdGhlIGNsaWVudFxudmFyIHdyYXBJbnRlcm5hbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGNvbnRleHQpIHtcbiAgaWYgKCFleGNlcHRpb24pIHJldHVybiBleGNlcHRpb247XG5cbiAgLy8gVG8gYWxsb3cgcGFja2FnZXMgdG8gdGhyb3cgZXJyb3JzIGludGVuZGVkIGZvciB0aGUgY2xpZW50IGJ1dCBub3QgaGF2ZSB0b1xuICAvLyBkZXBlbmQgb24gdGhlIE1ldGVvci5FcnJvciBjbGFzcywgYGlzQ2xpZW50U2FmZWAgY2FuIGJlIHNldCB0byB0cnVlIG9uIGFueVxuICAvLyBlcnJvciBiZWZvcmUgaXQgaXMgdGhyb3duLlxuICBpZiAoZXhjZXB0aW9uLmlzQ2xpZW50U2FmZSkge1xuICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE1ldGVvci5FcnJvcikpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWVzc2FnZSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE1ldGVvci5FcnJvcihleGNlcHRpb24uZXJyb3IsIGV4Y2VwdGlvbi5yZWFzb24sIGV4Y2VwdGlvbi5kZXRhaWxzKTtcbiAgICAgIGV4Y2VwdGlvbi5tZXNzYWdlID0gb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gZXhjZXB0aW9uO1xuICB9XG5cbiAgLy8gVGVzdHMgY2FuIHNldCB0aGUgJ19leHBlY3RlZEJ5VGVzdCcgZmxhZyBvbiBhbiBleGNlcHRpb24gc28gaXQgd29uJ3QgZ28gdG9cbiAgLy8gdGhlIHNlcnZlciBsb2cuXG4gIGlmICghZXhjZXB0aW9uLl9leHBlY3RlZEJ5VGVzdCkge1xuICAgIE1ldGVvci5fZGVidWcoXCJFeGNlcHRpb24gXCIgKyBjb250ZXh0LCBleGNlcHRpb24pO1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICAgIE1ldGVvci5fZGVidWcoXCJTYW5pdGl6ZWQgYW5kIHJlcG9ydGVkIHRvIHRoZSBjbGllbnQgYXM6XCIsIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcik7XG4gICAgICBNZXRlb3IuX2RlYnVnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlkIHRoZSBlcnJvciBjb250YWluIG1vcmUgZGV0YWlscyB0aGF0IGNvdWxkIGhhdmUgYmVlbiB1c2VmdWwgaWYgY2F1Z2h0IGluXG4gIC8vIHNlcnZlciBjb2RlIChvciBpZiB0aHJvd24gZnJvbSBub24tY2xpZW50LW9yaWdpbmF0ZWQgY29kZSksIGJ1dCBhbHNvXG4gIC8vIHByb3ZpZGVkIGEgXCJzYW5pdGl6ZWRcIiB2ZXJzaW9uIHdpdGggbW9yZSBjb250ZXh0IHRoYW4gNTAwIEludGVybmFsIHNlcnZlclxuICAvLyBlcnJvcj8gVXNlIHRoYXQuXG4gIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICBpZiAoZXhjZXB0aW9uLnNhbml0aXplZEVycm9yLmlzQ2xpZW50U2FmZSlcbiAgICAgIHJldHVybiBleGNlcHRpb24uc2FuaXRpemVkRXJyb3I7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQgKyBcIiBwcm92aWRlcyBhIHNhbml0aXplZEVycm9yIHRoYXQgXCIgK1xuICAgICAgICAgICAgICAgICAgXCJkb2VzIG5vdCBoYXZlIGlzQ2xpZW50U2FmZSBwcm9wZXJ0eSBzZXQ7IGlnbm9yaW5nXCIpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcIkludGVybmFsIHNlcnZlciBlcnJvclwiKTtcbn07XG5cblxuLy8gQXVkaXQgYXJndW1lbnQgY2hlY2tzLCBpZiB0aGUgYXVkaXQtYXJndW1lbnQtY2hlY2tzIHBhY2thZ2UgZXhpc3RzIChpdCBpcyBhXG4vLyB3ZWFrIGRlcGVuZGVuY3kgb2YgdGhpcyBwYWNrYWdlKS5cbnZhciBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MgPSBmdW5jdGlvbiAoZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pIHtcbiAgYXJncyA9IGFyZ3MgfHwgW107XG4gIGlmIChQYWNrYWdlWydhdWRpdC1hcmd1bWVudC1jaGVja3MnXSkge1xuICAgIHJldHVybiBNYXRjaC5fZmFpbElmQXJndW1lbnRzQXJlTm90QWxsQ2hlY2tlZChcbiAgICAgIGYsIGNvbnRleHQsIGFyZ3MsIGRlc2NyaXB0aW9uKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShjb250ZXh0LCBhcmdzKTtcbn07XG4iLCJ2YXIgRnV0dXJlID0gTnBtLnJlcXVpcmUoJ2ZpYmVycy9mdXR1cmUnKTtcblxuLy8gQSB3cml0ZSBmZW5jZSBjb2xsZWN0cyBhIGdyb3VwIG9mIHdyaXRlcywgYW5kIHByb3ZpZGVzIGEgY2FsbGJhY2tcbi8vIHdoZW4gYWxsIG9mIHRoZSB3cml0ZXMgYXJlIGZ1bGx5IGNvbW1pdHRlZCBhbmQgcHJvcGFnYXRlZCAoYWxsXG4vLyBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIHRoZSB3cml0ZSBhbmQgYWNrbm93bGVkZ2VkIGl0Lilcbi8vXG5ERFBTZXJ2ZXIuX1dyaXRlRmVuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBzZWxmLmFybWVkID0gZmFsc2U7XG4gIHNlbGYuZmlyZWQgPSBmYWxzZTtcbiAgc2VsZi5yZXRpcmVkID0gZmFsc2U7XG4gIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzID0gMDtcbiAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xufTtcblxuLy8gVGhlIGN1cnJlbnQgd3JpdGUgZmVuY2UuIFdoZW4gdGhlcmUgaXMgYSBjdXJyZW50IHdyaXRlIGZlbmNlLCBjb2RlXG4vLyB0aGF0IHdyaXRlcyB0byBkYXRhYmFzZXMgc2hvdWxkIHJlZ2lzdGVyIHRoZWlyIHdyaXRlcyB3aXRoIGl0IHVzaW5nXG4vLyBiZWdpbldyaXRlKCkuXG4vL1xuRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZSA9IG5ldyBNZXRlb3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Xcml0ZUZlbmNlLnByb3RvdHlwZSwge1xuICAvLyBTdGFydCB0cmFja2luZyBhIHdyaXRlLCBhbmQgcmV0dXJuIGFuIG9iamVjdCB0byByZXByZXNlbnQgaXQuIFRoZVxuICAvLyBvYmplY3QgaGFzIGEgc2luZ2xlIG1ldGhvZCwgY29tbWl0dGVkKCkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZVxuICAvLyBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgaXMgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkLiBZb3UgY2FuXG4gIC8vIGNvbnRpbnVlIHRvIGFkZCB3cml0ZXMgdG8gdGhlIFdyaXRlRmVuY2UgdXAgdW50aWwgaXQgaXMgdHJpZ2dlcmVkXG4gIC8vIChjYWxscyBpdHMgY2FsbGJhY2tzIGJlY2F1c2UgYWxsIHdyaXRlcyBoYXZlIGNvbW1pdHRlZC4pXG4gIGJlZ2luV3JpdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZi5yZXRpcmVkKVxuICAgICAgcmV0dXJuIHsgY29tbWl0dGVkOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gYWRkIHdyaXRlc1wiKTtcblxuICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKys7XG4gICAgdmFyIGNvbW1pdHRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbW1pdHRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb21taXR0ZWQgY2FsbGVkIHR3aWNlIG9uIHRoZSBzYW1lIHdyaXRlXCIpO1xuICAgICAgICBjb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuICAgICAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEFybSB0aGUgZmVuY2UuIE9uY2UgdGhlIGZlbmNlIGlzIGFybWVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmVcbiAgLy8gdW5jb21taXR0ZWQgd3JpdGVzLCBpdCB3aWxsIGFjdGl2YXRlLlxuICBhcm06IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYgPT09IEREUFNlcnZlci5fQ3VycmVudFdyaXRlRmVuY2UuZ2V0KCkpXG4gICAgICB0aHJvdyBFcnJvcihcIkNhbid0IGFybSB0aGUgY3VycmVudCBmZW5jZVwiKTtcbiAgICBzZWxmLmFybWVkID0gdHJ1ZTtcbiAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBmaXJpbmcgdGhlIGZlbmNlLlxuICAvLyBDYWxsYmFjayBmdW5jdGlvbiBjYW4gYWRkIG5ldyB3cml0ZXMgdG8gdGhlIGZlbmNlLCBpbiB3aGljaCBjYXNlXG4gIC8vIGl0IHdvbid0IGZpcmUgdW50aWwgdGhvc2Ugd3JpdGVzIGFyZSBkb25lIGFzIHdlbGwuXG4gIG9uQmVmb3JlRmlyZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZW5jZSBmaXJlcy5cbiAgb25BbGxDb21taXR0ZWQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmVuY2UgaGFzIGFscmVhZHkgYWN0aXZhdGVkIC0tIHRvbyBsYXRlIHRvIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcImFkZCBhIGNhbGxiYWNrXCIpO1xuICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbi4gQXJtcyB0aGUgZmVuY2UsIHRoZW4gYmxvY2tzIHVudGlsIGl0IGZpcmVzLlxuICBhcm1BbmRXYWl0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlO1xuICAgIHNlbGYub25BbGxDb21taXR0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgZnV0dXJlWydyZXR1cm4nXSgpO1xuICAgIH0pO1xuICAgIHNlbGYuYXJtKCk7XG4gICAgZnV0dXJlLndhaXQoKTtcbiAgfSxcblxuICBfbWF5YmVGaXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid3JpdGUgZmVuY2UgYWxyZWFkeSBhY3RpdmF0ZWQ/XCIpO1xuICAgIGlmIChzZWxmLmFybWVkICYmICFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2sgKGZ1bmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmdW5jKHNlbGYpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFwiZXhjZXB0aW9uIGluIHdyaXRlIGZlbmNlIGNhbGxiYWNrXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICAgIHdoaWxlIChzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMtLTtcblxuICAgICAgaWYgKCFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgICBzZWxmLmZpcmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3M7XG4gICAgICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyBEZWFjdGl2YXRlIHRoaXMgZmVuY2Ugc28gdGhhdCBhZGRpbmcgbW9yZSB3cml0ZXMgaGFzIG5vIGVmZmVjdC5cbiAgLy8gVGhlIGZlbmNlIG11c3QgaGF2ZSBhbHJlYWR5IGZpcmVkLlxuICByZXRpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJldGlyZSBhIGZlbmNlIHRoYXQgaGFzbid0IGZpcmVkLlwiKTtcbiAgICBzZWxmLnJldGlyZWQgPSB0cnVlO1xuICB9XG59KTtcbiIsIi8vIEEgXCJjcm9zc2JhclwiIGlzIGEgY2xhc3MgdGhhdCBwcm92aWRlcyBzdHJ1Y3R1cmVkIG5vdGlmaWNhdGlvbiByZWdpc3RyYXRpb24uXG4vLyBTZWUgX21hdGNoIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBob3cgYSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIuXG4vLyBBbGwgbm90aWZpY2F0aW9ucyBhbmQgdHJpZ2dlcnMgbXVzdCBoYXZlIGEgc3RyaW5nIGtleSBuYW1lZCAnY29sbGVjdGlvbicuXG5cbkREUFNlcnZlci5fQ3Jvc3NiYXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHNlbGYubmV4dElkID0gMTtcbiAgLy8gbWFwIGZyb20gY29sbGVjdGlvbiBuYW1lIChzdHJpbmcpIC0+IGxpc3RlbmVyIGlkIC0+IG9iamVjdC4gZWFjaCBvYmplY3QgaGFzXG4gIC8vIGtleXMgJ3RyaWdnZXInLCAnY2FsbGJhY2snLiAgQXMgYSBoYWNrLCB0aGUgZW1wdHkgc3RyaW5nIG1lYW5zIFwibm9cbiAgLy8gY29sbGVjdGlvblwiLlxuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiA9IHt9O1xuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50ID0ge307XG4gIHNlbGYuZmFjdFBhY2thZ2UgPSBvcHRpb25zLmZhY3RQYWNrYWdlIHx8IFwibGl2ZWRhdGFcIjtcbiAgc2VsZi5mYWN0TmFtZSA9IG9wdGlvbnMuZmFjdE5hbWUgfHwgbnVsbDtcbn07XG5cbl8uZXh0ZW5kKEREUFNlcnZlci5fQ3Jvc3NiYXIucHJvdG90eXBlLCB7XG4gIC8vIG1zZyBpcyBhIHRyaWdnZXIgb3IgYSBub3RpZmljYXRpb25cbiAgX2NvbGxlY3Rpb25Gb3JNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghIF8uaGFzKG1zZywgJ2NvbGxlY3Rpb24nKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mKG1zZy5jb2xsZWN0aW9uKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChtc2cuY29sbGVjdGlvbiA9PT0gJycpXG4gICAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgZW1wdHkgY29sbGVjdGlvbiFcIik7XG4gICAgICByZXR1cm4gbXNnLmNvbGxlY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgbm9uLXN0cmluZyBjb2xsZWN0aW9uIVwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTGlzdGVuIGZvciBub3RpZmljYXRpb24gdGhhdCBtYXRjaCAndHJpZ2dlcicuIEEgbm90aWZpY2F0aW9uXG4gIC8vIG1hdGNoZXMgaWYgaXQgaGFzIHRoZSBrZXktdmFsdWUgcGFpcnMgaW4gdHJpZ2dlciBhcyBhXG4gIC8vIHN1YnNldC4gV2hlbiBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzLCBjYWxsICdjYWxsYmFjaycsIHBhc3NpbmdcbiAgLy8gdGhlIGFjdHVhbCBub3RpZmljYXRpb24uXG4gIC8vXG4gIC8vIFJldHVybnMgYSBsaXN0ZW4gaGFuZGxlLCB3aGljaCBpcyBhbiBvYmplY3Qgd2l0aCBhIG1ldGhvZFxuICAvLyBzdG9wKCkuIENhbGwgc3RvcCgpIHRvIHN0b3AgbGlzdGVuaW5nLlxuICAvL1xuICAvLyBYWFggSXQgc2hvdWxkIGJlIGxlZ2FsIHRvIGNhbGwgZmlyZSgpIGZyb20gaW5zaWRlIGEgbGlzdGVuKClcbiAgLy8gY2FsbGJhY2s/XG4gIGxpc3RlbjogZnVuY3Rpb24gKHRyaWdnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpZCA9IHNlbGYubmV4dElkKys7XG5cbiAgICB2YXIgY29sbGVjdGlvbiA9IHNlbGYuX2NvbGxlY3Rpb25Gb3JNZXNzYWdlKHRyaWdnZXIpO1xuICAgIHZhciByZWNvcmQgPSB7dHJpZ2dlcjogRUpTT04uY2xvbmUodHJpZ2dlciksIGNhbGxiYWNrOiBjYWxsYmFja307XG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSA9IHt9O1xuICAgICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25Db3VudFtjb2xsZWN0aW9uXSA9IDA7XG4gICAgfVxuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dW2lkXSA9IHJlY29yZDtcbiAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dKys7XG5cbiAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICBzZWxmLmZhY3RQYWNrYWdlLCBzZWxmLmZhY3ROYW1lLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgICAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdO1xuICAgICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dLS07XG4gICAgICAgIGlmIChzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dO1xuICAgICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvLyBGaXJlIHRoZSBwcm92aWRlZCAnbm90aWZpY2F0aW9uJyAoYW4gb2JqZWN0IHdob3NlIGF0dHJpYnV0ZVxuICAvLyB2YWx1ZXMgYXJlIGFsbCBKU09OLWNvbXBhdGliaWxlKSAtLSBpbmZvcm0gYWxsIG1hdGNoaW5nIGxpc3RlbmVyc1xuICAvLyAocmVnaXN0ZXJlZCB3aXRoIGxpc3RlbigpKS5cbiAgLy9cbiAgLy8gSWYgZmlyZSgpIGlzIGNhbGxlZCBpbnNpZGUgYSB3cml0ZSBmZW5jZSwgdGhlbiBlYWNoIG9mIHRoZVxuICAvLyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgaW5zaWRlIHRoZSB3cml0ZSBmZW5jZSBhcyB3ZWxsLlxuICAvL1xuICAvLyBUaGUgbGlzdGVuZXJzIG1heSBiZSBpbnZva2VkIGluIHBhcmFsbGVsLCByYXRoZXIgdGhhbiBzZXJpYWxseS5cbiAgZmlyZTogZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2Uobm90aWZpY2F0aW9uKTtcblxuICAgIGlmICghIF8uaGFzKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uID0gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgdmFyIGNhbGxiYWNrSWRzID0gW107XG4gICAgXy5lYWNoKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGZ1bmN0aW9uIChsLCBpZCkge1xuICAgICAgaWYgKHNlbGYuX21hdGNoZXMobm90aWZpY2F0aW9uLCBsLnRyaWdnZXIpKSB7XG4gICAgICAgIGNhbGxiYWNrSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuZXIgY2FsbGJhY2tzIGNhbiB5aWVsZCwgc28gd2UgbmVlZCB0byBmaXJzdCBmaW5kIGFsbCB0aGUgb25lcyB0aGF0XG4gICAgLy8gbWF0Y2ggaW4gYSBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24gKHdoaWNoIGNhbid0XG4gICAgLy8gYmUgbXV0YXRlZCBkdXJpbmcgdGhpcyBpdGVyYXRpb24pLCBhbmQgdGhlbiBpbnZva2UgdGhlIG1hdGNoaW5nXG4gICAgLy8gY2FsbGJhY2tzLCBjaGVja2luZyBiZWZvcmUgZWFjaCBjYWxsIHRvIGVuc3VyZSB0aGV5IGhhdmVuJ3Qgc3RvcHBlZC5cbiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGF0XG4gICAgLy8gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl0gc3RpbGwgPT09IGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sXG4gICAgLy8gYmVjYXVzZSB0aGUgb25seSB3YXkgdGhhdCBzdG9wcyBiZWluZyB0cnVlIGlzIGlmIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25cbiAgICAvLyBmaXJzdCBnZXRzIHJlZHVjZWQgZG93biB0byB0aGUgZW1wdHkgb2JqZWN0IChhbmQgdGhlbiBuZXZlciBnZXRzXG4gICAgLy8gaW5jcmVhc2VkIGFnYWluKS5cbiAgICBfLmVhY2goY2FsbGJhY2tJZHMsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKF8uaGFzKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGlkKSkge1xuICAgICAgICBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uW2lkXS5jYWxsYmFjayhub3RpZmljYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIEEgbm90aWZpY2F0aW9uIG1hdGNoZXMgYSB0cmlnZ2VyIGlmIGFsbCBrZXlzIHRoYXQgZXhpc3QgaW4gYm90aCBhcmUgZXF1YWwuXG4gIC8vXG4gIC8vIEV4YW1wbGVzOlxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICBub24tdGFyZ2V0ZWQgcXVlcnkpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICB0YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgdGFyZ2V0ZWQgd3JpdGUgdG8gYSBjb2xsZWN0aW9uIG1hdGNoZXMgYSB0YXJnZXRlZCBxdWVyeSB0YXJnZXRlZFxuICAvLyAgICAgYXQgdGhlIHNhbWUgZG9jdW1lbnQpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBkb2VzIG5vdCBtYXRjaCBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWVwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gZG9lcyBub3QgbWF0Y2ggYSB0YXJnZXRlZCBxdWVyeVxuICAvLyAgICAgdGFyZ2V0ZWQgYXQgYSBkaWZmZXJlbnQgZG9jdW1lbnQpXG4gIF9tYXRjaGVzOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uLCB0cmlnZ2VyKSB7XG4gICAgLy8gTW9zdCBub3RpZmljYXRpb25zIHRoYXQgdXNlIHRoZSBjcm9zc2JhciBoYXZlIGEgc3RyaW5nIGBjb2xsZWN0aW9uYCBhbmRcbiAgICAvLyBtYXliZSBhbiBgaWRgIHRoYXQgaXMgYSBzdHJpbmcgb3IgT2JqZWN0SUQuIFdlJ3JlIGFscmVhZHkgZGl2aWRpbmcgdXBcbiAgICAvLyB0cmlnZ2VycyBieSBjb2xsZWN0aW9uLCBidXQgbGV0J3MgZmFzdC10cmFjayBcIm5vcGUsIGRpZmZlcmVudCBJRFwiIChhbmRcbiAgICAvLyBhdm9pZCB0aGUgb3Zlcmx5IGdlbmVyaWMgRUpTT04uZXF1YWxzKS4gVGhpcyBtYWtlcyBhIG5vdGljZWFibGVcbiAgICAvLyBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21ldGVvci9tZXRlb3IvcHVsbC8zNjk3XG4gICAgaWYgKHR5cGVvZihub3RpZmljYXRpb24uaWQpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YodHJpZ2dlci5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG5vdGlmaWNhdGlvbi5pZCAhPT0gdHJpZ2dlci5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobm90aWZpY2F0aW9uLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICB0cmlnZ2VyLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICAhIG5vdGlmaWNhdGlvbi5pZC5lcXVhbHModHJpZ2dlci5pZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gXy5hbGwodHJpZ2dlciwgZnVuY3Rpb24gKHRyaWdnZXJWYWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm4gIV8uaGFzKG5vdGlmaWNhdGlvbiwga2V5KSB8fFxuICAgICAgICBFSlNPTi5lcXVhbHModHJpZ2dlclZhbHVlLCBub3RpZmljYXRpb25ba2V5XSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBUaGUgXCJpbnZhbGlkYXRpb24gY3Jvc3NiYXJcIiBpcyBhIHNwZWNpZmljIGluc3RhbmNlIHVzZWQgYnkgdGhlIEREUCBzZXJ2ZXIgdG9cbi8vIGltcGxlbWVudCB3cml0ZSBmZW5jZSBub3RpZmljYXRpb25zLiBMaXN0ZW5lciBjYWxsYmFja3Mgb24gdGhpcyBjcm9zc2JhclxuLy8gc2hvdWxkIGNhbGwgYmVnaW5Xcml0ZSBvbiB0aGUgY3VycmVudCB3cml0ZSBmZW5jZSBiZWZvcmUgdGhleSByZXR1cm4sIGlmIHRoZXlcbi8vIHdhbnQgdG8gZGVsYXkgdGhlIHdyaXRlIGZlbmNlIGZyb20gZmlyaW5nIChpZSwgdGhlIEREUCBtZXRob2QtZGF0YS11cGRhdGVkXG4vLyBtZXNzYWdlIGZyb20gYmVpbmcgc2VudCkuXG5ERFBTZXJ2ZXIuX0ludmFsaWRhdGlvbkNyb3NzYmFyID0gbmV3IEREUFNlcnZlci5fQ3Jvc3NiYXIoe1xuICBmYWN0TmFtZTogXCJpbnZhbGlkYXRpb24tY3Jvc3NiYXItbGlzdGVuZXJzXCJcbn0pO1xuIiwiaWYgKHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMKSB7XG4gIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwgPVxuICAgIHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMO1xufVxuXG5NZXRlb3Iuc2VydmVyID0gbmV3IFNlcnZlcjtcblxuTWV0ZW9yLnJlZnJlc2ggPSBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gIEREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIuZmlyZShub3RpZmljYXRpb24pO1xufTtcblxuLy8gUHJveHkgdGhlIHB1YmxpYyBtZXRob2RzIG9mIE1ldGVvci5zZXJ2ZXIgc28gdGhleSBjYW5cbi8vIGJlIGNhbGxlZCBkaXJlY3RseSBvbiBNZXRlb3IuXG5fLmVhY2goWydwdWJsaXNoJywgJ21ldGhvZHMnLCAnY2FsbCcsICdhcHBseScsICdvbkNvbm5lY3Rpb24nLCAnb25NZXNzYWdlJ10sXG4gICAgICAgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgIE1ldGVvcltuYW1lXSA9IF8uYmluZChNZXRlb3Iuc2VydmVyW25hbWVdLCBNZXRlb3Iuc2VydmVyKTtcbiAgICAgICB9KTtcblxuLy8gTWV0ZW9yLnNlcnZlciB1c2VkIHRvIGJlIGNhbGxlZCBNZXRlb3IuZGVmYXVsdF9zZXJ2ZXIuIFByb3ZpZGVcbi8vIGJhY2tjb21wYXQgYXMgYSBjb3VydGVzeSBldmVuIHRob3VnaCBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZC5cbi8vIFhYWCBDT01QQVQgV0lUSCAwLjYuNFxuTWV0ZW9yLmRlZmF1bHRfc2VydmVyID0gTWV0ZW9yLnNlcnZlcjtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJqc2Vzc2lvbmlkIiwiVVNFX0pTRVNTSU9OSUQiLCJESVNBQkxFX1dFQlNPQ0tFVFMiLCJ3ZWJzb2NrZXQiLCJmYXllX3NlcnZlcl9vcHRpb25zIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiV2ViQXBwIiwiaHR0cFNlcnZlciIsInJlbW92ZUxpc3RlbmVyIiwiX3RpbWVvdXRBZGp1c3RtZW50UmVxdWVzdENhbGxiYWNrIiwiaW5zdGFsbEhhbmRsZXJzIiwiYWRkTGlzdGVuZXIiLCJfcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCIsIm9uIiwic29ja2V0Iiwic2V0V2Vic29ja2V0VGltZW91dCIsInRpbWVvdXQiLCJwcm90b2NvbCIsIl9zZXNzaW9uIiwicmVjdiIsImNvbm5lY3Rpb24iLCJzZXRUaW1lb3V0Iiwic2VuZCIsImRhdGEiLCJ3cml0ZSIsIndpdGhvdXQiLCJzdHJpbmdpZnkiLCJzZXJ2ZXJfaWQiLCJlYWNoIiwiY2FsbGJhY2siLCJleHRlbmQiLCJwcm90b3R5cGUiLCJyZWdpc3RlciIsImFsbF9zb2NrZXRzIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIdHRwU2VydmVyTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwic2xpY2UiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJuZXdMaXN0ZW5lciIsInJlcXVlc3QiLCJhcmdzIiwiYXJndW1lbnRzIiwicGFyc2VkVXJsIiwicGF0aG5hbWUiLCJmb3JtYXQiLCJvbGRMaXN0ZW5lciIsImFwcGx5IiwiRERQU2VydmVyIiwiRmliZXIiLCJTZXNzaW9uRG9jdW1lbnRWaWV3IiwiZXhpc3RzSW4iLCJTZXQiLCJkYXRhQnlLZXkiLCJNYXAiLCJfU2Vzc2lvbkRvY3VtZW50VmlldyIsImdldEZpZWxkcyIsInJldCIsImZvckVhY2giLCJwcmVjZWRlbmNlTGlzdCIsImtleSIsInZhbHVlIiwiY2xlYXJGaWVsZCIsInN1YnNjcmlwdGlvbkhhbmRsZSIsImNoYW5nZUNvbGxlY3RvciIsImdldCIsInJlbW92ZWRWYWx1ZSIsInVuZGVmaW5lZCIsImkiLCJsZW5ndGgiLCJwcmVjZWRlbmNlIiwic3BsaWNlIiwiZGVsZXRlIiwiRUpTT04iLCJlcXVhbHMiLCJjaGFuZ2VGaWVsZCIsImlzQWRkIiwiY2xvbmUiLCJoYXMiLCJzZXQiLCJlbHQiLCJmaW5kIiwiU2Vzc2lvbkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbk5hbWUiLCJzZXNzaW9uQ2FsbGJhY2tzIiwiZG9jdW1lbnRzIiwiY2FsbGJhY2tzIiwiX1Nlc3Npb25Db2xsZWN0aW9uVmlldyIsImlzRW1wdHkiLCJzaXplIiwiZGlmZiIsInByZXZpb3VzIiwiRGlmZlNlcXVlbmNlIiwiZGlmZk1hcHMiLCJib3RoIiwiYmluZCIsImRpZmZEb2N1bWVudCIsInJpZ2h0T25seSIsImlkIiwibm93RFYiLCJhZGRlZCIsImxlZnRPbmx5IiwicHJldkRWIiwicmVtb3ZlZCIsImZpZWxkcyIsImRpZmZPYmplY3RzIiwicHJldiIsIm5vdyIsImNoYW5nZWQiLCJkb2NWaWV3IiwiYWRkIiwiY2hhbmdlZFJlc3VsdCIsIkVycm9yIiwiZXJyIiwiU2Vzc2lvbiIsInZlcnNpb24iLCJvcHRpb25zIiwiUmFuZG9tIiwiaW5pdGlhbGl6ZWQiLCJpblF1ZXVlIiwiTWV0ZW9yIiwiX0RvdWJsZUVuZGVkUXVldWUiLCJibG9ja2VkIiwid29ya2VyUnVubmluZyIsIl9uYW1lZFN1YnMiLCJfdW5pdmVyc2FsU3VicyIsInVzZXJJZCIsImNvbGxlY3Rpb25WaWV3cyIsIl9pc1NlbmRpbmciLCJfZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyIsIl9wZW5kaW5nUmVhZHkiLCJfY2xvc2VDYWxsYmFja3MiLCJfc29ja2V0VXJsIiwiX3Jlc3BvbmRUb1BpbmdzIiwicmVzcG9uZFRvUGluZ3MiLCJjb25uZWN0aW9uSGFuZGxlIiwiY2xvc2UiLCJvbkNsb3NlIiwiZm4iLCJjYiIsImJpbmRFbnZpcm9ubWVudCIsImRlZmVyIiwiY2xpZW50QWRkcmVzcyIsIl9jbGllbnRBZGRyZXNzIiwiaHR0cEhlYWRlcnMiLCJoZWFkZXJzIiwibXNnIiwic2Vzc2lvbiIsInN0YXJ0VW5pdmVyc2FsU3VicyIsInJ1biIsImhlYXJ0YmVhdEludGVydmFsIiwiaGVhcnRiZWF0IiwiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiaGVhcnRiZWF0VGltZW91dCIsIm9uVGltZW91dCIsInNlbmRQaW5nIiwic3RhcnQiLCJQYWNrYWdlIiwiRmFjdHMiLCJpbmNyZW1lbnRTZXJ2ZXJGYWN0Iiwic2VuZFJlYWR5Iiwic3Vic2NyaXB0aW9uSWRzIiwic3VicyIsInN1YnNjcmlwdGlvbklkIiwic2VuZEFkZGVkIiwiY29sbGVjdGlvbiIsInNlbmRDaGFuZ2VkIiwic2VuZFJlbW92ZWQiLCJnZXRTZW5kQ2FsbGJhY2tzIiwiZ2V0Q29sbGVjdGlvblZpZXciLCJ2aWV3IiwiaGFuZGxlcnMiLCJ1bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyIsImhhbmRsZXIiLCJfc3RhcnRTdWJzY3JpcHRpb24iLCJzdG9wIiwiX21ldGVvclNlc3Npb24iLCJfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMiLCJfcmVtb3ZlU2Vzc2lvbiIsIl9wcmludFNlbnRERFAiLCJfZGVidWciLCJzdHJpbmdpZnlERFAiLCJzZW5kRXJyb3IiLCJyZWFzb24iLCJvZmZlbmRpbmdNZXNzYWdlIiwicHJvY2Vzc01lc3NhZ2UiLCJtc2dfaW4iLCJtZXNzYWdlUmVjZWl2ZWQiLCJwcm9jZXNzTmV4dCIsInNoaWZ0IiwidW5ibG9jayIsIm9uTWVzc2FnZUhvb2siLCJwcm90b2NvbF9oYW5kbGVycyIsImNhbGwiLCJzdWIiLCJuYW1lIiwicGFyYW1zIiwiQXJyYXkiLCJwdWJsaXNoX2hhbmRsZXJzIiwiZXJyb3IiLCJERFBSYXRlTGltaXRlciIsInJhdGVMaW1pdGVySW5wdXQiLCJ0eXBlIiwiY29ubmVjdGlvbklkIiwiX2luY3JlbWVudCIsInJhdGVMaW1pdFJlc3VsdCIsIl9jaGVjayIsImFsbG93ZWQiLCJnZXRFcnJvck1lc3NhZ2UiLCJ0aW1lVG9SZXNldCIsInVuc3ViIiwiX3N0b3BTdWJzY3JpcHRpb24iLCJtZXRob2QiLCJyYW5kb21TZWVkIiwiZmVuY2UiLCJfV3JpdGVGZW5jZSIsIm9uQWxsQ29tbWl0dGVkIiwicmV0aXJlIiwibWV0aG9kcyIsIm1ldGhvZF9oYW5kbGVycyIsImFybSIsInNldFVzZXJJZCIsIl9zZXRVc2VySWQiLCJpbnZvY2F0aW9uIiwiTWV0aG9kSW52b2NhdGlvbiIsImlzU2ltdWxhdGlvbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9DdXJyZW50V3JpdGVGZW5jZSIsIndpdGhWYWx1ZSIsIkREUCIsIl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsIm1heWJlQXVkaXRBcmd1bWVudENoZWNrcyIsImZpbmlzaCIsInBheWxvYWQiLCJ0aGVuIiwicmVzdWx0IiwiZXhjZXB0aW9uIiwid3JhcEludGVybmFsRXhjZXB0aW9uIiwiX2VhY2hTdWIiLCJmIiwiX2RpZmZDb2xsZWN0aW9uVmlld3MiLCJiZWZvcmVDVnMiLCJsZWZ0VmFsdWUiLCJyaWdodFZhbHVlIiwiZG9jIiwiX2RlYWN0aXZhdGUiLCJvbGROYW1lZFN1YnMiLCJuZXdTdWIiLCJfcmVjcmVhdGUiLCJfcnVuSGFuZGxlciIsIl9ub1lpZWxkc0FsbG93ZWQiLCJzdWJJZCIsIlN1YnNjcmlwdGlvbiIsInN1Yk5hbWUiLCJtYXliZVN1YiIsIl9uYW1lIiwiX3JlbW92ZUFsbERvY3VtZW50cyIsInJlc3BvbnNlIiwiaHR0cEZvcndhcmRlZENvdW50IiwicGFyc2VJbnQiLCJyZW1vdGVBZGRyZXNzIiwiZm9yd2FyZGVkRm9yIiwiaXNTdHJpbmciLCJ0cmltIiwic3BsaXQiLCJfaGFuZGxlciIsIl9zdWJzY3JpcHRpb25JZCIsIl9wYXJhbXMiLCJfc3Vic2NyaXB0aW9uSGFuZGxlIiwiX2RlYWN0aXZhdGVkIiwiX3N0b3BDYWxsYmFja3MiLCJfZG9jdW1lbnRzIiwiX3JlYWR5IiwiX2lkRmlsdGVyIiwiaWRTdHJpbmdpZnkiLCJNb25nb0lEIiwiaWRQYXJzZSIsInJlcyIsIl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIiwiZSIsIl9pc0RlYWN0aXZhdGVkIiwiX3B1Ymxpc2hIYW5kbGVyUmVzdWx0IiwiaXNDdXJzb3IiLCJjIiwiX3B1Ymxpc2hDdXJzb3IiLCJyZWFkeSIsImlzQXJyYXkiLCJhbGwiLCJjb2xsZWN0aW9uTmFtZXMiLCJfZ2V0Q29sbGVjdGlvbk5hbWUiLCJjdXIiLCJfY2FsbFN0b3BDYWxsYmFja3MiLCJjb2xsZWN0aW9uRG9jcyIsInN0cklkIiwib25TdG9wIiwiaWRzIiwiU2VydmVyIiwiZGVmYXVsdHMiLCJvbkNvbm5lY3Rpb25Ib29rIiwiSG9vayIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwic2Vzc2lvbnMiLCJzdHJlYW1fc2VydmVyIiwicmF3X21zZyIsIl9wcmludFJlY2VpdmVkRERQIiwicGFyc2VERFAiLCJfaGFuZGxlQ29ubmVjdCIsIm9uQ29ubmVjdGlvbiIsIm9uTWVzc2FnZSIsInN1cHBvcnQiLCJjb250YWlucyIsIlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMiLCJjYWxjdWxhdGVWZXJzaW9uIiwicHVibGlzaCIsImlzT2JqZWN0IiwiYXV0b3B1Ymxpc2giLCJpc19hdXRvIiwid2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoIiwiZnVuYyIsInBvcCIsImNhbGxBc3luYyIsImFwcGx5QXN5bmMiLCJhd2FpdCIsImN1cnJlbnRNZXRob2RJbnZvY2F0aW9uIiwiY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsIm1ha2VScGNTZWVkIiwiX3VybEZvclNlc3Npb24iLCJzZXNzaW9uSWQiLCJjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyIsInNlcnZlclN1cHBvcnRlZFZlcnNpb25zIiwiY29ycmVjdFZlcnNpb24iLCJfY2FsY3VsYXRlVmVyc2lvbiIsImNvbnRleHQiLCJpc0NsaWVudFNhZmUiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtZXNzYWdlIiwiZGV0YWlscyIsIl9leHBlY3RlZEJ5VGVzdCIsInN0YWNrIiwic2FuaXRpemVkRXJyb3IiLCJkZXNjcmlwdGlvbiIsIk1hdGNoIiwiX2ZhaWxJZkFyZ3VtZW50c0FyZU5vdEFsbENoZWNrZWQiLCJGdXR1cmUiLCJhcm1lZCIsImZpcmVkIiwicmV0aXJlZCIsIm91dHN0YW5kaW5nX3dyaXRlcyIsImJlZm9yZV9maXJlX2NhbGxiYWNrcyIsImNvbXBsZXRpb25fY2FsbGJhY2tzIiwiRW52aXJvbm1lbnRWYXJpYWJsZSIsImJlZ2luV3JpdGUiLCJjb21taXR0ZWQiLCJfbWF5YmVGaXJlIiwib25CZWZvcmVGaXJlIiwiYXJtQW5kV2FpdCIsImZ1dHVyZSIsIndhaXQiLCJpbnZva2VDYWxsYmFjayIsIl9Dcm9zc2JhciIsIm5leHRJZCIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbiIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50IiwiZmFjdFBhY2thZ2UiLCJmYWN0TmFtZSIsIl9jb2xsZWN0aW9uRm9yTWVzc2FnZSIsImxpc3RlbiIsInRyaWdnZXIiLCJyZWNvcmQiLCJmaXJlIiwibm90aWZpY2F0aW9uIiwibGlzdGVuZXJzRm9yQ29sbGVjdGlvbiIsImNhbGxiYWNrSWRzIiwibCIsIl9tYXRjaGVzIiwiT2JqZWN0SUQiLCJ0cmlnZ2VyVmFsdWUiLCJfSW52YWxpZGF0aW9uQ3Jvc3NiYXIiLCJERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCIsInJlZnJlc2giLCJkZWZhdWx0X3NlcnZlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsR0FBRyxHQUFHQyxHQUFHLENBQUNDLE9BQUosQ0FBWSxLQUFaLENBQVYsQyxDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLG1CQUFtQixHQUFHQyxDQUFDLENBQUNDLElBQUYsQ0FBTyxZQUFZO0FBQzNDLE1BQUlDLFVBQVUsR0FBRyxFQUFqQjtBQUVBLE1BQUlDLDBCQUEwQixHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQVosR0FDekJDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQXZCLENBRHlCLEdBQzhCLEVBRC9EOztBQUVBLE1BQUlILDBCQUFKLEVBQWdDO0FBQzlCRCxjQUFVLENBQUNPLElBQVgsQ0FBZ0JaLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLG9CQUFaLEVBQWtDWSxTQUFsQyxDQUNkUCwwQkFEYyxDQUFoQjtBQUdEOztBQUVE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QVAsR0FBaUIsVUFBVVQsWUFBVixFQUF3QjtBQUN2Q3RVLFdBQVMsQ0FBQzZVLHFCQUFWLENBQWdDUixJQUFoQyxDQUFxQ0MsWUFBckM7QUFDRCxDQUZELEMsQ0FJQTtBQUNBOzs7QUFDQWxaLENBQUMsQ0FBQ3VELElBQUYsQ0FBTyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCLE9BQS9CLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELENBQVAsRUFDTyxVQUFVeUssSUFBVixFQUFnQjtBQUNkNUUsUUFBTSxDQUFDNEUsSUFBRCxDQUFOLEdBQWVoTyxDQUFDLENBQUMySCxJQUFGLENBQU95QixNQUFNLENBQUNySCxNQUFQLENBQWNpTSxJQUFkLENBQVAsRUFBNEI1RSxNQUFNLENBQUNySCxNQUFuQyxDQUFmO0FBQ0QsQ0FIUixFLENBS0E7QUFDQTtBQUNBOzs7QUFDQXFILE1BQU0sQ0FBQ3dRLGNBQVAsR0FBd0J4USxNQUFNLENBQUNySCxNQUEvQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9kZHAtc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHVybCA9IE5wbS5yZXF1aXJlKCd1cmwnKTtcblxuLy8gQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBwZXJtZXNzYWdlLWRlZmxhdGUgZXh0ZW5zaW9uIHdpdGggZGVmYXVsdFxuLy8gY29uZmlndXJhdGlvbi4gSWYgJFNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04gaXMgc2V0LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRcbi8vIEpTT04uIElmIGl0IHJlcHJlc2VudHMgYSBmYWxzZXkgdmFsdWUsIHRoZW4gd2UgZG8gbm90IHVzZSBwZXJtZXNzYWdlLWRlZmxhdGVcbi8vIGF0IGFsbDsgb3RoZXJ3aXNlLCB0aGUgSlNPTiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGRlZmxhdGUnc1xuLy8gY29uZmlndXJlIG1ldGhvZDsgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmF5ZS9wZXJtZXNzYWdlLWRlZmxhdGUtbm9kZS9ibG9iL21hc3Rlci9SRUFETUUubWRcbi8vXG4vLyAoV2UgZG8gdGhpcyBpbiBhbiBfLm9uY2UgaW5zdGVhZCBvZiBhdCBzdGFydHVwLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG9cbi8vIGNyYXNoIHRoZSB0b29sIGR1cmluZyBpc29wYWNrZXQgbG9hZCBpZiB5b3VyIEpTT04gZG9lc24ndCBwYXJzZS4gVGhpcyBpcyBvbmx5XG4vLyBhIHByb2JsZW0gYmVjYXVzZSB0aGUgdG9vbCBoYXMgdG8gbG9hZCB0aGUgRERQIHNlcnZlciBjb2RlIGp1c3QgaW4gb3JkZXIgdG9cbi8vIGJlIGEgRERQIGNsaWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRlb3IvbWV0ZW9yL2lzc3Vlcy8zNDUyIC4pXG52YXIgd2Vic29ja2V0RXh0ZW5zaW9ucyA9IF8ub25jZShmdW5jdGlvbiAoKSB7XG4gIHZhciBleHRlbnNpb25zID0gW107XG5cbiAgdmFyIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnID0gcHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTlxuICAgICAgICA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTikgOiB7fTtcbiAgaWYgKHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnKSB7XG4gICAgZXh0ZW5zaW9ucy5wdXNoKE5wbS5yZXF1aXJlKCdwZXJtZXNzYWdlLWRlZmxhdGUnKS5jb25maWd1cmUoXG4gICAgICB3ZWJzb2NrZXRDb21wcmVzc2lvbkNvbmZpZ1xuICAgICkpO1xuICB9XG5cbiAgcmV0dXJuIGV4dGVuc2lvbnM7XG59KTtcblxudmFyIHBhdGhQcmVmaXggPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYIHx8ICBcIlwiO1xuXG5TdHJlYW1TZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzID0gW107XG4gIHNlbGYub3Blbl9zb2NrZXRzID0gW107XG5cbiAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zdGFsbGluZyBkaXJlY3RseSBvbnRvIFdlYkFwcC5odHRwU2VydmVyIGluc3RlYWQgb2YgdXNpbmdcbiAgLy8gV2ViQXBwLmFwcCwgd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBwYXRoIHByZWZpeCBvdXJzZWx2ZXMuXG4gIHNlbGYucHJlZml4ID0gcGF0aFByZWZpeCArICcvc29ja2pzJztcbiAgUm91dGVQb2xpY3kuZGVjbGFyZShzZWxmLnByZWZpeCArICcvJywgJ25ldHdvcmsnKTtcblxuICAvLyBzZXQgdXAgc29ja2pzXG4gIHZhciBzb2NranMgPSBOcG0ucmVxdWlyZSgnc29ja2pzJyk7XG4gIHZhciBzZXJ2ZXJPcHRpb25zID0ge1xuICAgIHByZWZpeDogc2VsZi5wcmVmaXgsXG4gICAgbG9nOiBmdW5jdGlvbigpIHt9LFxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBjb2RlIGl0IGV4cGxpY2l0bHkgYmVjYXVzZSB3ZSBkZXBlbmRcbiAgICAvLyBvbiBpdCBpbiBzdHJlYW1fY2xpZW50OkhFQVJUQkVBVF9USU1FT1VUXG4gICAgaGVhcnRiZWF0X2RlbGF5OiA0NTAwMCxcbiAgICAvLyBUaGUgZGVmYXVsdCBkaXNjb25uZWN0X2RlbGF5IGlzIDUgc2Vjb25kcywgYnV0IGlmIHRoZSBzZXJ2ZXIgZW5kcyB1cCBDUFVcbiAgICAvLyBib3VuZCBmb3IgdGhhdCBtdWNoIHRpbWUsIFNvY2tKUyBtaWdodCBub3Qgbm90aWNlIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgLy8gcmVjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdGltZXIgKG9mIGRpc2Nvbm5lY3RfZGVsYXkgbXMpIGNhbiBmaXJlIGJlZm9yZVxuICAgIC8vIFNvY2tKUyBwcm9jZXNzZXMgdGhlIG5ldyBjb25uZWN0aW9uLiBFdmVudHVhbGx5IHdlJ2xsIGZpeCB0aGlzIGJ5IG5vdFxuICAgIC8vIGNvbWJpbmluZyBDUFUtaGVhdnkgcHJvY2Vzc2luZyB3aXRoIFNvY2tKUyB0ZXJtaW5hdGlvbiAoZWcgYSBwcm94eSB3aGljaFxuICAgIC8vIGNvbnZlcnRzIHRvIFVuaXggc29ja2V0cykgYnV0IGZvciBub3csIHJhaXNlIHRoZSBkZWxheS5cbiAgICBkaXNjb25uZWN0X2RlbGF5OiA2MCAqIDEwMDAsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklEXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICAgJiYgc29ja2V0Ll9zZXNzaW9uLnJlY3YpIHtcbiAgICAgICAgc29ja2V0Ll9zZXNzaW9uLnJlY3YuY29ubmVjdGlvbi5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgc29ja2V0LnNldFdlYnNvY2tldFRpbWVvdXQoNDUgKiAxMDAwKTtcblxuICAgIHNvY2tldC5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHNvY2tldC53cml0ZShkYXRhKTtcbiAgICB9O1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9wZW5fc29ja2V0cyA9IF8ud2l0aG91dChzZWxmLm9wZW5fc29ja2V0cywgc29ja2V0KTtcbiAgICB9KTtcbiAgICBzZWxmLm9wZW5fc29ja2V0cy5wdXNoKHNvY2tldCk7XG5cbiAgICAvLyBYWFggQ09NUEFUIFdJVEggMC42LjYuIFNlbmQgdGhlIG9sZCBzdHlsZSB3ZWxjb21lIG1lc3NhZ2UsIHdoaWNoXG4gICAgLy8gd2lsbCBmb3JjZSBvbGQgY2xpZW50cyB0byByZWxvYWQuIFJlbW92ZSB0aGlzIG9uY2Ugd2UncmUgbm90XG4gICAgLy8gY29uY2VybmVkIGFib3V0IHBlb3BsZSB1cGdyYWRpbmcgZnJvbSBhIHByZS0wLjcuMCByZWxlYXNlLiBBbHNvLFxuICAgIC8vIHJlbW92ZSB0aGUgY2xhdXNlIGluIHRoZSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZSB3ZWxjb21lIG1lc3NhZ2VcbiAgICAvLyAobGl2ZWRhdGFfY29ubmVjdGlvbi5qcylcbiAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7c2VydmVyX2lkOiBcIjBcIn0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgYSBjb25uZWN0IG1pZGRsZXdhcmUgaGVyZSBzaW5jZVxuICAgIC8vIHNvY2tqcyBpbnN0YWxscyBpdHNlbGYgcHJpb3IgdG8gYWxsIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgIC8vIChtZWFuaW5nIHByaW9yIHRvIGFueSBjb25uZWN0IG1pZGRsZXdhcmVzKSBzbyB3ZSBuZWVkIHRvIHRha2VcbiAgICAvLyBhbiBhcHByb2FjaCBzaW1pbGFyIHRvIG92ZXJzaGFkb3dMaXN0ZW5lcnMgaW5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc29ja2pzL3NvY2tqcy1ub2RlL2Jsb2IvY2Y4MjBjNTVhZjZhOTk1M2UxNjU1ODU1NWEzMWRlY2VhNTU0ZjcwZS9zcmMvdXRpbHMuY29mZmVlXG4gICAgXy5lYWNoKFsncmVxdWVzdCcsICd1cGdyYWRlJ10sIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgaHR0cFNlcnZlciA9IFdlYkFwcC5odHRwU2VydmVyO1xuICAgICAgdmFyIG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMgPSBodHRwU2VydmVyLmxpc3RlbmVycyhldmVudCkuc2xpY2UoMCk7XG4gICAgICBodHRwU2VydmVyLnJlbW92ZUFsbExpc3RlbmVycyhldmVudCk7XG5cbiAgICAgIC8vIHJlcXVlc3QgYW5kIHVwZ3JhZGUgaGF2ZSBkaWZmZXJlbnQgYXJndW1lbnRzIHBhc3NlZCBidXRcbiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3Qgb25lIHdoaWNoIGlzIGFsd2F5cyByZXF1ZXN0XG4gICAgICB2YXIgbmV3TGlzdGVuZXIgPSBmdW5jdGlvbihyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgICBwYXJzZWRVcmwucGF0aG5hbWUgPT09IHBhdGhQcmVmaXggKyAnL3dlYnNvY2tldC8nKSB7XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID0gc2VsZi5wcmVmaXggKyAnL3dlYnNvY2tldCc7XG4gICAgICAgICAgcmVxdWVzdC51cmwgPSB1cmwuZm9ybWF0KHBhcnNlZFVybCk7XG4gICAgICAgIH1cbiAgICAgICAgXy5lYWNoKG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMsIGZ1bmN0aW9uKG9sZExpc3RlbmVyKSB7XG4gICAgICAgICAgb2xkTGlzdGVuZXIuYXBwbHkoaHR0cFNlcnZlciwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGh0dHBTZXJ2ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIG5ld0xpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufSk7XG4iLCJERFBTZXJ2ZXIgPSB7fTtcblxudmFyIEZpYmVyID0gTnBtLnJlcXVpcmUoJ2ZpYmVycycpO1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3Nlczpcbi8vICogU2Vzc2lvbiAtIFRoZSBzZXJ2ZXIncyBjb25uZWN0aW9uIHRvIGEgc2luZ2xlIEREUCBjbGllbnRcbi8vICogU3Vic2NyaXB0aW9uIC0gQSBzaW5nbGUgc3Vic2NyaXB0aW9uIGZvciBhIHNpbmdsZSBjbGllbnRcbi8vICogU2VydmVyIC0gQW4gZW50aXJlIHNlcnZlciB0aGF0IG1heSB0YWxrIHRvID4gMSBjbGllbnQuIEEgRERQIGVuZHBvaW50LlxuLy9cbi8vIFNlc3Npb24gYW5kIFN1YnNjcmlwdGlvbiBhcmUgZmlsZSBzY29wZS4gRm9yIG5vdywgdW50aWwgd2UgZnJlZXplXG4vLyB0aGUgaW50ZXJmYWNlLCBTZXJ2ZXIgaXMgcGFja2FnZSBzY29wZSAoaW4gdGhlIGZ1dHVyZSBpdCBzaG91bGQgYmVcbi8vIGV4cG9ydGVkLilcblxuLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBkb2N1bWVudCBpbiBhIFNlc3Npb25Db2xsZWN0aW9uVmlld1xudmFyIFNlc3Npb25Eb2N1bWVudFZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5leGlzdHNJbiA9IG5ldyBTZXQoKTsgLy8gc2V0IG9mIHN1YnNjcmlwdGlvbkhhbmRsZVxuICBzZWxmLmRhdGFCeUtleSA9IG5ldyBNYXAoKTsgLy8ga2V5LT4gWyB7c3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZX0gYnkgcHJlY2VkZW5jZV1cbn07XG5cbkREUFNlcnZlci5fU2Vzc2lvbkRvY3VtZW50VmlldyA9IFNlc3Npb25Eb2N1bWVudFZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkRvY3VtZW50Vmlldy5wcm90b3R5cGUsIHtcblxuICBnZXRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHNlbGYuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgIHJldFtrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBjbGVhckZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZUNvbGxlY3Rvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBQdWJsaXNoIEFQSSBpZ25vcmVzIF9pZCBpZiBwcmVzZW50IGluIGZpZWxkc1xuICAgIGlmIChrZXkgPT09IFwiX2lkXCIpXG4gICAgICByZXR1cm47XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAvLyBJdCdzIG9rYXkgdG8gY2xlYXIgZmllbGRzIHRoYXQgZGlkbid0IGV4aXN0LiBObyBuZWVkIHRvIHRocm93XG4gICAgLy8gYW4gZXJyb3IuXG4gICAgaWYgKCFwcmVjZWRlbmNlTGlzdClcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZW1vdmVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVjZWRlbmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlTGlzdFtpXTtcbiAgICAgIGlmIChwcmVjZWRlbmNlLnN1YnNjcmlwdGlvbkhhbmRsZSA9PT0gc3Vic2NyaXB0aW9uSGFuZGxlKSB7XG4gICAgICAgIC8vIFRoZSB2aWV3J3MgdmFsdWUgY2FuIG9ubHkgY2hhbmdlIGlmIHRoaXMgc3Vic2NyaXB0aW9uIGlzIHRoZSBvbmUgdGhhdFxuICAgICAgICAvLyB1c2VkIHRvIGhhdmUgcHJlY2VkZW5jZS5cbiAgICAgICAgaWYgKGkgPT09IDApXG4gICAgICAgICAgcmVtb3ZlZFZhbHVlID0gcHJlY2VkZW5jZS52YWx1ZTtcbiAgICAgICAgcHJlY2VkZW5jZUxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZWNlZGVuY2VMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAhRUpTT04uZXF1YWxzKHJlbW92ZWRWYWx1ZSwgcHJlY2VkZW5jZUxpc3RbMF0udmFsdWUpKSB7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHByZWNlZGVuY2VMaXN0WzBdLnZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VGaWVsZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VDb2xsZWN0b3IsIGlzQWRkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERvbid0IHNoYXJlIHN0YXRlIHdpdGggdGhlIGRhdGEgcGFzc2VkIGluIGJ5IHRoZSB1c2VyLlxuICAgIHZhbHVlID0gRUpTT04uY2xvbmUodmFsdWUpO1xuXG4gICAgaWYgKCFzZWxmLmRhdGFCeUtleS5oYXMoa2V5KSkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuc2V0KGtleSwgW3tzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlfV0pO1xuICAgICAgY2hhbmdlQ29sbGVjdG9yW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG4gICAgdmFyIGVsdDtcbiAgICBpZiAoIWlzQWRkKSB7XG4gICAgICBlbHQgPSBwcmVjZWRlbmNlTGlzdC5maW5kKGZ1bmN0aW9uIChwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZWx0KSB7XG4gICAgICBpZiAoZWx0ID09PSBwcmVjZWRlbmNlTGlzdFswXSAmJiAhRUpTT04uZXF1YWxzKHZhbHVlLCBlbHQudmFsdWUpKSB7XG4gICAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZWx0LnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIG5ld2x5IGNhcmluZyBhYm91dCB0aGlzIGZpZWxkXG4gICAgICBwcmVjZWRlbmNlTGlzdC5wdXNoKHtzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSwgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gIH1cbn0pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjbGllbnQncyB2aWV3IG9mIGEgc2luZ2xlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGl0IHJlcHJlc2VudHNcbiAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIEZ1bmN0aW9uPn0gc2Vzc2lvbkNhbGxiYWNrcyBUaGUgY2FsbGJhY2tzIGZvciBhZGRlZCwgY2hhbmdlZCwgcmVtb3ZlZFxuICogQGNsYXNzIFNlc3Npb25Db2xsZWN0aW9uVmlld1xuICovXG52YXIgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3ID0gZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBzZXNzaW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lO1xuICBzZWxmLmRvY3VtZW50cyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5jYWxsYmFja3MgPSBzZXNzaW9uQ2FsbGJhY2tzO1xufTtcblxuRERQU2VydmVyLl9TZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBTZXNzaW9uQ29sbGVjdGlvblZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkNvbGxlY3Rpb25WaWV3LnByb3RvdHlwZSwge1xuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuZG9jdW1lbnRzLnNpemUgPT09IDA7XG4gIH0sXG5cbiAgZGlmZjogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhwcmV2aW91cy5kb2N1bWVudHMsIHNlbGYuZG9jdW1lbnRzLCB7XG4gICAgICBib3RoOiBfLmJpbmQoc2VsZi5kaWZmRG9jdW1lbnQsIHNlbGYpLFxuXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChpZCwgbm93RFYpIHtcbiAgICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIG5vd0RWLmdldEZpZWxkcygpKTtcbiAgICAgIH0sXG5cbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoaWQsIHByZXZEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBkaWZmRG9jdW1lbnQ6IGZ1bmN0aW9uIChpZCwgcHJldkRWLCBub3dEVikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZmllbGRzID0ge307XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZPYmplY3RzKHByZXZEVi5nZXRGaWVsZHMoKSwgbm93RFYuZ2V0RmllbGRzKCksIHtcbiAgICAgIGJvdGg6IGZ1bmN0aW9uIChrZXksIHByZXYsIG5vdykge1xuICAgICAgICBpZiAoIUVKU09OLmVxdWFscyhwcmV2LCBub3cpKVxuICAgICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGtleSwgbm93KSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbihrZXksIHByZXYpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgdmFyIGFkZGVkID0gZmFsc2U7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgICBkb2NWaWV3ID0gbmV3IFNlc3Npb25Eb2N1bWVudFZpZXcoKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLnNldChpZCwgZG9jVmlldyk7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uYWRkKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgdmFyIGNoYW5nZUNvbGxlY3RvciA9IHt9O1xuICAgIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKFxuICAgICAgICBzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgdmFsdWUsIGNoYW5nZUNvbGxlY3RvciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgaWYgKGFkZGVkKVxuICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZUNvbGxlY3Rvcik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgY2hhbmdlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2hhbmdlZFJlc3VsdCA9IHt9O1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICBpZiAoIWRvY1ZpZXcpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBlbGVtZW50IHdpdGggaWQgXCIgKyBpZCArIFwiIHRvIGNoYW5nZVwiKTtcbiAgICBfLmVhY2goY2hhbmdlZCwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWRSZXN1bHQpO1xuICAgICAgZWxzZVxuICAgICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlZFJlc3VsdCk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldykge1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlJlbW92ZWQgbm9uZXhpc3RlbnQgZG9jdW1lbnQgXCIgKyBpZCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uZGVsZXRlKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgaWYgKGRvY1ZpZXcuZXhpc3RzSW4uc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gaXQgaXMgZ29uZSBmcm9tIGV2ZXJ5b25lXG4gICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGFuZ2VkID0ge307XG4gICAgICAvLyByZW1vdmUgdGhpcyBzdWJzY3JpcHRpb24gZnJvbSBldmVyeSBwcmVjZWRlbmNlIGxpc3RcbiAgICAgIC8vIGFuZCByZWNvcmQgdGhlIGNoYW5nZXNcbiAgICAgIGRvY1ZpZXcuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgICAgZG9jVmlldy5jbGVhckZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCBjaGFuZ2VkKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2Vzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbnZhciBTZXNzaW9uID0gZnVuY3Rpb24gKHNlcnZlciwgdmVyc2lvbiwgc29ja2V0LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5pZCA9IFJhbmRvbS5pZCgpO1xuXG4gIHNlbGYuc2VydmVyID0gc2VydmVyO1xuICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gIHNlbGYuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgc2VsZi5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgLy8gc2V0IHRvIG51bGwgd2hlbiB0aGUgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuIG11bHRpcGxlIHBsYWNlcyBiZWxvd1xuICAvLyB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlIHNlc3Npb24gaXMgYWxpdmUgb3Igbm90LlxuICBzZWxmLmluUXVldWUgPSBuZXcgTWV0ZW9yLl9Eb3VibGVFbmRlZFF1ZXVlKCk7XG5cbiAgc2VsZi5ibG9ja2VkID0gZmFsc2U7XG4gIHNlbGYud29ya2VyUnVubmluZyA9IGZhbHNlO1xuXG4gIC8vIFN1YiBvYmplY3RzIGZvciBhY3RpdmUgc3Vic2NyaXB0aW9uc1xuICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG4gIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICBzZWxmLnVzZXJJZCA9IG51bGw7XG5cbiAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgLy8gU2V0IHRoaXMgdG8gZmFsc2UgdG8gbm90IHNlbmQgbWVzc2FnZXMgd2hlbiBjb2xsZWN0aW9uVmlld3MgYXJlXG4gIC8vIG1vZGlmaWVkLiBUaGlzIGlzIGRvbmUgd2hlbiByZXJ1bm5pbmcgc3VicyBpbiBfc2V0VXNlcklkIGFuZCB0aG9zZSBtZXNzYWdlc1xuICAvLyBhcmUgY2FsY3VsYXRlZCB2aWEgYSBkaWZmIGluc3RlYWQuXG4gIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG5cbiAgLy8gSWYgdGhpcyBpcyB0cnVlLCBkb24ndCBzdGFydCBhIG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHB1Ymxpc2hlciBvbiB0aGlzXG4gIC8vIHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgdGFrZSBjYXJlIG9mIHN0YXJ0aW5nIGl0IHdoZW4gYXBwcm9wcmlhdGUuXG4gIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcblxuICAvLyB3aGVuIHdlIGFyZSByZXJ1bm5pbmcgc3Vic2NyaXB0aW9ucywgYW55IHJlYWR5IG1lc3NhZ2VzXG4gIC8vIHdlIHdhbnQgdG8gYnVmZmVyIHVwIGZvciB3aGVuIHdlIGFyZSBkb25lIHJlcnVubmluZyBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiB0aGlzIGNvbm5lY3Rpb24gaXMgY2xvc2VkLlxuICBzZWxmLl9jbG9zZUNhbGxiYWNrcyA9IFtdO1xuXG5cbiAgLy8gWFhYIEhBQ0s6IElmIGEgc29ja2pzIGNvbm5lY3Rpb24sIHNhdmUgb2ZmIHRoZSBVUkwuIFRoaXMgaXNcbiAgLy8gdGVtcG9yYXJ5IGFuZCB3aWxsIGdvIGF3YXkgaW4gdGhlIG5lYXIgZnV0dXJlLlxuICBzZWxmLl9zb2NrZXRVcmwgPSBzb2NrZXQudXJsO1xuXG4gIC8vIEFsbG93IHRlc3RzIHRvIGRpc2FibGUgcmVzcG9uZGluZyB0byBwaW5ncy5cbiAgc2VsZi5fcmVzcG9uZFRvUGluZ3MgPSBvcHRpb25zLnJlc3BvbmRUb1BpbmdzO1xuXG4gIC8vIFRoaXMgb2JqZWN0IGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBzZXNzaW9uLiBJbiB0aGUgcHVibGljXG4gIC8vIEFQSSwgaXQgaXMgY2FsbGVkIHRoZSBgY29ubmVjdGlvbmAgb2JqZWN0LiAgSW50ZXJuYWxseSB3ZSBjYWxsIGl0XG4gIC8vIGEgYGNvbm5lY3Rpb25IYW5kbGVgIHRvIGF2b2lkIGFtYmlndWl0eS5cbiAgc2VsZi5jb25uZWN0aW9uSGFuZGxlID0ge1xuICAgIGlkOiBzZWxmLmlkLFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNsb3NlKCk7XG4gICAgfSxcbiAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHZhciBjYiA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZm4sIFwiY29ubmVjdGlvbiBvbkNsb3NlIGNhbGxiYWNrXCIpO1xuICAgICAgaWYgKHNlbGYuaW5RdWV1ZSkge1xuICAgICAgICBzZWxmLl9jbG9zZUNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgY2xvc2VkLCBjYWxsIHRoZSBjYWxsYmFjay5cbiAgICAgICAgTWV0ZW9yLmRlZmVyKGNiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuX2NsaWVudEFkZHJlc3MoKSxcbiAgICBodHRwSGVhZGVyczogc2VsZi5zb2NrZXQuaGVhZGVyc1xuICB9O1xuXG4gIHNlbGYuc2VuZCh7IG1zZzogJ2Nvbm5lY3RlZCcsIHNlc3Npb246IHNlbGYuaWQgfSk7XG5cbiAgLy8gT24gaW5pdGlhbCBjb25uZWN0LCBzcGluIHVwIGFsbCB0aGUgdW5pdmVyc2FsIHB1Ymxpc2hlcnMuXG4gIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICB9KS5ydW4oKTtcblxuICBpZiAodmVyc2lvbiAhPT0gJ3ByZTEnICYmIG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwgIT09IDApIHtcbiAgICAvLyBXZSBubyBsb25nZXIgbmVlZCB0aGUgbG93IGxldmVsIHRpbWVvdXQgYmVjYXVzZSB3ZSBoYXZlIGhlYXJ0YmVhdGluZy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCgwKTtcblxuICAgIHNlbGYuaGVhcnRiZWF0ID0gbmV3IEREUENvbW1vbi5IZWFydGJlYXQoe1xuICAgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwsXG4gICAgICBoZWFydGJlYXRUaW1lb3V0OiBvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQsXG4gICAgICBvblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgfSxcbiAgICAgIHNlbmRQaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7bXNnOiAncGluZyd9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmhlYXJ0YmVhdC5zdGFydCgpO1xuICB9XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFNlc3Npb24ucHJvdG90eXBlLCB7XG5cbiAgc2VuZFJlYWR5OiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSWRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZWFkeVwiLCBzdWJzOiBzdWJzY3JpcHRpb25JZHN9KTtcbiAgICBlbHNlIHtcbiAgICAgIF8uZWFjaChzdWJzY3JpcHRpb25JZHMsIGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkucHVzaChzdWJzY3JpcHRpb25JZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZEFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcImFkZGVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWQsIGZpZWxkczogZmllbGRzfSk7XG4gIH0sXG5cbiAgc2VuZENoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoXy5pc0VtcHR5KGZpZWxkcykpXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKSB7XG4gICAgICBzZWxmLnNlbmQoe1xuICAgICAgICBtc2c6IFwiY2hhbmdlZFwiLFxuICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNlbmRSZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZW1vdmVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWR9KTtcbiAgfSxcblxuICBnZXRTZW5kQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICBhZGRlZDogXy5iaW5kKHNlbGYuc2VuZEFkZGVkLCBzZWxmKSxcbiAgICAgIGNoYW5nZWQ6IF8uYmluZChzZWxmLnNlbmRDaGFuZ2VkLCBzZWxmKSxcbiAgICAgIHJlbW92ZWQ6IF8uYmluZChzZWxmLnNlbmRSZW1vdmVkLCBzZWxmKVxuICAgIH07XG4gIH0sXG5cbiAgZ2V0Q29sbGVjdGlvblZpZXc6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0gc2VsZi5jb2xsZWN0aW9uVmlld3MuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcmV0ID0gbmV3IFNlc3Npb25Db2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFNlbmRDYWxsYmFja3MoKSk7XG4gICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5zZXQoY29sbGVjdGlvbk5hbWUsIHJldCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgYWRkZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5hZGRlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHJlbW92ZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcucmVtb3ZlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkKTtcbiAgICBpZiAodmlldy5pc0VtcHR5KCkpIHtcbiAgICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5kZWxldGUoY29sbGVjdGlvbk5hbWUpO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcuY2hhbmdlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHN0YXJ0VW5pdmVyc2FsU3ViczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBzZXQgb2YgdW5pdmVyc2FsIGhhbmRsZXJzIGFuZCBzdGFydCB0aGVtLiBJZlxuICAgIC8vIGFkZGl0aW9uYWwgdW5pdmVyc2FsIHB1Ymxpc2hlcnMgc3RhcnQgd2hpbGUgd2UncmUgcnVubmluZyB0aGVtIChkdWUgdG9cbiAgICAvLyB5aWVsZGluZyksIHRoZXkgd2lsbCBydW4gc2VwYXJhdGVseSBhcyBwYXJ0IG9mIFNlcnZlci5wdWJsaXNoLlxuICAgIHZhciBoYW5kbGVycyA9IF8uY2xvbmUoc2VsZi5zZXJ2ZXIudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMpO1xuICAgIF8uZWFjaChoYW5kbGVycywgZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIERlc3Ryb3kgdGhpcyBzZXNzaW9uIGFuZCB1bnJlZ2lzdGVyIGl0IGF0IHRoZSBzZXJ2ZXIuXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24sIGV2ZW4gaWYgaXQncyBub3QgcmVnaXN0ZXJlZCBhdCB0aGVcbiAgICAvLyBzZXJ2ZXIuIFN0b3AgYWxsIHByb2Nlc3NpbmcgYW5kIHRlYXIgZXZlcnl0aGluZyBkb3duLiBJZiBhIHNvY2tldFxuICAgIC8vIHdhcyBhdHRhY2hlZCwgY2xvc2UgaXQuXG5cbiAgICAvLyBBbHJlYWR5IGRlc3Ryb3llZC5cbiAgICBpZiAoISBzZWxmLmluUXVldWUpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBEcm9wIHRoZSBtZXJnZSBib3ggZGF0YSBpbW1lZGlhdGVseS5cbiAgICBzZWxmLmluUXVldWUgPSBudWxsO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBzZWxmLmhlYXJ0YmVhdC5zdG9wKCk7XG4gICAgICBzZWxmLmhlYXJ0YmVhdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBzZWxmLnNvY2tldC5jbG9zZSgpO1xuICAgICAgc2VsZi5zb2NrZXQuX21ldGVvclNlc3Npb24gPSBudWxsO1xuICAgIH1cblxuICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAtMSk7XG5cbiAgICBNZXRlb3IuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RvcCBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBkZWZlciB0aGlzIG9uIGNsb3NlLlxuICAgICAgLy8gc3ViLl9pc0RlYWN0aXZhdGVkKCkgZGV0ZWN0cyB0aGF0IHdlIHNldCBpblF1ZXVlIHRvIG51bGwgYW5kXG4gICAgICAvLyB0cmVhdHMgaXQgYXMgc2VtaS1kZWFjdGl2YXRlZCAoaXQgd2lsbCBpZ25vcmUgaW5jb21pbmcgY2FsbGJhY2tzLCBldGMpLlxuICAgICAgc2VsZi5fZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMoKTtcblxuICAgICAgLy8gRGVmZXIgY2FsbGluZyB0aGUgY2xvc2UgY2FsbGJhY2tzLCBzbyB0aGF0IHRoZSBjYWxsZXIgY2xvc2luZ1xuICAgICAgLy8gdGhlIHNlc3Npb24gaXNuJ3Qgd2FpdGluZyBmb3IgYWxsIHRoZSBjYWxsYmFja3MgdG8gY29tcGxldGUuXG4gICAgICBfLmVhY2goc2VsZi5fY2xvc2VDYWxsYmFja3MsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBVbnJlZ2lzdGVyIHRoZSBzZXNzaW9uLlxuICAgIHNlbGYuc2VydmVyLl9yZW1vdmVTZXNzaW9uKHNlbGYpO1xuICB9LFxuXG4gIC8vIFNlbmQgYSBtZXNzYWdlIChkb2luZyBub3RoaW5nIGlmIG5vIHNvY2tldCBpcyBjb25uZWN0ZWQgcmlnaHQgbm93LilcbiAgLy8gSXQgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QgKGl0IHdpbGwgYmUgc3RyaW5naWZpZWQuKVxuICBzZW5kOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLnNvY2tldCkge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRTZW50RERQKVxuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiU2VudCBERFBcIiwgRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICAgIHNlbGYuc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU2VuZCBhIGNvbm5lY3Rpb24gZXJyb3IuXG4gIHNlbmRFcnJvcjogZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgbXNnLm9mZmVuZGluZ01lc3NhZ2UgPSBvZmZlbmRpbmdNZXNzYWdlO1xuICAgIHNlbGYuc2VuZChtc2cpO1xuICB9LFxuXG4gIC8vIFByb2Nlc3MgJ21zZycgYXMgYW4gaW5jb21pbmcgbWVzc2FnZS4gKEJ1dCBhcyBhIGd1YXJkIGFnYWluc3RcbiAgLy8gcmFjZSBjb25kaXRpb25zIGR1cmluZyByZWNvbm5lY3Rpb24sIGlnbm9yZSB0aGUgbWVzc2FnZSBpZlxuICAvLyAnc29ja2V0JyBpcyBub3QgdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgc29ja2V0LilcbiAgLy9cbiAgLy8gV2UgcnVuIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgb25lIGF0IGEgdGltZSwgaW4gdGhlIG9yZGVyXG4gIC8vIGdpdmVuIGJ5IHRoZSBjbGllbnQuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaXMgcGFzc2VkIGFuIGlkZW1wb3RlbnRcbiAgLy8gZnVuY3Rpb24gJ3VuYmxvY2snIHdoaWNoIGl0IG1heSBjYWxsIHRvIGFsbG93IG90aGVyIG1lc3NhZ2VzIHRvXG4gIC8vIGJlZ2luIHJ1bm5pbmcgaW4gcGFyYWxsZWwgaW4gYW5vdGhlciBmaWJlciAoZm9yIGV4YW1wbGUsIGEgbWV0aG9kXG4gIC8vIHRoYXQgd2FudHMgdG8geWllbGQuKSBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkgdW5ibG9ja2VkXG4gIC8vIHdoZW4gaXQgcmV0dXJucy5cbiAgLy9cbiAgLy8gQWN0dWFsbHksIHdlIGRvbid0IGhhdmUgdG8gJ3RvdGFsbHkgb3JkZXInIHRoZSBtZXNzYWdlcyBpbiB0aGlzXG4gIC8vIHdheSwgYnV0IGl0J3MgdGhlIGVhc2llc3QgdGhpbmcgdGhhdCdzIGNvcnJlY3QuICh1bnN1YiBuZWVkcyB0b1xuICAvLyBiZSBvcmRlcmVkIGFnYWluc3Qgc3ViLCBtZXRob2RzIG5lZWQgdG8gYmUgb3JkZXJlZCBhZ2FpbnN0IGVhY2hcbiAgLy8gb3RoZXIuKVxuICBwcm9jZXNzTWVzc2FnZTogZnVuY3Rpb24gKG1zZ19pbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoIXNlbGYuaW5RdWV1ZSkgLy8gd2UgaGF2ZSBiZWVuIGRlc3Ryb3llZC5cbiAgICAgIHJldHVybjtcblxuICAgIC8vIFJlc3BvbmQgdG8gcGluZyBhbmQgcG9uZyBtZXNzYWdlcyBpbW1lZGlhdGVseSB3aXRob3V0IHF1ZXVpbmcuXG4gICAgLy8gSWYgdGhlIG5lZ290aWF0ZWQgRERQIHZlcnNpb24gaXMgXCJwcmUxXCIgd2hpY2ggZGlkbid0IHN1cHBvcnRcbiAgICAvLyBwaW5ncywgcHJlc2VydmUgdGhlIFwicHJlMVwiIGJlaGF2aW9yIG9mIHJlc3BvbmRpbmcgd2l0aCBhIFwiYmFkXG4gICAgLy8gcmVxdWVzdFwiIGZvciB0aGUgdW5rbm93biBtZXNzYWdlcy5cbiAgICAvL1xuICAgIC8vIEZpYmVycyBhcmUgbmVlZGVkIGJlY2F1c2UgaGVhcnRiZWF0IHVzZXMgTWV0ZW9yLnNldFRpbWVvdXQsIHdoaWNoXG4gICAgLy8gbmVlZHMgYSBGaWJlci4gV2UgY291bGQgYWN0dWFsbHkgdXNlIHJlZ3VsYXIgc2V0VGltZW91dCBhbmQgYXZvaWRcbiAgICAvLyB0aGVzZSBuZXcgZmliZXJzLCBidXQgaXQgaXMgZWFzaWVyIHRvIGp1c3QgbWFrZSBldmVyeXRoaW5nIHVzZVxuICAgIC8vIE1ldGVvci5zZXRUaW1lb3V0IGFuZCBub3QgdGhpbmsgdG9vIGhhcmQuXG4gICAgLy9cbiAgICAvLyBBbnkgbWVzc2FnZSBjb3VudHMgYXMgcmVjZWl2aW5nIGEgcG9uZywgYXMgaXQgZGVtb25zdHJhdGVzIHRoYXRcbiAgICAvLyB0aGUgY2xpZW50IGlzIHN0aWxsIGFsaXZlLlxuICAgIGlmIChzZWxmLmhlYXJ0YmVhdCkge1xuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmhlYXJ0YmVhdC5tZXNzYWdlUmVjZWl2ZWQoKTtcbiAgICAgIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncGluZycpIHtcbiAgICAgIGlmIChzZWxmLl9yZXNwb25kVG9QaW5ncylcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6IFwicG9uZ1wiLCBpZDogbXNnX2luLmlkfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncG9uZycpIHtcbiAgICAgIC8vIFNpbmNlIGV2ZXJ5dGhpbmcgaXMgYSBwb25nLCBub3RoaW5nIHRvIGRvXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pblF1ZXVlLnB1c2gobXNnX2luKTtcbiAgICBpZiAoc2VsZi53b3JrZXJSdW5uaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIHNlbGYud29ya2VyUnVubmluZyA9IHRydWU7XG5cbiAgICB2YXIgcHJvY2Vzc05leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbXNnID0gc2VsZi5pblF1ZXVlICYmIHNlbGYuaW5RdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKCFtc2cpIHtcbiAgICAgICAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFibG9ja2VkKVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBpZGVtcG90ZW50XG4gICAgICAgICAgYmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHByb2Nlc3NOZXh0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VsZi5zZXJ2ZXIub25NZXNzYWdlSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKG1zZywgc2VsZik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfLmhhcyhzZWxmLnByb3RvY29sX2hhbmRsZXJzLCBtc2cubXNnKSlcbiAgICAgICAgICBzZWxmLnByb3RvY29sX2hhbmRsZXJzW21zZy5tc2ddLmNhbGwoc2VsZiwgbXNnLCB1bmJsb2NrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHNlbGYuc2VuZEVycm9yKCdCYWQgcmVxdWVzdCcsIG1zZyk7XG4gICAgICAgIHVuYmxvY2soKTsgLy8gaW4gY2FzZSB0aGUgaGFuZGxlciBkaWRuJ3QgYWxyZWFkeSBkbyBpdFxuICAgICAgfSkucnVuKCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3NOZXh0KCk7XG4gIH0sXG5cbiAgcHJvdG9jb2xfaGFuZGxlcnM6IHtcbiAgICBzdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm5hbWUpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkpIHtcbiAgICAgICAgc2VsZi5zZW5kRXJyb3IoXCJNYWxmb3JtZWQgc3Vic2NyaXB0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXSkge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ25vc3ViJywgaWQ6IG1zZy5pZCxcbiAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcig0MDQsIGBTdWJzY3JpcHRpb24gJyR7bXNnLm5hbWV9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9uYW1lZFN1YnMuaGFzKG1zZy5pZCkpXG4gICAgICAgIC8vIHN1YnMgYXJlIGlkZW1wb3RlbnQsIG9yIHJhdGhlciwgdGhleSBhcmUgaWdub3JlZCBpZiBhIHN1YlxuICAgICAgICAvLyB3aXRoIHRoYXQgaWQgYWxyZWFkeSBleGlzdHMuIHRoaXMgaXMgaW1wb3J0YW50IGR1cmluZ1xuICAgICAgICAvLyByZWNvbm5lY3QuXG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gWFhYIEl0J2QgYmUgbXVjaCBiZXR0ZXIgaWYgd2UgaGFkIGdlbmVyaWMgaG9va3Mgd2hlcmUgYW55IHBhY2thZ2UgY2FuXG4gICAgICAvLyBob29rIGludG8gc3Vic2NyaXB0aW9uIGhhbmRsaW5nLCBidXQgaW4gdGhlIG1lYW4gd2hpbGUgd2Ugc3BlY2lhbCBjYXNlXG4gICAgICAvLyBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UuIFRoaXMgaXMgYWxzbyBkb25lIGZvciB3ZWFrIHJlcXVpcmVtZW50cyB0b1xuICAgICAgLy8gYWRkIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlIEFjY291bnRzLiBBXG4gICAgICAvLyB1c2VyIHRyeWluZyB0byB1c2UgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgbXVzdCBleHBsaWNpdGx5IHJlcXVpcmUgaXQuXG4gICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgIHZhciBERFBSYXRlTGltaXRlciA9IFBhY2thZ2VbJ2RkcC1yYXRlLWxpbWl0ZXInXS5ERFBSYXRlTGltaXRlcjtcbiAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICBjbGllbnRBZGRyZXNzOiBzZWxmLmNvbm5lY3Rpb25IYW5kbGUuY2xpZW50QWRkcmVzcyxcbiAgICAgICAgICB0eXBlOiBcInN1YnNjcmlwdGlvblwiLFxuICAgICAgICAgIG5hbWU6IG1zZy5uYW1lLFxuICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIHZhciByYXRlTGltaXRSZXN1bHQgPSBERFBSYXRlTGltaXRlci5fY2hlY2socmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgICd0b28tbWFueS1yZXF1ZXN0cycsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVyID0gc2VsZi5zZXJ2ZXIucHVibGlzaF9oYW5kbGVyc1ttc2cubmFtZV07XG5cbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIsIG1zZy5pZCwgbXNnLnBhcmFtcywgbXNnLm5hbWUpO1xuXG4gICAgfSxcblxuICAgIHVuc3ViOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHNlbGYuX3N0b3BTdWJzY3JpcHRpb24obXNnLmlkKTtcbiAgICB9LFxuXG4gICAgbWV0aG9kOiBmdW5jdGlvbiAobXNnLCB1bmJsb2NrKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIHJlamVjdCBtYWxmb3JtZWQgbWVzc2FnZXNcbiAgICAgIC8vIEZvciBub3csIHdlIHNpbGVudGx5IGlnbm9yZSB1bmtub3duIGF0dHJpYnV0ZXMsXG4gICAgICAvLyBmb3IgZm9yd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgIGlmICh0eXBlb2YgKG1zZy5pZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICB0eXBlb2YgKG1zZy5tZXRob2QpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkgfHxcbiAgICAgICAgICAoKCdyYW5kb21TZWVkJyBpbiBtc2cpICYmICh0eXBlb2YgbXNnLnJhbmRvbVNlZWQgIT09IFwic3RyaW5nXCIpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBtZXRob2QgaW52b2NhdGlvblwiLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByYW5kb21TZWVkID0gbXNnLnJhbmRvbVNlZWQgfHwgbnVsbDtcblxuICAgICAgLy8gc2V0IHVwIHRvIG1hcmsgdGhlIG1ldGhvZCBhcyBzYXRpc2ZpZWQgb25jZSBhbGwgb2JzZXJ2ZXJzXG4gICAgICAvLyAoYW5kIHN1YnNjcmlwdGlvbnMpIGhhdmUgcmVhY3RlZCB0byBhbnkgd3JpdGVzIHRoYXQgd2VyZVxuICAgICAgLy8gZG9uZS5cbiAgICAgIHZhciBmZW5jZSA9IG5ldyBERFBTZXJ2ZXIuX1dyaXRlRmVuY2U7XG4gICAgICBmZW5jZS5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJldGlyZSB0aGUgZmVuY2Ugc28gdGhhdCBmdXR1cmUgd3JpdGVzIGFyZSBhbGxvd2VkLlxuICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgY2FsbGJhY2tzIGxpa2UgdGltZXJzIGFyZSBmcmVlIHRvIHVzZVxuICAgICAgICAvLyB0aGUgZmVuY2UsIGFuZCBpZiB0aGV5IGZpcmUgYmVmb3JlIGl0J3MgYXJtZWQgKGZvclxuICAgICAgICAvLyBleGFtcGxlLCBiZWNhdXNlIHRoZSBtZXRob2Qgd2FpdHMgZm9yIHRoZW0pIHRoZWlyXG4gICAgICAgIC8vIHdyaXRlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmZW5jZS5cbiAgICAgICAgZmVuY2UucmV0aXJlKCk7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAndXBkYXRlZCcsIG1ldGhvZHM6IFttc2cuaWRdfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZmluZCB0aGUgaGFuZGxlclxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5tZXRob2RfaGFuZGxlcnNbbXNnLm1ldGhvZF07XG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICdyZXN1bHQnLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHttc2cubWV0aG9kfScgbm90IGZvdW5kYCl9KTtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBzZWxmLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgICAgaXNTaW11bGF0aW9uOiBmYWxzZSxcbiAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgc2V0VXNlcklkOiBzZXRVc2VySWQsXG4gICAgICAgIHVuYmxvY2s6IHVuYmxvY2ssXG4gICAgICAgIGNvbm5lY3Rpb246IHNlbGYuY29ubmVjdGlvbkhhbmRsZSxcbiAgICAgICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIFhYWCBJdCdkIGJlIGJldHRlciBpZiB3ZSBjb3VsZCBob29rIGludG8gbWV0aG9kIGhhbmRsZXJzIGJldHRlciBidXRcbiAgICAgICAgLy8gZm9yIG5vdywgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGRwLXJhdGUtbGltaXRlciBleGlzdHMgc2luY2Ugd2VcbiAgICAgICAgLy8gaGF2ZSBhIHdlYWsgcmVxdWlyZW1lbnQgZm9yIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgdG8gYmUgYWRkZWRcbiAgICAgICAgLy8gdG8gb3VyIGFwcGxpY2F0aW9uLlxuICAgICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICAgIHZhciByYXRlTGltaXRlcklucHV0ID0ge1xuICAgICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgdHlwZTogXCJtZXRob2RcIixcbiAgICAgICAgICAgIG5hbWU6IG1zZy5tZXRob2QsXG4gICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHNlbGYuaWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KVxuICAgICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgTWV0ZW9yLkVycm9yKFxuICAgICAgICAgICAgICBcInRvby1tYW55LXJlcXVlc3RzXCIsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH1cbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS53aXRoVmFsdWUoXG4gICAgICAgICAgZmVuY2UsXG4gICAgICAgICAgKCkgPT4gRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgICAgICBoYW5kbGVyLCBpbnZvY2F0aW9uLCBtc2cucGFyYW1zLFxuICAgICAgICAgICAgICBcImNhbGwgdG8gJ1wiICsgbXNnLm1ldGhvZCArIFwiJ1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICAgIGZlbmNlLmFybSgpO1xuICAgICAgICB1bmJsb2NrKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIG1zZzogXCJyZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZFxuICAgICAgfTtcblxuICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBheWxvYWQucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIHBheWxvYWQuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgICAgZXhjZXB0aW9uLFxuICAgICAgICAgIGB3aGlsZSBpbnZva2luZyBtZXRob2QgJyR7bXNnLm1ldGhvZH0nYFxuICAgICAgICApO1xuICAgICAgICBzZWxmLnNlbmQocGF5bG9hZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2VhY2hTdWI6IGZ1bmN0aW9uIChmKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGYpO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMuZm9yRWFjaChmKTtcbiAgfSxcblxuICBfZGlmZkNvbGxlY3Rpb25WaWV3czogZnVuY3Rpb24gKGJlZm9yZUNWcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk1hcHMoYmVmb3JlQ1ZzLCBzZWxmLmNvbGxlY3Rpb25WaWV3cywge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kaWZmKGxlZnRWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9jVmlldywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRBZGRlZChjb2xsZWN0aW9uTmFtZSwgaWQsIGRvY1ZpZXcuZ2V0RmllbGRzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBsZWZ0T25seTogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUpIHtcbiAgICAgICAgbGVmdFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MsIGlkKSB7XG4gICAgICAgICAgc2VsZi5zZW5kUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICAvLyBTZXRzIHRoZSBjdXJyZW50IHVzZXIgaWQgaW4gYWxsIGFwcHJvcHJpYXRlIGNvbnRleHRzIGFuZCByZXJ1bnNcbiAgLy8gYWxsIHN1YnNjcmlwdGlvbnNcbiAgX3NldFVzZXJJZDogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHVzZXJJZCAhPT0gbnVsbCAmJiB0eXBlb2YgdXNlcklkICE9PSBcInN0cmluZ1wiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VXNlcklkIG11c3QgYmUgY2FsbGVkIG9uIHN0cmluZyBvciBudWxsLCBub3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB1c2VySWQpO1xuXG4gICAgLy8gUHJldmVudCBuZXdseS1jcmVhdGVkIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zIGZyb20gYmVpbmcgYWRkZWQgdG8gb3VyXG4gICAgLy8gc2Vzc2lvbjsgdGhleSB3aWxsIGJlIGZvdW5kIGJlbG93IHdoZW4gd2UgY2FsbCBzdGFydFVuaXZlcnNhbFN1YnMuXG4gICAgLy9cbiAgICAvLyAoV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBuYW1lZCBzdWJzY3JpcHRpb25zLCBiZWNhdXNlIHdlIG9ubHkgYWRkXG4gICAgLy8gdGhlbSB3aGVuIHdlIHByb2Nlc3MgYSAnc3ViJyBtZXNzYWdlLiBXZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYVxuICAgIC8vICdtZXRob2QnIG1lc3NhZ2UsIGFuZCB0aGUgbWV0aG9kIGRpZCBub3QgdW5ibG9jaywgYmVjYXVzZSBpdCBpcyBpbGxlZ2FsXG4gICAgLy8gdG8gY2FsbCBzZXRVc2VySWQgYWZ0ZXIgdW5ibG9jay4gVGh1cyB3ZSBjYW5ub3QgYmUgY29uY3VycmVudGx5IGFkZGluZyBhXG4gICAgLy8gbmV3IG5hbWVkIHN1YnNjcmlwdGlvbi4pXG4gICAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IHRydWU7XG5cbiAgICAvLyBQcmV2ZW50IGN1cnJlbnQgc3VicyBmcm9tIHVwZGF0aW5nIG91ciBjb2xsZWN0aW9uVmlld3MgYW5kIGNhbGwgdGhlaXJcbiAgICAvLyBzdG9wIGNhbGxiYWNrcy4gVGhpcyBtYXkgeWllbGQuXG4gICAgc2VsZi5fZWFjaFN1YihmdW5jdGlvbiAoc3ViKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEFsbCBzdWJzIHNob3VsZCBub3cgYmUgZGVhY3RpdmF0ZWQuIFN0b3Agc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgY2xpZW50LFxuICAgIC8vIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBwdWJsaXNoZWQgY29sbGVjdGlvbnMsIHJlc2V0IHRvIGFuIGVtcHR5IHZpZXcsIGFuZFxuICAgIC8vIHVwZGF0ZSB0aGUgdXNlcklkLlxuICAgIHNlbGYuX2lzU2VuZGluZyA9IGZhbHNlO1xuICAgIHZhciBiZWZvcmVDVnMgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cztcbiAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcbiAgICBzZWxmLnVzZXJJZCA9IHVzZXJJZDtcblxuICAgIC8vIF9zZXRVc2VySWQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gYSBNZXRlb3IgbWV0aG9kIHdpdGhcbiAgICAvLyBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uIHNldC4gQnV0IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gaXMgbm90XG4gICAgLy8gZXhwZWN0ZWQgdG8gYmUgc2V0IGluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24sIHNvIHdlIHRlbXBvcmFyeSB1bnNldCBpdC5cbiAgICAvLyBJbnNpZGUgYSBwdWJsaXNoIGZ1bmN0aW9uIEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiBpcyBzZXQuXG4gICAgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTYXZlIHRoZSBvbGQgbmFtZWQgc3VicywgYW5kIHJlc2V0IHRvIGhhdmluZyBubyBzdWJzY3JpcHRpb25zLlxuICAgICAgdmFyIG9sZE5hbWVkU3VicyA9IHNlbGYuX25hbWVkU3VicztcbiAgICAgIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICAgICAgb2xkTmFtZWRTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yiwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgdmFyIG5ld1N1YiA9IHN1Yi5fcmVjcmVhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLnNldChzdWJzY3JpcHRpb25JZCwgbmV3U3ViKTtcbiAgICAgICAgLy8gbmI6IGlmIHRoZSBoYW5kbGVyIHRocm93cyBvciBjYWxscyB0aGlzLmVycm9yKCksIGl0IHdpbGwgaW4gZmFjdFxuICAgICAgICAvLyBpbW1lZGlhdGVseSBzZW5kIGl0cyAnbm9zdWInLiBUaGlzIGlzIE9LLCB0aG91Z2guXG4gICAgICAgIG5ld1N1Yi5fcnVuSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnMgdG8gYmUgc3RhcnRlZCBvbiBvdXIgY29ubmVjdGlvbiBpblxuICAgICAgLy8gcGFyYWxsZWwgd2l0aCB0aGUgb25lcyB3ZSdyZSBzcGlubmluZyB1cCBoZXJlLCBhbmQgc3BpbiB1cCB1bml2ZXJzYWxcbiAgICAgIC8vIHN1YnMuXG4gICAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gZmFsc2U7XG4gICAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgc2VuZGluZyBtZXNzYWdlcyBhZ2FpbiwgYmVnaW5uaW5nIHdpdGggdGhlIGRpZmYgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBzdGF0ZSBvZiB0aGUgd29ybGQgdG8gdGhlIGN1cnJlbnQgc3RhdGUuIE5vIHlpZWxkcyBhcmUgYWxsb3dlZCBkdXJpbmdcbiAgICAvLyB0aGlzIGRpZmYsIHNvIHRoYXQgb3RoZXIgY2hhbmdlcyBjYW5ub3QgaW50ZXJsZWF2ZS5cbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9pc1NlbmRpbmcgPSB0cnVlO1xuICAgICAgc2VsZi5fZGlmZkNvbGxlY3Rpb25WaWV3cyhiZWZvcmVDVnMpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZi5fcGVuZGluZ1JlYWR5KSkge1xuICAgICAgICBzZWxmLnNlbmRSZWFkeShzZWxmLl9wZW5kaW5nUmVhZHkpO1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBfc3RhcnRTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLCBoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKTtcbiAgICBpZiAoc3ViSWQpXG4gICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YklkLCBzdWIpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMucHVzaChzdWIpO1xuXG4gICAgc3ViLl9ydW5IYW5kbGVyKCk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIHNwZWNpZmllZCBzdWJzY3JpcHRpb25cbiAgX3N0b3BTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChzdWJJZCwgZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViTmFtZSA9IG51bGw7XG4gICAgaWYgKHN1YklkKSB7XG4gICAgICB2YXIgbWF5YmVTdWIgPSBzZWxmLl9uYW1lZFN1YnMuZ2V0KHN1YklkKTtcbiAgICAgIGlmIChtYXliZVN1Yikge1xuICAgICAgICBzdWJOYW1lID0gbWF5YmVTdWIuX25hbWU7XG4gICAgICAgIG1heWJlU3ViLl9yZW1vdmVBbGxEb2N1bWVudHMoKTtcbiAgICAgICAgbWF5YmVTdWIuX2RlYWN0aXZhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLmRlbGV0ZShzdWJJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3BvbnNlID0ge21zZzogJ25vc3ViJywgaWQ6IHN1YklkfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgcmVzcG9uc2UuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgIGVycm9yLFxuICAgICAgICBzdWJOYW1lID8gKFwiZnJvbSBzdWIgXCIgKyBzdWJOYW1lICsgXCIgaWQgXCIgKyBzdWJJZClcbiAgICAgICAgICA6IChcImZyb20gc3ViIGlkIFwiICsgc3ViSWQpKTtcbiAgICB9XG5cbiAgICBzZWxmLnNlbmQocmVzcG9uc2UpO1xuICB9LFxuXG4gIC8vIHRlYXIgZG93biBhbGwgc3Vic2NyaXB0aW9ucy4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1Qgc2VuZCByZW1vdmVkIG9yIG5vc3ViXG4gIC8vIG1lc3NhZ2VzLCBzaW5jZSB3ZSBhc3N1bWUgdGhlIGNsaWVudCBpcyBnb25lLlxuICBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLl9uYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBpZCkge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuXG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcbiAgfSxcblxuICAvLyBEZXRlcm1pbmUgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzLCBiYXNlZCBvbiB0aGVcbiAgLy8gSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVwcmVzZW50aW5nIGhvdyBtYW55XG4gIC8vIHByb3hpZXMgdGhlIHNlcnZlciBpcyBiZWhpbmQuXG4gIF9jbGllbnRBZGRyZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRm9yIHRoZSByZXBvcnRlZCBjbGllbnQgYWRkcmVzcyBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGNvcnJlY3QsXG4gICAgLy8gdGhlIGRldmVsb3BlciBtdXN0IHNldCB0aGUgSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnRcbiAgICAvLyB2YXJpYWJsZSB0byBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGhvcHMgdGhleVxuICAgIC8vIGV4cGVjdCBpbiB0aGUgYHgtZm9yd2FyZGVkLWZvcmAgaGVhZGVyLiBFLmcuLCBzZXQgdG8gXCIxXCIgaWYgdGhlXG4gICAgLy8gc2VydmVyIGlzIGJlaGluZCBvbmUgcHJveHkuXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvdWxkIGJlIGNvbXB1dGVkIG9uY2UgYXQgc3RhcnR1cCBpbnN0ZWFkIG9mIGV2ZXJ5IHRpbWUuXG4gICAgdmFyIGh0dHBGb3J3YXJkZWRDb3VudCA9IHBhcnNlSW50KHByb2Nlc3MuZW52WydIVFRQX0ZPUldBUkRFRF9DT1VOVCddKSB8fCAwO1xuXG4gICAgaWYgKGh0dHBGb3J3YXJkZWRDb3VudCA9PT0gMClcbiAgICAgIHJldHVybiBzZWxmLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuXG4gICAgdmFyIGZvcndhcmRlZEZvciA9IHNlbGYuc29ja2V0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1mb3JcIl07XG4gICAgaWYgKCEgXy5pc1N0cmluZyhmb3J3YXJkZWRGb3IpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgZm9yd2FyZGVkRm9yID0gZm9yd2FyZGVkRm9yLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqLyk7XG5cbiAgICAvLyBUeXBpY2FsbHkgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIgaXNcbiAgICAvLyB0aGUgb3JpZ2luYWwgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50IGNvbm5lY3RpbmcgdG8gdGhlIGZpcnN0XG4gICAgLy8gcHJveHkuICBIb3dldmVyLCB0aGUgZW5kIHVzZXIgY2FuIGVhc2lseSBzcG9vZiB0aGUgaGVhZGVyLCBpblxuICAgIC8vIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHZhbHVlKHMpIHdpbGwgYmUgdGhlIGZha2UgSVAgYWRkcmVzcyBmcm9tXG4gICAgLy8gdGhlIHVzZXIgcHJldGVuZGluZyB0byBiZSBhIHByb3h5IHJlcG9ydGluZyB0aGUgb3JpZ2luYWwgSVBcbiAgICAvLyBhZGRyZXNzIHZhbHVlLiAgQnkgY291bnRpbmcgSFRUUF9GT1JXQVJERURfQ09VTlQgYmFjayBmcm9tIHRoZVxuICAgIC8vIGVuZCBvZiB0aGUgbGlzdCwgd2UgZW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBJUCBhZGRyZXNzIGJlaW5nXG4gICAgLy8gcmVwb3J0ZWQgYnkgKm91ciogZmlyc3QgcHJveHkuXG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50IDwgMCB8fCBodHRwRm9yd2FyZGVkQ291bnQgPiBmb3J3YXJkZWRGb3IubGVuZ3RoKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZm9yd2FyZGVkRm9yW2ZvcndhcmRlZEZvci5sZW5ndGggLSBodHRwRm9yd2FyZGVkQ291bnRdO1xuICB9XG59KTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIFN1YnNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBjdG9yIGZvciBhIHN1YiBoYW5kbGU6IHRoZSBpbnB1dCB0byBlYWNoIHB1Ymxpc2ggZnVuY3Rpb25cblxuLy8gSW5zdGFuY2UgbmFtZSBpcyB0aGlzIGJlY2F1c2UgaXQncyB1c3VhbGx5IHJlZmVycmVkIHRvIGFzIHRoaXMgaW5zaWRlIGFcbi8vIHB1Ymxpc2hcbi8qKlxuICogQHN1bW1hcnkgVGhlIHNlcnZlcidzIHNpZGUgb2YgYSBzdWJzY3JpcHRpb25cbiAqIEBjbGFzcyBTdWJzY3JpcHRpb25cbiAqIEBpbnN0YW5jZU5hbWUgdGhpc1xuICogQHNob3dJbnN0YW5jZU5hbWUgdHJ1ZVxuICovXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKFxuICAgIHNlc3Npb24sIGhhbmRsZXIsIHN1YnNjcmlwdGlvbklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLl9zZXNzaW9uID0gc2Vzc2lvbjsgLy8gdHlwZSBpcyBTZXNzaW9uXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFjY2VzcyBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uIFRoZSBpbmNvbWluZyBbY29ubmVjdGlvbl0oI21ldGVvcl9vbmNvbm5lY3Rpb24pIGZvciB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbmFtZSAgY29ubmVjdGlvblxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi5jb25uZWN0aW9uID0gc2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlOyAvLyBwdWJsaWMgQVBJIG9iamVjdFxuXG4gIHNlbGYuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXG4gIC8vIG15IHN1YnNjcmlwdGlvbiBJRCAoZ2VuZXJhdGVkIGJ5IGNsaWVudCwgdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3VicykuXG4gIHNlbGYuX3N1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7XG4gIC8vIHVuZGVmaW5lZCBmb3IgdW5pdmVyc2FsIHN1YnNcbiAgc2VsZi5fbmFtZSA9IG5hbWU7XG5cbiAgc2VsZi5fcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuXG4gIC8vIE9ubHkgbmFtZWQgc3Vic2NyaXB0aW9ucyBoYXZlIElEcywgYnV0IHdlIG5lZWQgc29tZSBzb3J0IG9mIHN0cmluZ1xuICAvLyBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIHN1YnNjcmlwdGlvbnMgaW5zaWRlXG4gIC8vIFNlc3Npb25Eb2N1bWVudFZpZXdzLiBXZSB1c2UgdGhpcyBzdWJzY3JpcHRpb25IYW5kbGUgZm9yIHRoYXQuXG4gIGlmIChzZWxmLl9zdWJzY3JpcHRpb25JZCkge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdOJyArIHNlbGYuX3N1YnNjcmlwdGlvbklkO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdVJyArIFJhbmRvbS5pZCgpO1xuICB9XG5cbiAgLy8gaGFzIF9kZWFjdGl2YXRlIGJlZW4gY2FsbGVkP1xuICBzZWxmLl9kZWFjdGl2YXRlZCA9IGZhbHNlO1xuXG4gIC8vIHN0b3AgY2FsbGJhY2tzIHRvIGcvYyB0aGlzIHN1Yi4gIGNhbGxlZCB3LyB6ZXJvIGFyZ3VtZW50cy5cbiAgc2VsZi5fc3RvcENhbGxiYWNrcyA9IFtdO1xuXG4gIC8vIHRoZSBzZXQgb2YgKGNvbGxlY3Rpb24sIGRvY3VtZW50aWQpIHRoYXQgdGhpcyBzdWJzY3JpcHRpb24gaGFzXG4gIC8vIGFuIG9waW5pb24gYWJvdXRcbiAgc2VsZi5fZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuXG4gIC8vIHJlbWVtYmVyIGlmIHdlIGFyZSByZWFkeS5cbiAgc2VsZi5fcmVhZHkgPSBmYWxzZTtcblxuICAvLyBQYXJ0IG9mIHRoZSBwdWJsaWMgQVBJOiB0aGUgdXNlciBvZiB0aGlzIHN1Yi5cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGlkIG9mIHRoZSBsb2dnZWQtaW4gdXNlciwgb3IgYG51bGxgIGlmIG5vIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQG5hbWUgIHVzZXJJZFxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHNlbGYudXNlcklkID0gc2Vzc2lvbi51c2VySWQ7XG5cbiAgLy8gRm9yIG5vdywgdGhlIGlkIGZpbHRlciBpcyBnb2luZyB0byBkZWZhdWx0IHRvXG4gIC8vIHRoZSB0by9mcm9tIEREUCBtZXRob2RzIG9uIE1vbmdvSUQsIHRvXG4gIC8vIHNwZWNpZmljYWxseSBkZWFsIHdpdGggbW9uZ28vbWluaW1vbmdvIE9iamVjdElkcy5cblxuICAvLyBMYXRlciwgeW91IHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaXMgYmUgXCJyYXdcIlxuICAvLyBpZiB5b3Ugd2FudCB0byBwdWJsaXNoIGEgY29sbGVjdGlvbiB0aGF0IHlvdSBrbm93XG4gIC8vIGp1c3QgaGFzIHN0cmluZ3MgZm9yIGtleXMgYW5kIG5vIGZ1bm55IGJ1c2luZXNzLCB0b1xuICAvLyBhIGRkcCBjb25zdW1lciB0aGF0IGlzbid0IG1pbmltb25nb1xuXG4gIHNlbGYuX2lkRmlsdGVyID0ge1xuICAgIGlkU3RyaW5naWZ5OiBNb25nb0lELmlkU3RyaW5naWZ5LFxuICAgIGlkUGFyc2U6IE1vbmdvSUQuaWRQYXJzZVxuICB9O1xuXG4gIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFN1YnNjcmlwdGlvbi5wcm90b3R5cGUsIHtcbiAgX3J1bkhhbmRsZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBYWFggc2hvdWxkIHdlIHVuYmxvY2soKSBoZXJlPyBFaXRoZXIgYmVmb3JlIHJ1bm5pbmcgdGhlIHB1Ymxpc2hcbiAgICAvLyBmdW5jdGlvbiwgb3IgYmVmb3JlIHJ1bm5pbmcgX3B1Ymxpc2hDdXJzb3IuXG4gICAgLy9cbiAgICAvLyBSaWdodCBub3csIGVhY2ggcHVibGlzaCBmdW5jdGlvbiBibG9ja3MgYWxsIGZ1dHVyZSBwdWJsaXNoZXMgYW5kXG4gICAgLy8gbWV0aG9kcyB3YWl0aW5nIG9uIGRhdGEgZnJvbSBNb25nbyAob3Igd2hhdGV2ZXIgZWxzZSB0aGUgZnVuY3Rpb25cbiAgICAvLyBibG9ja3Mgb24pLiBUaGlzIHByb2JhYmx5IHNsb3dzIHBhZ2UgbG9hZCBpbiBjb21tb24gY2FzZXMuXG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBzZWxmLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgc2VsZi5faGFuZGxlciwgc2VsZiwgRUpTT04uY2xvbmUoc2VsZi5fcGFyYW1zKSxcbiAgICAgICAgICAvLyBJdCdzIE9LIHRoYXQgdGhpcyB3b3VsZCBsb29rIHdlaXJkIGZvciB1bml2ZXJzYWwgc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgaGF2ZSBubyBhcmd1bWVudHMgc28gdGhlcmUgY2FuIG5ldmVyIGJlIGFuXG4gICAgICAgICAgLy8gYXVkaXQtYXJndW1lbnQtY2hlY2tzIGZhaWx1cmUuXG4gICAgICAgICAgXCJwdWJsaXNoZXIgJ1wiICsgc2VsZi5fbmFtZSArIFwiJ1wiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaWQgdGhlIGhhbmRsZXIgY2FsbCB0aGlzLmVycm9yIG9yIHRoaXMuc3RvcD9cbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgc2VsZi5fcHVibGlzaEhhbmRsZXJSZXN1bHQocmVzKTtcbiAgfSxcblxuICBfcHVibGlzaEhhbmRsZXJSZXN1bHQ6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAvLyBTUEVDSUFMIENBU0U6IEluc3RlYWQgb2Ygd3JpdGluZyB0aGVpciBvd24gY2FsbGJhY2tzIHRoYXQgaW52b2tlXG4gICAgLy8gdGhpcy5hZGRlZC9jaGFuZ2VkL3JlYWR5L2V0YywgdGhlIHVzZXIgY2FuIGp1c3QgcmV0dXJuIGEgY29sbGVjdGlvblxuICAgIC8vIGN1cnNvciBvciBhcnJheSBvZiBjdXJzb3JzIGZyb20gdGhlIHB1Ymxpc2ggZnVuY3Rpb247IHdlIGNhbGwgdGhlaXJcbiAgICAvLyBfcHVibGlzaEN1cnNvciBtZXRob2Qgd2hpY2ggc3RhcnRzIG9ic2VydmluZyB0aGUgY3Vyc29yIGFuZCBwdWJsaXNoZXMgdGhlXG4gICAgLy8gcmVzdWx0cy4gTm90ZSB0aGF0IF9wdWJsaXNoQ3Vyc29yIGRvZXMgTk9UIGNhbGwgcmVhZHkoKS5cbiAgICAvL1xuICAgIC8vIFhYWCBUaGlzIHVzZXMgYW4gdW5kb2N1bWVudGVkIGludGVyZmFjZSB3aGljaCBvbmx5IHRoZSBNb25nbyBjdXJzb3JcbiAgICAvLyBpbnRlcmZhY2UgcHVibGlzaGVzLiBTaG91bGQgd2UgbWFrZSB0aGlzIGludGVyZmFjZSBwdWJsaWMgYW5kIGVuY291cmFnZVxuICAgIC8vIHVzZXJzIHRvIGltcGxlbWVudCBpdCB0aGVtc2VsdmVzPyBBcmd1YWJseSwgaXQncyB1bm5lY2Vzc2FyeTsgdXNlcnMgY2FuXG4gICAgLy8gYWxyZWFkeSB3cml0ZSB0aGVpciBvd24gZnVuY3Rpb25zIGxpa2VcbiAgICAvLyAgIHZhciBwdWJsaXNoTXlSZWFjdGl2ZVRoaW5neSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgLy8gICAgIE1ldGVvci5wdWJsaXNoKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgICB2YXIgcmVhY3RpdmVUaGluZ3kgPSBoYW5kbGVyKCk7XG4gICAgLy8gICAgICAgcmVhY3RpdmVUaGluZ3kucHVibGlzaE1lKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgfTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXNDdXJzb3IgPSBmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMgJiYgYy5fcHVibGlzaEN1cnNvcjtcbiAgICB9O1xuICAgIGlmIChpc0N1cnNvcihyZXMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXMuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG9ubHkgcmV0dXJucyBhZnRlciB0aGUgaW5pdGlhbCBhZGRlZCBjYWxsYmFja3MgaGF2ZSBydW4uXG4gICAgICAvLyBtYXJrIHN1YnNjcmlwdGlvbiBhcyByZWFkeS5cbiAgICAgIHNlbGYucmVhZHkoKTtcbiAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShyZXMpKSB7XG4gICAgICAvLyBjaGVjayBhbGwgdGhlIGVsZW1lbnRzIGFyZSBjdXJzb3JzXG4gICAgICBpZiAoISBfLmFsbChyZXMsIGlzQ3Vyc29yKSkge1xuICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcIlB1Ymxpc2ggZnVuY3Rpb24gcmV0dXJuZWQgYW4gYXJyYXkgb2Ygbm9uLUN1cnNvcnNcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIGR1cGxpY2F0ZSBjb2xsZWN0aW9uIG5hbWVzXG4gICAgICAvLyBYWFggd2Ugc2hvdWxkIHN1cHBvcnQgb3ZlcmxhcHBpbmcgY3Vyc29ycywgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB0aGVcbiAgICAgIC8vIG1lcmdlIGJveCB0byBhbGxvdyBvdmVybGFwIHdpdGhpbiBhIHN1YnNjcmlwdGlvblxuICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lcyA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lID0gcmVzW2ldLl9nZXRDb2xsZWN0aW9uTmFtZSgpO1xuICAgICAgICBpZiAoXy5oYXMoY29sbGVjdGlvbk5hbWVzLCBjb2xsZWN0aW9uTmFtZSkpIHtcbiAgICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBtdWx0aXBsZSBjdXJzb3JzIGZvciBjb2xsZWN0aW9uIFwiICtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbk5hbWUpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sbGVjdGlvbk5hbWVzW2NvbGxlY3Rpb25OYW1lXSA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBfLmVhY2gocmVzLCBmdW5jdGlvbiAoY3VyKSB7XG4gICAgICAgICAgY3VyLl9wdWJsaXNoQ3Vyc29yKHNlbGYpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAocmVzKSB7XG4gICAgICAvLyB0cnV0aHkgdmFsdWVzIG90aGVyIHRoYW4gY3Vyc29ycyBvciBhcnJheXMgYXJlIHByb2JhYmx5IGFcbiAgICAgIC8vIHVzZXIgbWlzdGFrZSAocG9zc2libGUgcmV0dXJuaW5nIGEgTW9uZ28gZG9jdW1lbnQgdmlhLCBzYXksXG4gICAgICAvLyBgY29sbC5maW5kT25lKClgKS5cbiAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiBjYW4gb25seSByZXR1cm4gYSBDdXJzb3Igb3IgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXCJhbiBhcnJheSBvZiBDdXJzb3JzXCIpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhpcyBjYWxscyBhbGwgc3RvcCBjYWxsYmFja3MgYW5kIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gdXBkYXRpbmcgYW55XG4gIC8vIFNlc3Npb25Db2xsZWN0aW9uVmlld3MgZnVydGhlci4gSXQncyB1c2VkIHdoZW4gdGhlIHVzZXIgdW5zdWJzY3JpYmVzIG9yXG4gIC8vIGRpc2Nvbm5lY3RzLCBhcyB3ZWxsIGFzIGR1cmluZyBzZXRVc2VySWQgcmUtcnVucy4gSXQgZG9lcyAqTk9UKiBzZW5kXG4gIC8vIHJlbW92ZWQgbWVzc2FnZXMgZm9yIHRoZSBwdWJsaXNoZWQgb2JqZWN0czsgaWYgdGhhdCBpcyBuZWNlc3NhcnksIGNhbGxcbiAgLy8gX3JlbW92ZUFsbERvY3VtZW50cyBmaXJzdC5cbiAgX2RlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5fZGVhY3RpdmF0ZWQpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fZGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgIHNlbGYuX2NhbGxTdG9wQ2FsbGJhY2tzKCk7XG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInN1YnNjcmlwdGlvbnNcIiwgLTEpO1xuICB9LFxuXG4gIF9jYWxsU3RvcENhbGxiYWNrczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyB0ZWxsIGxpc3RlbmVycywgc28gdGhleSBjYW4gY2xlYW4gdXBcbiAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5fc3RvcENhbGxiYWNrcztcbiAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG4gICAgXy5lYWNoKGNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNlbmQgcmVtb3ZlIG1lc3NhZ2VzIGZvciBldmVyeSBkb2N1bWVudC5cbiAgX3JlbW92ZUFsbERvY3VtZW50czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29sbGVjdGlvbkRvY3MsIGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgICAgIGNvbGxlY3Rpb25Eb2NzLmZvckVhY2goZnVuY3Rpb24gKHN0cklkKSB7XG4gICAgICAgICAgc2VsZi5yZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBzZWxmLl9pZEZpbHRlci5pZFBhcnNlKHN0cklkKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIG5ldyBTdWJzY3JpcHRpb24gZm9yIHRoZSBzYW1lIHNlc3Npb24gd2l0aCB0aGUgc2FtZVxuICAvLyBpbml0aWFsIGNyZWF0aW9uIHBhcmFtZXRlcnMuIFRoaXMgaXNuJ3QgYSBjbG9uZTogaXQgZG9lc24ndCBoYXZlXG4gIC8vIHRoZSBzYW1lIF9kb2N1bWVudHMgY2FjaGUsIHN0b3BwZWQgc3RhdGUgb3IgY2FsbGJhY2tzOyBtYXkgaGF2ZSBhXG4gIC8vIGRpZmZlcmVudCBfc3Vic2NyaXB0aW9uSGFuZGxlLCBhbmQgZ2V0cyBpdHMgdXNlcklkIGZyb20gdGhlXG4gIC8vIHNlc3Npb24sIG5vdCBmcm9tIHRoaXMgb2JqZWN0LlxuICBfcmVjcmVhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLl9zZXNzaW9uLCBzZWxmLl9oYW5kbGVyLCBzZWxmLl9zdWJzY3JpcHRpb25JZCwgc2VsZi5fcGFyYW1zLFxuICAgICAgc2VsZi5fbmFtZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24sIHRyaWdnZXJpbmcgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblN0b3BgIGNhbGxiYWNrIHBhc3NlZCB0byBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS4gSWYgYGVycm9yYCBpcyBub3QgYSBbYE1ldGVvci5FcnJvcmBdKCNtZXRlb3JfZXJyb3IpLCBpdCB3aWxsIGJlIFtzYW5pdGl6ZWRdKCNtZXRlb3JfZXJyb3IpLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byBwYXNzIHRvIHRoZSBjbGllbnQuXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCwgZXJyb3IpO1xuICB9LFxuXG4gIC8vIE5vdGUgdGhhdCB3aGlsZSBvdXIgRERQIGNsaWVudCB3aWxsIG5vdGljZSB0aGF0IHlvdSd2ZSBjYWxsZWQgc3RvcCgpIG9uIHRoZVxuICAvLyBzZXJ2ZXIgKGFuZCBjbGVhbiB1cCBpdHMgX3N1YnNjcmlwdGlvbnMgdGFibGUpIHdlIGRvbid0IGFjdHVhbGx5IHByb3ZpZGUgYVxuICAvLyBtZWNoYW5pc20gZm9yIGFuIGFwcCB0byBub3RpY2UgdGhpcyAodGhlIHN1YnNjcmliZSBvbkVycm9yIGNhbGxiYWNrIG9ubHlcbiAgLy8gdHJpZ2dlcnMgaWYgdGhlcmUgaXMgYW4gZXJyb3IpLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIFN0b3BzIHRoaXMgY2xpZW50J3Mgc3Vic2NyaXB0aW9uIGFuZCBpbnZva2VzIHRoZSBjbGllbnQncyBgb25TdG9wYCBjYWxsYmFjayB3aXRoIG5vIGVycm9yLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBzdG9wcGVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBvblN0b3A6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYWxsYmFjayA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoY2FsbGJhY2ssICdvblN0b3AgY2FsbGJhY2snLCBzZWxmKTtcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgY2FsbGJhY2soKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWIgaGFzIGJlZW4gZGVhY3RpdmF0ZWQsICpPUiogaWYgdGhlIHNlc3Npb24gd2FzXG4gIC8vIGRlc3Ryb3llZCBidXQgdGhlIGRlZmVycmVkIGNhbGwgdG8gX2RlYWN0aXZhdGVBbGxTdWJzY3JpcHRpb25zIGhhc24ndFxuICAvLyBoYXBwZW5lZCB5ZXQuXG4gIF9pc0RlYWN0aXZhdGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLl9kZWFjdGl2YXRlZCB8fCBzZWxmLl9zZXNzaW9uLmluUXVldWUgPT09IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIG5ldyBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIG5ldyBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBsZXQgaWRzID0gc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSk7XG4gICAgaWYgKGlkcyA9PSBudWxsKSB7XG4gICAgICBpZHMgPSBuZXcgU2V0KCk7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuc2V0KGNvbGxlY3Rpb25OYW1lLCBpZHMpO1xuICAgIH1cbiAgICBpZHMuYWRkKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmFkZGVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhIGRvY3VtZW50IGluIHRoZSByZWNvcmQgc2V0IGhhcyBiZWVuIG1vZGlmaWVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgY2hhbmdlZCBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkLCB0b2dldGhlciB3aXRoIHRoZWlyIG5ldyB2YWx1ZXMuICBJZiBhIGZpZWxkIGlzIG5vdCBwcmVzZW50IGluIGBmaWVsZHNgIGl0IHdhcyBsZWZ0IHVuY2hhbmdlZDsgaWYgaXQgaXMgcHJlc2VudCBpbiBgZmllbGRzYCBhbmQgaGFzIGEgdmFsdWUgb2YgYHVuZGVmaW5lZGAgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBJZiBgX2lkYCBpcyBwcmVzZW50IGl0IGlzIGlnbm9yZWQuXG4gICAqL1xuICBjaGFuZ2VkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmNoYW5nZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZWNvcmQgc2V0LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIC8vIFdlIGRvbid0IGJvdGhlciB0byBkZWxldGUgc2V0cyBvZiB0aGluZ3MgaW4gYSBjb2xsZWN0aW9uIGlmIHRoZVxuICAgIC8vIGNvbGxlY3Rpb24gaXMgZW1wdHkuICBJdCBjb3VsZCBicmVhayBfcmVtb3ZlQWxsRG9jdW1lbnRzLlxuICAgIHNlbGYuX2RvY3VtZW50cy5nZXQoY29sbGVjdGlvbk5hbWUpLmRlbGV0ZShpZCk7XG4gICAgc2VsZi5fc2Vzc2lvbi5yZW1vdmVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYW4gaW5pdGlhbCwgY29tcGxldGUgc25hcHNob3Qgb2YgdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gc2VudC4gIFRoaXMgd2lsbCB0cmlnZ2VyIGEgY2FsbCBvbiB0aGUgY2xpZW50IHRvIHRoZSBgb25SZWFkeWAgY2FsbGJhY2sgcGFzc2VkIHRvICBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgcmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXNlbGYuX3N1YnNjcmlwdGlvbklkKVxuICAgICAgcmV0dXJuOyAgLy8gdW5uZWNlc3NhcnkgYnV0IGlnbm9yZWQgZm9yIHVuaXZlcnNhbCBzdWJcbiAgICBpZiAoIXNlbGYuX3JlYWR5KSB7XG4gICAgICBzZWxmLl9zZXNzaW9uLnNlbmRSZWFkeShbc2VsZi5fc3Vic2NyaXB0aW9uSWRdKTtcbiAgICAgIHNlbGYuX3JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblNlcnZlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBUaGUgZGVmYXVsdCBoZWFydGJlYXQgaW50ZXJ2YWwgaXMgMzAgc2Vjb25kcyBvbiB0aGUgc2VydmVyIGFuZCAzNVxuICAvLyBzZWNvbmRzIG9uIHRoZSBjbGllbnQuICBTaW5jZSB0aGUgY2xpZW50IGRvZXNuJ3QgbmVlZCB0byBzZW5kIGFcbiAgLy8gcGluZyBhcyBsb25nIGFzIGl0IGlzIHJlY2VpdmluZyBwaW5ncywgdGhpcyBtZWFucyB0aGF0IHBpbmdzXG4gIC8vIG5vcm1hbGx5IGdvIGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50LlxuICAvL1xuICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gIHNlbGYub3B0aW9ucyA9IF8uZGVmYXVsdHMob3B0aW9ucyB8fCB7fSwge1xuICAgIGhlYXJ0YmVhdEludGVydmFsOiAxNTAwMCxcbiAgICBoZWFydGJlYXRUaW1lb3V0OiAxNTAwMCxcbiAgICAvLyBGb3IgdGVzdGluZywgYWxsb3cgcmVzcG9uZGluZyB0byBwaW5ncyB0byBiZSBkaXNhYmxlZC5cbiAgICByZXNwb25kVG9QaW5nczogdHJ1ZVxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGNvbWVzIGluIHRvIHRoZVxuICAvLyBzZXJ2ZXIgYW5kIGNvbXBsZXRlcyBERFAgdmVyc2lvbiBuZWdvdGlhdGlvbi4gVXNlIGFuIG9iamVjdCBpbnN0ZWFkXG4gIC8vIG9mIGFuIGFycmF5IHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIG9uZSBmcm9tIHRoZSBsaXN0IHdoaWxlXG4gIC8vIGl0ZXJhdGluZyBvdmVyIGl0LlxuICBzZWxmLm9uQ29ubmVjdGlvbkhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25Db25uZWN0aW9uIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgLy8gTWFwIG9mIGNhbGxiYWNrcyB0byBjYWxsIHdoZW4gYSBuZXcgbWVzc2FnZSBjb21lcyBpbi5cbiAgc2VsZi5vbk1lc3NhZ2VIb29rID0gbmV3IEhvb2soe1xuICAgIGRlYnVnUHJpbnRFeGNlcHRpb25zOiBcIm9uTWVzc2FnZSBjYWxsYmFja1wiXG4gIH0pO1xuXG4gIHNlbGYucHVibGlzaF9oYW5kbGVycyA9IHt9O1xuICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzID0gW107XG5cbiAgc2VsZi5tZXRob2RfaGFuZGxlcnMgPSB7fTtcblxuICBzZWxmLnNlc3Npb25zID0gbmV3IE1hcCgpOyAvLyBtYXAgZnJvbSBpZCB0byBzZXNzaW9uXG5cbiAgc2VsZi5zdHJlYW1fc2VydmVyID0gbmV3IFN0cmVhbVNlcnZlcjtcblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIucmVnaXN0ZXIoZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIHNvY2tldCBpbXBsZW1lbnRzIHRoZSBTb2NrSlNDb25uZWN0aW9uIGludGVyZmFjZVxuICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG5cbiAgICB2YXIgc2VuZEVycm9yID0gZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgICAgdmFyIG1zZyA9IHttc2c6ICdlcnJvcicsIHJlYXNvbjogcmVhc29ufTtcbiAgICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH07XG5cbiAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbiAocmF3X21zZykge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRSZWNlaXZlZEREUCkge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiUmVjZWl2ZWQgRERQXCIsIHJhd19tc2cpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgbXNnID0gRERQQ29tbW9uLnBhcnNlRERQKHJhd19tc2cpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ1BhcnNlIGVycm9yJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtc2cgPT09IG51bGwgfHwgIW1zZy5tc2cpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobXNnLm1zZyA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgICAgc2VuZEVycm9yKFwiQWxyZWFkeSBjb25uZWN0ZWRcIiwgbXNnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5faGFuZGxlQ29ubmVjdChzb2NrZXQsIG1zZyk7XG4gICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb2NrZXQuX21ldGVvclNlc3Npb24pIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ011c3QgY29ubmVjdCBmaXJzdCcsIG1zZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5wcm9jZXNzTWVzc2FnZShtc2cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBYWFggcHJpbnQgc3RhY2sgbmljZWx5XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJJbnRlcm5hbCBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBtZXNzYWdlXCIsIG1zZywgZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIH0pLnJ1bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbl8uZXh0ZW5kKFNlcnZlci5wcm90b3R5cGUsIHtcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBvbkNvbm5lY3Rpb246IGZ1bmN0aW9uIChmbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5vbkNvbm5lY3Rpb25Ib29rLnJlZ2lzdGVyKGZuKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uTWVzc2FnZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uTWVzc2FnZUhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIF9oYW5kbGVDb25uZWN0OiBmdW5jdGlvbiAoc29ja2V0LCBtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBUaGUgY29ubmVjdCBtZXNzYWdlIG11c3Qgc3BlY2lmeSBhIHZlcnNpb24gYW5kIGFuIGFycmF5IG9mIHN1cHBvcnRlZFxuICAgIC8vIHZlcnNpb25zLCBhbmQgaXQgbXVzdCBjbGFpbSB0byBzdXBwb3J0IHdoYXQgaXQgaXMgcHJvcG9zaW5nLlxuICAgIGlmICghKHR5cGVvZiAobXNnLnZlcnNpb24pID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIF8uaXNBcnJheShtc2cuc3VwcG9ydCkgJiZcbiAgICAgICAgICBfLmFsbChtc2cuc3VwcG9ydCwgXy5pc1N0cmluZykgJiZcbiAgICAgICAgICBfLmNvbnRhaW5zKG1zZy5zdXBwb3J0LCBtc2cudmVyc2lvbikpKSB7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKHttc2c6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OU1swXX0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIHRoZSBmdXR1cmUsIGhhbmRsZSBzZXNzaW9uIHJlc3VtcHRpb246IHNvbWV0aGluZyBsaWtlOlxuICAgIC8vICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBzZWxmLnNlc3Npb25zW21zZy5zZXNzaW9uXVxuICAgIHZhciB2ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lvbihtc2cuc3VwcG9ydCwgRERQQ29tbW9uLlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMpO1xuXG4gICAgaWYgKG1zZy52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAvLyBUaGUgYmVzdCB2ZXJzaW9uIHRvIHVzZSAoYWNjb3JkaW5nIHRvIHRoZSBjbGllbnQncyBzdGF0ZWQgcHJlZmVyZW5jZXMpXG4gICAgICAvLyBpcyBub3QgdGhlIG9uZSB0aGUgY2xpZW50IGlzIHRyeWluZyB0byB1c2UuIEluZm9ybSB0aGVtIGFib3V0IHRoZSBiZXN0XG4gICAgICAvLyB2ZXJzaW9uIHRvIHVzZS5cbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsIHZlcnNpb246IHZlcnNpb259KSk7XG4gICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBZYXksIHZlcnNpb24gbWF0Y2hlcyEgQ3JlYXRlIGEgbmV3IHNlc3Npb24uXG4gICAgLy8gTm90ZTogVHJvcG9zcGhlcmUgZGVwZW5kcyBvbiB0aGUgYWJpbGl0eSB0byBtdXRhdGVcbiAgICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbmV3IFNlc3Npb24oc2VsZiwgdmVyc2lvbiwgc29ja2V0LCBzZWxmLm9wdGlvbnMpO1xuICAgIHNlbGYuc2Vzc2lvbnMuc2V0KHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5pZCwgc29ja2V0Ll9tZXRlb3JTZXNzaW9uKTtcbiAgICBzZWxmLm9uQ29ubmVjdGlvbkhvb2suZWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGlmIChzb2NrZXQuX21ldGVvclNlc3Npb24pXG4gICAgICAgIGNhbGxiYWNrKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBwdWJsaXNoIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIHtTdHJpbmd9IGlkZW50aWZpZXIgZm9yIHF1ZXJ5XG4gICAqIEBwYXJhbSBoYW5kbGVyIHtGdW5jdGlvbn0gcHVibGlzaCBoYW5kbGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtPYmplY3R9XG4gICAqXG4gICAqIFNlcnZlciB3aWxsIGNhbGwgaGFuZGxlciBmdW5jdGlvbiBvbiBlYWNoIG5ldyBzdWJzY3JpcHRpb24sXG4gICAqIGVpdGhlciB3aGVuIHJlY2VpdmluZyBERFAgc3ViIG1lc3NhZ2UgZm9yIGEgbmFtZWQgc3Vic2NyaXB0aW9uLCBvciBvblxuICAgKiBERFAgY29ubmVjdCBmb3IgYSB1bml2ZXJzYWwgc3Vic2NyaXB0aW9uLlxuICAgKlxuICAgKiBJZiBuYW1lIGlzIG51bGwsIHRoaXMgd2lsbCBiZSBhIHN1YnNjcmlwdGlvbiB0aGF0IGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZWQgYW5kIHBlcm1hbmVudGx5IG9uIGZvciBhbGwgY29ubmVjdGVkXG4gICAqIGNsaWVudCwgaW5zdGVhZCBvZiBhIHN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB0dXJuZWQgb24gYW5kIG9mZlxuICAgKiB3aXRoIHN1YnNjcmliZSgpLlxuICAgKlxuICAgKiBvcHRpb25zIHRvIGNvbnRhaW46XG4gICAqICAtIChtb3N0bHkgaW50ZXJuYWwpIGlzX2F1dG86IHRydWUgaWYgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICogICAgZnJvbSBhbiBhdXRvcHVibGlzaCBob29rLiB0aGlzIGlzIGZvciBjb3NtZXRpYyBwdXJwb3NlcyBvbmx5XG4gICAqICAgIChpdCBsZXRzIHVzIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IGEgd2FybmluZyBzdWdnZXN0aW5nXG4gICAqICAgIHRoYXQgeW91IHR1cm4gb2ZmIGF1dG9wdWJsaXNoLilcbiAgICovXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFB1Ymxpc2ggYSByZWNvcmQgc2V0LlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWUgSWYgU3RyaW5nLCBuYW1lIG9mIHRoZSByZWNvcmQgc2V0LiAgSWYgT2JqZWN0LCBwdWJsaWNhdGlvbnMgRGljdGlvbmFyeSBvZiBwdWJsaXNoIGZ1bmN0aW9ucyBieSBuYW1lLiAgSWYgYG51bGxgLCB0aGUgc2V0IGhhcyBubyBuYW1lLCBhbmQgdGhlIHJlY29yZCBzZXQgaXMgYXV0b21hdGljYWxseSBzZW50IHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiBjYWxsZWQgb24gdGhlIHNlcnZlciBlYWNoIHRpbWUgYSBjbGllbnQgc3Vic2NyaWJlcy4gIEluc2lkZSB0aGUgZnVuY3Rpb24sIGB0aGlzYCBpcyB0aGUgcHVibGlzaCBoYW5kbGVyIG9iamVjdCwgZGVzY3JpYmVkIGJlbG93LiAgSWYgdGhlIGNsaWVudCBwYXNzZWQgYXJndW1lbnRzIHRvIGBzdWJzY3JpYmVgLCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLlxuICAgKi9cbiAgcHVibGlzaDogZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoISBfLmlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKG5hbWUgJiYgbmFtZSBpbiBzZWxmLnB1Ymxpc2hfaGFuZGxlcnMpIHtcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIklnbm9yaW5nIGR1cGxpY2F0ZSBwdWJsaXNoIG5hbWVkICdcIiArIG5hbWUgKyBcIidcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFBhY2thZ2UuYXV0b3B1Ymxpc2ggJiYgIW9wdGlvbnMuaXNfYXV0bykge1xuICAgICAgICAvLyBUaGV5IGhhdmUgYXV0b3B1Ymxpc2ggb24sIHlldCB0aGV5J3JlIHRyeWluZyB0byBtYW51YWxseVxuICAgICAgICAvLyBwaWNraW5nIHN0dWZmIHRvIHB1Ymxpc2guIFRoZXkgcHJvYmFibHkgc2hvdWxkIHR1cm4gb2ZmXG4gICAgICAgIC8vIGF1dG9wdWJsaXNoLiAoVGhpcyBjaGVjayBpc24ndCBwZXJmZWN0IC0tIGlmIHlvdSBjcmVhdGUgYVxuICAgICAgICAvLyBwdWJsaXNoIGJlZm9yZSB5b3UgdHVybiBvbiBhdXRvcHVibGlzaCwgaXQgd29uJ3QgY2F0Y2hcbiAgICAgICAgLy8gaXQuIEJ1dCB0aGlzIHdpbGwgZGVmaW5pdGVseSBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlXG4gICAgICAgIC8vIHlvdSd2ZSBhZGRlZCB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZSB0byB5b3VyIGFwcCwgYW5kIGFyZVxuICAgICAgICAvLyBjYWxsaW5nIHB1Ymxpc2ggZnJvbSB5b3VyIGFwcCBjb2RlLilcbiAgICAgICAgaWYgKCFzZWxmLndhcm5lZF9hYm91dF9hdXRvcHVibGlzaCkge1xuICAgICAgICAgIHNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoID0gdHJ1ZTtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFxuICAgIFwiKiogWW91J3ZlIHNldCB1cCBzb21lIGRhdGEgc3Vic2NyaXB0aW9ucyB3aXRoIE1ldGVvci5wdWJsaXNoKCksIGJ1dFxcblwiICtcbiAgICBcIioqIHlvdSBzdGlsbCBoYXZlIGF1dG9wdWJsaXNoIHR1cm5lZCBvbi4gQmVjYXVzZSBhdXRvcHVibGlzaCBpcyBzdGlsbFxcblwiICtcbiAgICBcIioqIG9uLCB5b3VyIE1ldGVvci5wdWJsaXNoKCkgY2FsbHMgd29uJ3QgaGF2ZSBtdWNoIGVmZmVjdC4gQWxsIGRhdGFcXG5cIiArXG4gICAgXCIqKiB3aWxsIHN0aWxsIGJlIHNlbnQgdG8gYWxsIGNsaWVudHMuXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiBUdXJuIG9mZiBhdXRvcHVibGlzaCBieSByZW1vdmluZyB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZTpcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqICAgJCBtZXRlb3IgcmVtb3ZlIGF1dG9wdWJsaXNoXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiAuLiBhbmQgbWFrZSBzdXJlIHlvdSBoYXZlIE1ldGVvci5wdWJsaXNoKCkgYW5kIE1ldGVvci5zdWJzY3JpYmUoKSBjYWxsc1xcblwiICtcbiAgICBcIioqIGZvciBlYWNoIGNvbGxlY3Rpb24gdGhhdCB5b3Ugd2FudCBjbGllbnRzIHRvIHNlZS5cXG5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUpXG4gICAgICAgIHNlbGYucHVibGlzaF9oYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXI7XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VsZi51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICAvLyBTcGluIHVwIHRoZSBuZXcgcHVibGlzaGVyIG9uIGFueSBleGlzdGluZyBzZXNzaW9uIHRvby4gUnVuIGVhY2hcbiAgICAgICAgLy8gc2Vzc2lvbidzIHN1YnNjcmlwdGlvbiBpbiBhIG5ldyBGaWJlciwgc28gdGhhdCB0aGVyZSdzIG5vIGNoYW5nZSBmb3JcbiAgICAgICAgLy8gc2VsZi5zZXNzaW9ucyB0byBjaGFuZ2Ugd2hpbGUgd2UncmUgcnVubmluZyB0aGlzIGxvb3AuXG4gICAgICAgIHNlbGYuc2Vzc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIGlmICghc2Vzc2lvbi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3Vicykge1xuICAgICAgICAgICAgRmliZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlc3Npb24uX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIF8uZWFjaChuYW1lLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHNlbGYucHVibGlzaChrZXksIHZhbHVlLCB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZVNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb24uaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBpbnZva2VkIG92ZXIgdGhlIG5ldHdvcmsgYnkgY2xpZW50cy5cbiAgICogQGxvY3VzIEFueXdoZXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtZXRob2RzIERpY3Rpb25hcnkgd2hvc2Uga2V5cyBhcmUgbWV0aG9kIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGZ1bmN0aW9ucy5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBtZXRob2RzOiBmdW5jdGlvbiAobWV0aG9kcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBfLmVhY2gobWV0aG9kcywgZnVuY3Rpb24gKGZ1bmMsIG5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kICdcIiArIG5hbWUgKyBcIicgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgaWYgKHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIG1ldGhvZCBuYW1lZCAnXCIgKyBuYW1lICsgXCInIGlzIGFscmVhZHkgZGVmaW5lZFwiKTtcbiAgICAgIHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdID0gZnVuYztcbiAgICB9KTtcbiAgfSxcblxuICBjYWxsOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHJlc3VsdCBjYWxsYmFjaywgbm90XG4gICAgICAvLyBhIHBhcmFtZXRlciB0byB0aGUgcmVtb3RlIG1ldGhvZC5cbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHkobmFtZSwgYXJncywgY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIEEgdmVyc2lvbiBvZiB0aGUgY2FsbCBtZXRob2QgdGhhdCBhbHdheXMgcmV0dXJucyBhIFByb21pc2UuXG4gIGNhbGxBc3luYzogZnVuY3Rpb24gKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MpO1xuICB9LFxuXG4gIGFwcGx5OiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAvLyBXZSB3ZXJlIHBhc3NlZCAzIGFyZ3VtZW50cy4gVGhleSBtYXkgYmUgZWl0aGVyIChuYW1lLCBhcmdzLCBvcHRpb25zKVxuICAgIC8vIG9yIChuYW1lLCBhcmdzLCBjYWxsYmFjaylcbiAgICBpZiAoISBjYWxsYmFjayAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaW4gd2hpY2hldmVyIHdheSB0aGUgY2FsbGVyIGFza2VkIGZvciBpdC4gTm90ZSB0aGF0IHdlXG4gICAgLy8gZG8gTk9UIGJsb2NrIG9uIHRoZSB3cml0ZSBmZW5jZSBpbiBhbiBhbmFsb2dvdXMgd2F5IHRvIGhvdyB0aGUgY2xpZW50XG4gICAgLy8gYmxvY2tzIG9uIHRoZSByZWxldmFudCBkYXRhIGJlaW5nIHZpc2libGUsIHNvIHlvdSBhcmUgTk9UIGd1YXJhbnRlZWQgdGhhdFxuICAgIC8vIGN1cnNvciBvYnNlcnZlIGNhbGxiYWNrcyBoYXZlIGZpcmVkIHdoZW4geW91ciBjYWxsYmFjayBpcyBpbnZva2VkLiAoV2VcbiAgICAvLyBjYW4gY2hhbmdlIHRoaXMgaWYgdGhlcmUncyBhIHJlYWwgdXNlIGNhc2UuKVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcHJvbWlzZS50aGVuKFxuICAgICAgICByZXN1bHQgPT4gY2FsbGJhY2sodW5kZWZpbmVkLCByZXN1bHQpLFxuICAgICAgICBleGNlcHRpb24gPT4gY2FsbGJhY2soZXhjZXB0aW9uKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb21pc2UuYXdhaXQoKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHBhcmFtIG9wdGlvbnMge09wdGlvbmFsIE9iamVjdH1cbiAgYXBwbHlBc3luYzogZnVuY3Rpb24gKG5hbWUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAvLyBSdW4gdGhlIGhhbmRsZXJcbiAgICB2YXIgaGFuZGxlciA9IHRoaXMubWV0aG9kX2hhbmRsZXJzW25hbWVdO1xuICAgIGlmICghIGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IE1ldGVvci5FcnJvcig0MDQsIGBNZXRob2QgJyR7bmFtZX0nIG5vdCBmb3VuZGApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSBtZXRob2QgY2FsbCBmcm9tIHdpdGhpbiBhbm90aGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLFxuICAgIC8vIGdldCB0aGUgdXNlciBzdGF0ZSBmcm9tIHRoZSBvdXRlciBtZXRob2Qgb3IgcHVibGlzaCBmdW5jdGlvbiwgb3RoZXJ3aXNlXG4gICAgLy8gZG9uJ3QgYWxsb3cgc2V0VXNlcklkIHRvIGJlIGNhbGxlZFxuICAgIHZhciB1c2VySWQgPSBudWxsO1xuICAgIHZhciBzZXRVc2VySWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNhbGwgc2V0VXNlcklkIG9uIGEgc2VydmVyIGluaXRpYXRlZCBtZXRob2QgY2FsbFwiKTtcbiAgICB9O1xuICAgIHZhciBjb25uZWN0aW9uID0gbnVsbDtcbiAgICB2YXIgY3VycmVudE1ldGhvZEludm9jYXRpb24gPSBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uID0gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciByYW5kb21TZWVkID0gbnVsbDtcbiAgICBpZiAoY3VycmVudE1ldGhvZEludm9jYXRpb24pIHtcbiAgICAgIHVzZXJJZCA9IGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudE1ldGhvZEludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICAgIHJhbmRvbVNlZWQgPSBERFBDb21tb24ubWFrZVJwY1NlZWQoY3VycmVudE1ldGhvZEludm9jYXRpb24sIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi51c2VySWQ7XG4gICAgICBzZXRVc2VySWQgPSBmdW5jdGlvbih1c2VySWQpIHtcbiAgICAgICAgY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5fc2Vzc2lvbi5fc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9O1xuICAgICAgY29ubmVjdGlvbiA9IGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgaW52b2NhdGlvbiA9IG5ldyBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvbih7XG4gICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgdXNlcklkLFxuICAgICAgc2V0VXNlcklkLFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIHJhbmRvbVNlZWRcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlc29sdmUoXG4gICAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgaW52b2NhdGlvbixcbiAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIEVKU09OLmNsb25lKGFyZ3MpLFxuICAgICAgICAgIFwiaW50ZXJuYWwgY2FsbCB0byAnXCIgKyBuYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkpLnRoZW4oRUpTT04uY2xvbmUpO1xuICB9LFxuXG4gIF91cmxGb3JTZXNzaW9uOiBmdW5jdGlvbiAoc2Vzc2lvbklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzZXNzaW9uID0gc2VsZi5zZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoc2Vzc2lvbilcbiAgICAgIHJldHVybiBzZXNzaW9uLl9zb2NrZXRVcmw7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG52YXIgY2FsY3VsYXRlVmVyc2lvbiA9IGZ1bmN0aW9uIChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFZlcnNpb25zKSB7XG4gIHZhciBjb3JyZWN0VmVyc2lvbiA9IF8uZmluZChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucywgZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICByZXR1cm4gXy5jb250YWlucyhzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9ucywgdmVyc2lvbik7XG4gIH0pO1xuICBpZiAoIWNvcnJlY3RWZXJzaW9uKSB7XG4gICAgY29ycmVjdFZlcnNpb24gPSBzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9uc1swXTtcbiAgfVxuICByZXR1cm4gY29ycmVjdFZlcnNpb247XG59O1xuXG5ERFBTZXJ2ZXIuX2NhbGN1bGF0ZVZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uO1xuXG5cbi8vIFwiYmxpbmRcIiBleGNlcHRpb25zIG90aGVyIHRoYW4gdGhvc2UgdGhhdCB3ZXJlIGRlbGliZXJhdGVseSB0aHJvd24gdG8gc2lnbmFsXG4vLyBlcnJvcnMgdG8gdGhlIGNsaWVudFxudmFyIHdyYXBJbnRlcm5hbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGNvbnRleHQpIHtcbiAgaWYgKCFleGNlcHRpb24pIHJldHVybiBleGNlcHRpb247XG5cbiAgLy8gVG8gYWxsb3cgcGFja2FnZXMgdG8gdGhyb3cgZXJyb3JzIGludGVuZGVkIGZvciB0aGUgY2xpZW50IGJ1dCBub3QgaGF2ZSB0b1xuICAvLyBkZXBlbmQgb24gdGhlIE1ldGVvci5FcnJvciBjbGFzcywgYGlzQ2xpZW50U2FmZWAgY2FuIGJlIHNldCB0byB0cnVlIG9uIGFueVxuICAvLyBlcnJvciBiZWZvcmUgaXQgaXMgdGhyb3duLlxuICBpZiAoZXhjZXB0aW9uLmlzQ2xpZW50U2FmZSkge1xuICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE1ldGVvci5FcnJvcikpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWVzc2FnZSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE1ldGVvci5FcnJvcihleGNlcHRpb24uZXJyb3IsIGV4Y2VwdGlvbi5yZWFzb24sIGV4Y2VwdGlvbi5kZXRhaWxzKTtcbiAgICAgIGV4Y2VwdGlvbi5tZXNzYWdlID0gb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gZXhjZXB0aW9uO1xuICB9XG5cbiAgLy8gVGVzdHMgY2FuIHNldCB0aGUgJ19leHBlY3RlZEJ5VGVzdCcgZmxhZyBvbiBhbiBleGNlcHRpb24gc28gaXQgd29uJ3QgZ28gdG9cbiAgLy8gdGhlIHNlcnZlciBsb2cuXG4gIGlmICghZXhjZXB0aW9uLl9leHBlY3RlZEJ5VGVzdCkge1xuICAgIE1ldGVvci5fZGVidWcoXCJFeGNlcHRpb24gXCIgKyBjb250ZXh0LCBleGNlcHRpb24uc3RhY2spO1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICAgIE1ldGVvci5fZGVidWcoXCJTYW5pdGl6ZWQgYW5kIHJlcG9ydGVkIHRvIHRoZSBjbGllbnQgYXM6XCIsIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcik7XG4gICAgICBNZXRlb3IuX2RlYnVnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlkIHRoZSBlcnJvciBjb250YWluIG1vcmUgZGV0YWlscyB0aGF0IGNvdWxkIGhhdmUgYmVlbiB1c2VmdWwgaWYgY2F1Z2h0IGluXG4gIC8vIHNlcnZlciBjb2RlIChvciBpZiB0aHJvd24gZnJvbSBub24tY2xpZW50LW9yaWdpbmF0ZWQgY29kZSksIGJ1dCBhbHNvXG4gIC8vIHByb3ZpZGVkIGEgXCJzYW5pdGl6ZWRcIiB2ZXJzaW9uIHdpdGggbW9yZSBjb250ZXh0IHRoYW4gNTAwIEludGVybmFsIHNlcnZlclxuICAvLyBlcnJvcj8gVXNlIHRoYXQuXG4gIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICBpZiAoZXhjZXB0aW9uLnNhbml0aXplZEVycm9yLmlzQ2xpZW50U2FmZSlcbiAgICAgIHJldHVybiBleGNlcHRpb24uc2FuaXRpemVkRXJyb3I7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQgKyBcIiBwcm92aWRlcyBhIHNhbml0aXplZEVycm9yIHRoYXQgXCIgK1xuICAgICAgICAgICAgICAgICAgXCJkb2VzIG5vdCBoYXZlIGlzQ2xpZW50U2FmZSBwcm9wZXJ0eSBzZXQ7IGlnbm9yaW5nXCIpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcIkludGVybmFsIHNlcnZlciBlcnJvclwiKTtcbn07XG5cblxuLy8gQXVkaXQgYXJndW1lbnQgY2hlY2tzLCBpZiB0aGUgYXVkaXQtYXJndW1lbnQtY2hlY2tzIHBhY2thZ2UgZXhpc3RzIChpdCBpcyBhXG4vLyB3ZWFrIGRlcGVuZGVuY3kgb2YgdGhpcyBwYWNrYWdlKS5cbnZhciBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MgPSBmdW5jdGlvbiAoZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pIHtcbiAgYXJncyA9IGFyZ3MgfHwgW107XG4gIGlmIChQYWNrYWdlWydhdWRpdC1hcmd1bWVudC1jaGVja3MnXSkge1xuICAgIHJldHVybiBNYXRjaC5fZmFpbElmQXJndW1lbnRzQXJlTm90QWxsQ2hlY2tlZChcbiAgICAgIGYsIGNvbnRleHQsIGFyZ3MsIGRlc2NyaXB0aW9uKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShjb250ZXh0LCBhcmdzKTtcbn07XG4iLCJ2YXIgRnV0dXJlID0gTnBtLnJlcXVpcmUoJ2ZpYmVycy9mdXR1cmUnKTtcblxuLy8gQSB3cml0ZSBmZW5jZSBjb2xsZWN0cyBhIGdyb3VwIG9mIHdyaXRlcywgYW5kIHByb3ZpZGVzIGEgY2FsbGJhY2tcbi8vIHdoZW4gYWxsIG9mIHRoZSB3cml0ZXMgYXJlIGZ1bGx5IGNvbW1pdHRlZCBhbmQgcHJvcGFnYXRlZCAoYWxsXG4vLyBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIHRoZSB3cml0ZSBhbmQgYWNrbm93bGVkZ2VkIGl0Lilcbi8vXG5ERFBTZXJ2ZXIuX1dyaXRlRmVuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBzZWxmLmFybWVkID0gZmFsc2U7XG4gIHNlbGYuZmlyZWQgPSBmYWxzZTtcbiAgc2VsZi5yZXRpcmVkID0gZmFsc2U7XG4gIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzID0gMDtcbiAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xufTtcblxuLy8gVGhlIGN1cnJlbnQgd3JpdGUgZmVuY2UuIFdoZW4gdGhlcmUgaXMgYSBjdXJyZW50IHdyaXRlIGZlbmNlLCBjb2RlXG4vLyB0aGF0IHdyaXRlcyB0byBkYXRhYmFzZXMgc2hvdWxkIHJlZ2lzdGVyIHRoZWlyIHdyaXRlcyB3aXRoIGl0IHVzaW5nXG4vLyBiZWdpbldyaXRlKCkuXG4vL1xuRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZSA9IG5ldyBNZXRlb3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Xcml0ZUZlbmNlLnByb3RvdHlwZSwge1xuICAvLyBTdGFydCB0cmFja2luZyBhIHdyaXRlLCBhbmQgcmV0dXJuIGFuIG9iamVjdCB0byByZXByZXNlbnQgaXQuIFRoZVxuICAvLyBvYmplY3QgaGFzIGEgc2luZ2xlIG1ldGhvZCwgY29tbWl0dGVkKCkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZVxuICAvLyBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgaXMgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkLiBZb3UgY2FuXG4gIC8vIGNvbnRpbnVlIHRvIGFkZCB3cml0ZXMgdG8gdGhlIFdyaXRlRmVuY2UgdXAgdW50aWwgaXQgaXMgdHJpZ2dlcmVkXG4gIC8vIChjYWxscyBpdHMgY2FsbGJhY2tzIGJlY2F1c2UgYWxsIHdyaXRlcyBoYXZlIGNvbW1pdHRlZC4pXG4gIGJlZ2luV3JpdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZi5yZXRpcmVkKVxuICAgICAgcmV0dXJuIHsgY29tbWl0dGVkOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gYWRkIHdyaXRlc1wiKTtcblxuICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKys7XG4gICAgdmFyIGNvbW1pdHRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbW1pdHRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb21taXR0ZWQgY2FsbGVkIHR3aWNlIG9uIHRoZSBzYW1lIHdyaXRlXCIpO1xuICAgICAgICBjb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuICAgICAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEFybSB0aGUgZmVuY2UuIE9uY2UgdGhlIGZlbmNlIGlzIGFybWVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmVcbiAgLy8gdW5jb21taXR0ZWQgd3JpdGVzLCBpdCB3aWxsIGFjdGl2YXRlLlxuICBhcm06IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYgPT09IEREUFNlcnZlci5fQ3VycmVudFdyaXRlRmVuY2UuZ2V0KCkpXG4gICAgICB0aHJvdyBFcnJvcihcIkNhbid0IGFybSB0aGUgY3VycmVudCBmZW5jZVwiKTtcbiAgICBzZWxmLmFybWVkID0gdHJ1ZTtcbiAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBmaXJpbmcgdGhlIGZlbmNlLlxuICAvLyBDYWxsYmFjayBmdW5jdGlvbiBjYW4gYWRkIG5ldyB3cml0ZXMgdG8gdGhlIGZlbmNlLCBpbiB3aGljaCBjYXNlXG4gIC8vIGl0IHdvbid0IGZpcmUgdW50aWwgdGhvc2Ugd3JpdGVzIGFyZSBkb25lIGFzIHdlbGwuXG4gIG9uQmVmb3JlRmlyZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZW5jZSBmaXJlcy5cbiAgb25BbGxDb21taXR0ZWQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmVuY2UgaGFzIGFscmVhZHkgYWN0aXZhdGVkIC0tIHRvbyBsYXRlIHRvIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcImFkZCBhIGNhbGxiYWNrXCIpO1xuICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbi4gQXJtcyB0aGUgZmVuY2UsIHRoZW4gYmxvY2tzIHVudGlsIGl0IGZpcmVzLlxuICBhcm1BbmRXYWl0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlO1xuICAgIHNlbGYub25BbGxDb21taXR0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgZnV0dXJlWydyZXR1cm4nXSgpO1xuICAgIH0pO1xuICAgIHNlbGYuYXJtKCk7XG4gICAgZnV0dXJlLndhaXQoKTtcbiAgfSxcblxuICBfbWF5YmVGaXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid3JpdGUgZmVuY2UgYWxyZWFkeSBhY3RpdmF0ZWQ/XCIpO1xuICAgIGlmIChzZWxmLmFybWVkICYmICFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2sgKGZ1bmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmdW5jKHNlbGYpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFwiZXhjZXB0aW9uIGluIHdyaXRlIGZlbmNlIGNhbGxiYWNrXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICAgIHdoaWxlIChzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMtLTtcblxuICAgICAgaWYgKCFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgICBzZWxmLmZpcmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3M7XG4gICAgICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyBEZWFjdGl2YXRlIHRoaXMgZmVuY2Ugc28gdGhhdCBhZGRpbmcgbW9yZSB3cml0ZXMgaGFzIG5vIGVmZmVjdC5cbiAgLy8gVGhlIGZlbmNlIG11c3QgaGF2ZSBhbHJlYWR5IGZpcmVkLlxuICByZXRpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJldGlyZSBhIGZlbmNlIHRoYXQgaGFzbid0IGZpcmVkLlwiKTtcbiAgICBzZWxmLnJldGlyZWQgPSB0cnVlO1xuICB9XG59KTtcbiIsIi8vIEEgXCJjcm9zc2JhclwiIGlzIGEgY2xhc3MgdGhhdCBwcm92aWRlcyBzdHJ1Y3R1cmVkIG5vdGlmaWNhdGlvbiByZWdpc3RyYXRpb24uXG4vLyBTZWUgX21hdGNoIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBob3cgYSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIuXG4vLyBBbGwgbm90aWZpY2F0aW9ucyBhbmQgdHJpZ2dlcnMgbXVzdCBoYXZlIGEgc3RyaW5nIGtleSBuYW1lZCAnY29sbGVjdGlvbicuXG5cbkREUFNlcnZlci5fQ3Jvc3NiYXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHNlbGYubmV4dElkID0gMTtcbiAgLy8gbWFwIGZyb20gY29sbGVjdGlvbiBuYW1lIChzdHJpbmcpIC0+IGxpc3RlbmVyIGlkIC0+IG9iamVjdC4gZWFjaCBvYmplY3QgaGFzXG4gIC8vIGtleXMgJ3RyaWdnZXInLCAnY2FsbGJhY2snLiAgQXMgYSBoYWNrLCB0aGUgZW1wdHkgc3RyaW5nIG1lYW5zIFwibm9cbiAgLy8gY29sbGVjdGlvblwiLlxuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiA9IHt9O1xuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50ID0ge307XG4gIHNlbGYuZmFjdFBhY2thZ2UgPSBvcHRpb25zLmZhY3RQYWNrYWdlIHx8IFwibGl2ZWRhdGFcIjtcbiAgc2VsZi5mYWN0TmFtZSA9IG9wdGlvbnMuZmFjdE5hbWUgfHwgbnVsbDtcbn07XG5cbl8uZXh0ZW5kKEREUFNlcnZlci5fQ3Jvc3NiYXIucHJvdG90eXBlLCB7XG4gIC8vIG1zZyBpcyBhIHRyaWdnZXIgb3IgYSBub3RpZmljYXRpb25cbiAgX2NvbGxlY3Rpb25Gb3JNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghIF8uaGFzKG1zZywgJ2NvbGxlY3Rpb24nKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mKG1zZy5jb2xsZWN0aW9uKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChtc2cuY29sbGVjdGlvbiA9PT0gJycpXG4gICAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgZW1wdHkgY29sbGVjdGlvbiFcIik7XG4gICAgICByZXR1cm4gbXNnLmNvbGxlY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgbm9uLXN0cmluZyBjb2xsZWN0aW9uIVwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTGlzdGVuIGZvciBub3RpZmljYXRpb24gdGhhdCBtYXRjaCAndHJpZ2dlcicuIEEgbm90aWZpY2F0aW9uXG4gIC8vIG1hdGNoZXMgaWYgaXQgaGFzIHRoZSBrZXktdmFsdWUgcGFpcnMgaW4gdHJpZ2dlciBhcyBhXG4gIC8vIHN1YnNldC4gV2hlbiBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzLCBjYWxsICdjYWxsYmFjaycsIHBhc3NpbmdcbiAgLy8gdGhlIGFjdHVhbCBub3RpZmljYXRpb24uXG4gIC8vXG4gIC8vIFJldHVybnMgYSBsaXN0ZW4gaGFuZGxlLCB3aGljaCBpcyBhbiBvYmplY3Qgd2l0aCBhIG1ldGhvZFxuICAvLyBzdG9wKCkuIENhbGwgc3RvcCgpIHRvIHN0b3AgbGlzdGVuaW5nLlxuICAvL1xuICAvLyBYWFggSXQgc2hvdWxkIGJlIGxlZ2FsIHRvIGNhbGwgZmlyZSgpIGZyb20gaW5zaWRlIGEgbGlzdGVuKClcbiAgLy8gY2FsbGJhY2s/XG4gIGxpc3RlbjogZnVuY3Rpb24gKHRyaWdnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpZCA9IHNlbGYubmV4dElkKys7XG5cbiAgICB2YXIgY29sbGVjdGlvbiA9IHNlbGYuX2NvbGxlY3Rpb25Gb3JNZXNzYWdlKHRyaWdnZXIpO1xuICAgIHZhciByZWNvcmQgPSB7dHJpZ2dlcjogRUpTT04uY2xvbmUodHJpZ2dlciksIGNhbGxiYWNrOiBjYWxsYmFja307XG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSA9IHt9O1xuICAgICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25Db3VudFtjb2xsZWN0aW9uXSA9IDA7XG4gICAgfVxuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dW2lkXSA9IHJlY29yZDtcbiAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dKys7XG5cbiAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICBzZWxmLmZhY3RQYWNrYWdlLCBzZWxmLmZhY3ROYW1lLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgICAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdO1xuICAgICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dLS07XG4gICAgICAgIGlmIChzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dO1xuICAgICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvLyBGaXJlIHRoZSBwcm92aWRlZCAnbm90aWZpY2F0aW9uJyAoYW4gb2JqZWN0IHdob3NlIGF0dHJpYnV0ZVxuICAvLyB2YWx1ZXMgYXJlIGFsbCBKU09OLWNvbXBhdGliaWxlKSAtLSBpbmZvcm0gYWxsIG1hdGNoaW5nIGxpc3RlbmVyc1xuICAvLyAocmVnaXN0ZXJlZCB3aXRoIGxpc3RlbigpKS5cbiAgLy9cbiAgLy8gSWYgZmlyZSgpIGlzIGNhbGxlZCBpbnNpZGUgYSB3cml0ZSBmZW5jZSwgdGhlbiBlYWNoIG9mIHRoZVxuICAvLyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgaW5zaWRlIHRoZSB3cml0ZSBmZW5jZSBhcyB3ZWxsLlxuICAvL1xuICAvLyBUaGUgbGlzdGVuZXJzIG1heSBiZSBpbnZva2VkIGluIHBhcmFsbGVsLCByYXRoZXIgdGhhbiBzZXJpYWxseS5cbiAgZmlyZTogZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2Uobm90aWZpY2F0aW9uKTtcblxuICAgIGlmICghIF8uaGFzKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uID0gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgdmFyIGNhbGxiYWNrSWRzID0gW107XG4gICAgXy5lYWNoKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGZ1bmN0aW9uIChsLCBpZCkge1xuICAgICAgaWYgKHNlbGYuX21hdGNoZXMobm90aWZpY2F0aW9uLCBsLnRyaWdnZXIpKSB7XG4gICAgICAgIGNhbGxiYWNrSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuZXIgY2FsbGJhY2tzIGNhbiB5aWVsZCwgc28gd2UgbmVlZCB0byBmaXJzdCBmaW5kIGFsbCB0aGUgb25lcyB0aGF0XG4gICAgLy8gbWF0Y2ggaW4gYSBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24gKHdoaWNoIGNhbid0XG4gICAgLy8gYmUgbXV0YXRlZCBkdXJpbmcgdGhpcyBpdGVyYXRpb24pLCBhbmQgdGhlbiBpbnZva2UgdGhlIG1hdGNoaW5nXG4gICAgLy8gY2FsbGJhY2tzLCBjaGVja2luZyBiZWZvcmUgZWFjaCBjYWxsIHRvIGVuc3VyZSB0aGV5IGhhdmVuJ3Qgc3RvcHBlZC5cbiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGF0XG4gICAgLy8gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl0gc3RpbGwgPT09IGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sXG4gICAgLy8gYmVjYXVzZSB0aGUgb25seSB3YXkgdGhhdCBzdG9wcyBiZWluZyB0cnVlIGlzIGlmIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25cbiAgICAvLyBmaXJzdCBnZXRzIHJlZHVjZWQgZG93biB0byB0aGUgZW1wdHkgb2JqZWN0IChhbmQgdGhlbiBuZXZlciBnZXRzXG4gICAgLy8gaW5jcmVhc2VkIGFnYWluKS5cbiAgICBfLmVhY2goY2FsbGJhY2tJZHMsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKF8uaGFzKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGlkKSkge1xuICAgICAgICBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uW2lkXS5jYWxsYmFjayhub3RpZmljYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIEEgbm90aWZpY2F0aW9uIG1hdGNoZXMgYSB0cmlnZ2VyIGlmIGFsbCBrZXlzIHRoYXQgZXhpc3QgaW4gYm90aCBhcmUgZXF1YWwuXG4gIC8vXG4gIC8vIEV4YW1wbGVzOlxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICBub24tdGFyZ2V0ZWQgcXVlcnkpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICB0YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgdGFyZ2V0ZWQgd3JpdGUgdG8gYSBjb2xsZWN0aW9uIG1hdGNoZXMgYSB0YXJnZXRlZCBxdWVyeSB0YXJnZXRlZFxuICAvLyAgICAgYXQgdGhlIHNhbWUgZG9jdW1lbnQpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBkb2VzIG5vdCBtYXRjaCBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWVwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gZG9lcyBub3QgbWF0Y2ggYSB0YXJnZXRlZCBxdWVyeVxuICAvLyAgICAgdGFyZ2V0ZWQgYXQgYSBkaWZmZXJlbnQgZG9jdW1lbnQpXG4gIF9tYXRjaGVzOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uLCB0cmlnZ2VyKSB7XG4gICAgLy8gTW9zdCBub3RpZmljYXRpb25zIHRoYXQgdXNlIHRoZSBjcm9zc2JhciBoYXZlIGEgc3RyaW5nIGBjb2xsZWN0aW9uYCBhbmRcbiAgICAvLyBtYXliZSBhbiBgaWRgIHRoYXQgaXMgYSBzdHJpbmcgb3IgT2JqZWN0SUQuIFdlJ3JlIGFscmVhZHkgZGl2aWRpbmcgdXBcbiAgICAvLyB0cmlnZ2VycyBieSBjb2xsZWN0aW9uLCBidXQgbGV0J3MgZmFzdC10cmFjayBcIm5vcGUsIGRpZmZlcmVudCBJRFwiIChhbmRcbiAgICAvLyBhdm9pZCB0aGUgb3Zlcmx5IGdlbmVyaWMgRUpTT04uZXF1YWxzKS4gVGhpcyBtYWtlcyBhIG5vdGljZWFibGVcbiAgICAvLyBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21ldGVvci9tZXRlb3IvcHVsbC8zNjk3XG4gICAgaWYgKHR5cGVvZihub3RpZmljYXRpb24uaWQpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YodHJpZ2dlci5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG5vdGlmaWNhdGlvbi5pZCAhPT0gdHJpZ2dlci5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobm90aWZpY2F0aW9uLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICB0cmlnZ2VyLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICAhIG5vdGlmaWNhdGlvbi5pZC5lcXVhbHModHJpZ2dlci5pZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gXy5hbGwodHJpZ2dlciwgZnVuY3Rpb24gKHRyaWdnZXJWYWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm4gIV8uaGFzKG5vdGlmaWNhdGlvbiwga2V5KSB8fFxuICAgICAgICBFSlNPTi5lcXVhbHModHJpZ2dlclZhbHVlLCBub3RpZmljYXRpb25ba2V5XSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBUaGUgXCJpbnZhbGlkYXRpb24gY3Jvc3NiYXJcIiBpcyBhIHNwZWNpZmljIGluc3RhbmNlIHVzZWQgYnkgdGhlIEREUCBzZXJ2ZXIgdG9cbi8vIGltcGxlbWVudCB3cml0ZSBmZW5jZSBub3RpZmljYXRpb25zLiBMaXN0ZW5lciBjYWxsYmFja3Mgb24gdGhpcyBjcm9zc2JhclxuLy8gc2hvdWxkIGNhbGwgYmVnaW5Xcml0ZSBvbiB0aGUgY3VycmVudCB3cml0ZSBmZW5jZSBiZWZvcmUgdGhleSByZXR1cm4sIGlmIHRoZXlcbi8vIHdhbnQgdG8gZGVsYXkgdGhlIHdyaXRlIGZlbmNlIGZyb20gZmlyaW5nIChpZSwgdGhlIEREUCBtZXRob2QtZGF0YS11cGRhdGVkXG4vLyBtZXNzYWdlIGZyb20gYmVpbmcgc2VudCkuXG5ERFBTZXJ2ZXIuX0ludmFsaWRhdGlvbkNyb3NzYmFyID0gbmV3IEREUFNlcnZlci5fQ3Jvc3NiYXIoe1xuICBmYWN0TmFtZTogXCJpbnZhbGlkYXRpb24tY3Jvc3NiYXItbGlzdGVuZXJzXCJcbn0pO1xuIiwiaWYgKHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMKSB7XG4gIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwgPVxuICAgIHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMO1xufVxuXG5NZXRlb3Iuc2VydmVyID0gbmV3IFNlcnZlcjtcblxuTWV0ZW9yLnJlZnJlc2ggPSBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gIEREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIuZmlyZShub3RpZmljYXRpb24pO1xufTtcblxuLy8gUHJveHkgdGhlIHB1YmxpYyBtZXRob2RzIG9mIE1ldGVvci5zZXJ2ZXIgc28gdGhleSBjYW5cbi8vIGJlIGNhbGxlZCBkaXJlY3RseSBvbiBNZXRlb3IuXG5fLmVhY2goWydwdWJsaXNoJywgJ21ldGhvZHMnLCAnY2FsbCcsICdhcHBseScsICdvbkNvbm5lY3Rpb24nLCAnb25NZXNzYWdlJ10sXG4gICAgICAgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgIE1ldGVvcltuYW1lXSA9IF8uYmluZChNZXRlb3Iuc2VydmVyW25hbWVdLCBNZXRlb3Iuc2VydmVyKTtcbiAgICAgICB9KTtcblxuLy8gTWV0ZW9yLnNlcnZlciB1c2VkIHRvIGJlIGNhbGxlZCBNZXRlb3IuZGVmYXVsdF9zZXJ2ZXIuIFByb3ZpZGVcbi8vIGJhY2tjb21wYXQgYXMgYSBjb3VydGVzeSBldmVuIHRob3VnaCBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZC5cbi8vIFhYWCBDT01QQVQgV0lUSCAwLjYuNFxuTWV0ZW9yLmRlZmF1bHRfc2VydmVyID0gTWV0ZW9yLnNlcnZlcjtcbiJdfQ== diff --git a/server/bundle/programs/server/packages/ddp-server.js.map b/server/bundle/programs/server/packages/ddp-server.js.map index 15ae6c399a..96d6a02426 100644 --- a/server/bundle/programs/server/packages/ddp-server.js.map +++ b/server/bundle/programs/server/packages/ddp-server.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","jsessionid","USE_JSESSIONID","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function() {},\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({server_id: \"0\"}));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function() {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function(event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function(request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function(oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","jsessionid","USE_JSESSIONID","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","stack","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function() {},\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({server_id: \"0\"}));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function() {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function(event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function(request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function(oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception.stack);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file diff --git a/server/bundle/programs/server/packages/modules.js b/server/bundle/programs/server/packages/modules.js index 3827730c7f..895c268e35 100644 --- a/server/bundle/programs/server/packages/modules.js +++ b/server/bundle/programs/server/packages/modules.js @@ -463,7 +463,7 @@ module.useNode(); // module.exports = { "name": "@steedos/objectql", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "lib/index.js" }; @@ -490,7 +490,7 @@ module.useNode(); // module.exports = { "name": "@steedos/i18n", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "lib/index.js" }; @@ -517,7 +517,7 @@ module.useNode(); // module.exports = { "name": "@steedos/core", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "lib/index.js" }; @@ -544,7 +544,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-meteor-package-loader", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "index.js" }; @@ -571,7 +571,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-api", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "index.js" }; @@ -598,7 +598,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-metadata-server", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "index.js" }; @@ -625,7 +625,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-package-registry", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "package.service.js" }; @@ -652,7 +652,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-objectql", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "package.service.js" }; @@ -679,7 +679,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-ui", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "package.service.js" }; @@ -706,7 +706,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-pages", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "package.service.js" }; @@ -733,7 +733,7 @@ module.useNode(); // module.exports = { "name": "@steedos/router", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "lib/index.js" }; @@ -760,7 +760,7 @@ module.useNode(); // module.exports = { "name": "@steedos/auth", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "lib/index.js" }; @@ -787,7 +787,7 @@ module.useNode(); // module.exports = { "name": "@steedos/workflow", - "version": "2.7.4-beta.1", + "version": "2.7.4-beta.2", "main": "index.js" }; diff --git a/server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js b/server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.js similarity index 99% rename from server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js rename to server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.js index a92b7b4af7..3947c05c4c 100644 --- a/server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js +++ b/server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.js @@ -68,7 +68,7 @@ object-assign * Copyright 2011-2019 Twitter, Inc. * Licensed under the MIT license */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}e.fn.emulateTransitionEnd=function(t){var n=!1,r=this,i;return e(this).one("bsTransitionEnd",(function(){n=!0})),setTimeout((function(){n||e(r).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};function r(t){return this.each((function(){var r=e(this),i=r.data("bs.alert");i||r.data("bs.alert",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.TRANSITION_DURATION=150,n.prototype.close=function(t){var r=e(this),i=r.attr("data-target");i||(i=(i=r.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function s(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=r.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",s).emulateTransitionEnd(n.TRANSITION_DURATION):s())};var i=e.fn.alert;e.fn.alert=r,e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.isLoading=!1};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.button"),o="object"==typeof n&&n;i||r.data("bs.button",i=new t(this,o)),"toggle"==n?i.toggle():n&&i.setState(n)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var n="disabled",r=this.$element,i=r.is("input")?"val":"html",o=r.data();t+="Text",null==o.resetText&&r.data("resetText",r[i]()),setTimeout(e.proxy((function(){r[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n).prop(n,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n).prop(n,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=n,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var r=e(t.target).closest(".btn");n.call(r,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.carousel"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n),s="string"==typeof n?n:o.slide;i||r.data("bs.carousel",i=new t(this,o)),"number"==typeof n?i.to(n):s?i[s]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t),r;if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(n,r){var i=this.$element.find(".item.active"),o=r||this.getItemForDirection(n,i),s=this.interval,a="next"==n?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var f=o[0],c=e.Event("slide.bs.carousel",{relatedTarget:f,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,s&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=e(this.$indicators.children()[this.getItemIndex(o)]);l&&l.addClass("active")}var h=e.Event("slid.bs.carousel",{relatedTarget:f,direction:a});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(n),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(a),o.addClass(a),i.one("bsTransitionEnd",(function(){o.removeClass([n,a].join(" ")).addClass("active"),i.removeClass(["active",a].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(h)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(h)),s&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=n,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var i=function(t){var r=e(this),i=r.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=r.attr("data-target")||i,s=e(document).find(o);if(s.hasClass("carousel")){var a=e.extend({},s.data(),r.data()),u=r.attr("data-slide-to");u&&(a.interval=!1),n.call(s,a),u&&s.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);n.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.$trigger=e('[data-toggle="collapse"][href="#'+n.id+'"],[data-toggle="collapse"][data-target="#'+n.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(r)}function r(n){return this.each((function(){var r=e(this),i=r.data("bs.collapse"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n);!i&&o.toggle&&/show|hide/.test(n)&&(o.toggle=!1),i||r.data("bs.collapse",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var n,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(n=i.data("bs.collapse"))&&n.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(r.call(i,"hide"),n||i.data("bs.collapse",null));var s=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[s](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[s](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return a.call(this);var u=e.camelCase(["scroll",s].join("-"));this.$element.one("bsTransitionEnd",e.proxy(a,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[s](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var n=e.Event("hide.bs.collapse");if(this.$element.trigger(n),!n.isDefaultPrevented()){var r=this.dimension();this.$element[r](this.$element[r]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[r](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,r){var i=e(r);this.addAriaAndCollapsedClass(n(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var i=e.fn.collapse;e.fn.collapse=r,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=n(i),s,a=o.data("bs.collapse")?"toggle":i.data();r.call(o,a)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r="#"!==n?e(document).find(n):null;return r&&r.length?r:t.parent()}function o(r){r&&3===r.which||(e(t).remove(),e(n).each((function(){var t=e(this),n=i(t),o={relatedTarget:this};n.hasClass("open")&&(r&&"click"==r.type&&/input|textarea/i.test(r.target.tagName)&&e.contains(n[0],r.target)||(n.trigger(r=e.Event("hide.bs.dropdown",o)),r.isDefaultPrevented()||(t.attr("aria-expanded","false"),n.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function s(t){return this.each((function(){var n=e(this),i=n.data("bs.dropdown");i||n.data("bs.dropdown",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.prototype.toggle=function(t){var n=e(this);if(!n.is(".disabled, :disabled")){var r=i(n),s=r.hasClass("open");if(o(),!s){"ontouchstart"in document.documentElement&&!r.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var a={relatedTarget:this};if(r.trigger(t=e.Event("show.bs.dropdown",a)),t.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),r.toggleClass("open").trigger(e.Event("shown.bs.dropdown",a))}return!1}},r.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var r=e(this);if(t.preventDefault(),t.stopPropagation(),!r.is(".disabled, :disabled")){var o=i(r),s=o.hasClass("open");if(!s&&27!=t.which||s&&27==t.which)return 27==t.which&&o.find(n).trigger("focus"),r.trigger("click");var a=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+a);if(u.length){var f=u.index(t.target);38==t.which&&f>0&&f--,40==t.which&&fdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},f.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var s=i[o];if("click"==s)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",u="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},f.prototype.getDefaults=function(){return f.DEFAULTS},f.prototype.getOptions=function(n){var r=this.$element.data();for(var i in r)r.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete r[i];return(n=e.extend({},this.getDefaults(),r,n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.sanitize&&(n.template=u(n.template,n.whiteList,n.sanitizeFn)),n},f.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,(function(e,r){n[e]!=r&&(t[e]=r)})),t},f.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState)n.hoverState="in";else{if(clearTimeout(n.timeout),n.hoverState="in",!n.options.delay||!n.options.delay.show)return n.show();n.timeout=setTimeout((function(){"in"==n.hoverState&&n.show()}),n.options.delay.show)}},f.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},f.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),!n.isInStateTrue()){if(clearTimeout(n.timeout),n.hoverState="out",!n.options.delay||!n.options.delay.hide)return n.hide();n.timeout=setTimeout((function(){"out"==n.hoverState&&n.hide()}),n.options.delay.hide)}},f.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var n=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!n)return;var r=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,u=a.test(s);u&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var c=this.getPosition(),l=i[0].offsetWidth,h=i[0].offsetHeight;if(u){var d=s,p=this.getPosition(this.$viewport);s="bottom"==s&&c.bottom+h>p.bottom?"top":"top"==s&&c.top-hp.width?"left":"left"==s&&c.left-ls.top+s.height&&(i.top=s.top+s.height-u)}else{var f=t.left-o,c=t.left+o+n;fs.right&&(i.left=s.left+s.width-c)}return i},f.prototype.getTitle=function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)},f.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},f.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},f.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},f.prototype.enable=function(){this.enabled=!0},f.prototype.disable=function(){this.enabled=!1},f.prototype.toggleEnabled=function(){this.enabled=!this.enabled},f.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},f.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},f.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var l=e.fn.tooltip;e.fn.tooltip=c,e.fn.tooltip.Constructor=f,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=l,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function n(n){return this.each((function(){var r=e(this),i=r.data("bs.popover"),o="object"==typeof n&&n;!i&&/destroy|hide/.test(n)||(i||r.data("bs.popover",i=new t(this,o)),"string"==typeof n&&i[n]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();if(this.options.html){var r=typeof n;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===r&&(n=this.sanitizeHtml(n))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===r?"html":"append"](n)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(n);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var r=e.fn.popover;e.fn.popover=n,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=r,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(n).is(document.body)?e(window):e(n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each((function(){var r=e(this),i=r.data("bs.scrollspy"),o="object"==typeof n&&n;i||r.data("bs.scrollspy",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[n]().top+r,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),n=this.options.offset+t-this.$scrollElement.height(),r=this.offsets,i=this.targets,o=this.activeTarget,s;if(this.scrollHeight!=t&&this.refresh(),e>=n)return o!=(s=i[i.length-1])&&this.activate(s);if(o&&e=r[s]&&(void 0===r[s+1]||e .active"),s=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!r.find("> .fade").length);function a(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),n.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(n[0].offsetWidth,n.addClass("in")):n.removeClass("fade"),n.parent(".dropdown-menu").length&&n.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&s?o.one("bsTransitionEnd",a).emulateTransitionEnd(t.TRANSITION_DURATION):a(),o.removeClass("in")};var r=e.fn.tab;e.fn.tab=n,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var i=function(t){t.preventDefault(),n.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(n,r){this.options=e.extend({},t.DEFAULTS,r);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(n),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.affix"),o="object"==typeof n&&n;i||r.data("bs.affix",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,n,r){var i=this.$target.scrollTop(),o=this.$element.offset(),s=this.$target.height();if(null!=n&&"top"==this.affixed)return i=e-r&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),n=this.$element.offset();return this.pinnedOffset=n.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var n=this.$element.height(),r=this.options.offset,i=r.top,o=r.bottom,s=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(o=i=r),"function"==typeof i&&(i=r.top(this.$element)),"function"==typeof o&&(o=r.bottom(this.$element));var a=this.getState(s,n,i,o);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var u="affix"+(a?"-"+a:""),f=e.Event(u+".bs.affix");if(this.$element.trigger(f),f.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:s-n-o})}};var r=e.fn.affix;e.fn.affix=n,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),r=t.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),n.call(t,r)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,n,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,n,e,r,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),s=t("path"),a=t("detect-libc");Math.random();var u=s.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+a.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(c){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(c.stack||c.message||c),new Error("Missing binary. See message above.")}f(e.exports)}function f(e){try{var t=process.binding("async_wrap"),n;if(t.asyncIdStackSize instanceof Function)n=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");l=t.constants.kStackLength,n=function(){return t.async_hook_fields[l]}}var r=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,s;if(!r||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,s=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var a=t.async_id_fields||t.async_uid_fields;function u(){for(var e=n(),t=new Array(e);e>0;--e){var i=a[o];t[e-1]={asyncId:i,triggerId:a[s]},r(i)}return t}function f(e){for(var t=0;t0)i.changeLanguage(e,r);else if(0!=a[u]){a[u]=0;var f=new XMLHttpRequest;f.overrideMimeType("application/json"),f.open("GET",u,!1),f.send(null),200===f.status?a[u]=1:a[u]=-1,n.addResourceBundle(e,s,JSON.parse(f.response)||{}),i.changeLanguage(e,r)}};n.changeLanguage=p;var g=function(e,t,n){return i.format(e,t,n)};n.format=g;var b=function(){return i.languages};n.getLanguages=b;var m=function(e,t){return i.loadLanguages(e,t)};n.loadLanguages=m;var v=function(e,t){return i.loadNamespaces(e,t)};n.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};n.on=y;var _=function(e,t){return i.off(e,t)};n.off=_,r.__exportStar(t("./i18n/i18n"),n),r.__exportStar(t("./i18n/i18n.app"),n),r.__exportStar(t("./translations"),n)},i18n:{"i18n.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.fallbackKeys=n.getObjectI18nTemplate=n.translationI18nObjects=n.addObjectsI18n=n.translationI18nObject=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="_",a="base",u="core",f="translation",c=function(e,t){var n={lng:t,ns:f};if((0,r.exists)(e,n))return(0,r._t)(e,n)},l=function(e){return"".concat(e,"__object")},h=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},d=function(e,t){var n=h(e,t);return"".concat(n).concat("_","inlineHelpText")},p=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(n)},g=function(e,t,n){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(n)},b=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},m=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,n){var r=l(t);return c(r,e)||n||""},_=function(e,t,n,r,i){var o=h(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=_(e,a,n,r,i))}return s||r||""},w=function(e,t,n,r,i){var o=d(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=w(e,a,n,r,i))}return s||r||""},k=function(e,t,n,r){var i=p(t,n);return c(i,e)||r||""},j=function(e,t,n,r,i,o){var s=g(t,n,r),a=c(s,e);if(!a){var u=v(o);u&&"base"!=t&&"core"!=t&&(a=j(e,u,n,r,i,o))}return a||i||""},x=function(e,t,n,r,i){var o=b(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=x(e,a,n,r,i))}return s||r||""},S=function(e,t,n,r,i){var o=m(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=S(e,a,n,r,i))}return s||r||""},D=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},E=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(D(e))}))):n.push(D(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},A=function(e,t,n){n.label=y(e,t,n.label),i.each(n.fields,(function(r,o){if(r.label=_(e,t,o,r.label,n.datasource),r.inlineHelpText&&(r.inlineHelpText=w(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(r.group=k(e,t,r.group,r.group)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var a=j(e,t,o,r.value,r.label,n.datasource);s.push(i.extend({},r,{label:a}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=x(e,t,i,r.label,n.datasource)})),i.each(n.list_views,(function(r,i){r.label=S(e,t,i,r.label,n.datasource)}))};n.translationI18nObject=A;var C=function(e){i.each(e,(function(e){(0,r.addResourceBundle)(e.lng,f,e.data,!0,!0)}))};n.addObjectsI18n=C;var M=function(e,t){i.each(t,(function(t,r){(0,n.translationI18nObject)(e,r,t)}))};n.translationI18nObjects=M;var O=function(e,t,n){var r=o(n);E(r);var s={};return s[l(t)]=y(e,t,r.label),i.each(r.fields,(function(n,o){s[h(t,o)]=_(e,t,o,n.label),n.inlineHelpText&&(s[d(t,o)]=w(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(s[p(t,n.group)]=k(e,t,n.group,n.group)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[g(t,o,n.value)]=j(e,t,o,n.value,n.label))}))})),i.each(r.actions,(function(n,r){s[b(t,r)]=x(e,t,r,n.label)})),i.each(r.list_views,(function(n,r){s[m(t,r)]=S(e,t,r,n.label)})),s};n.getObjectI18nTemplate=O,n.fallbackKeys={getObjectLabelKey:l,getObjectFieldLabelKey:h,getObjectFieldInlineHelpTextLabelKey:d,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:g,getObjectActionLabelKey:b,getObjectListviewLabelKey:m}},"i18n.app.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.appFallbackKeys=n.getAppI18nTemplate=n.translationI18nApps=n.translationI18nMenus=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="translation",a="_",u=function(e,t){var n={lng:t,ns:s};if((0,r.exists)(e,n))return(0,r._t)(e,n)},f=function(e){return"app".concat("_").concat(e).concat("_","name")},c=function(e){return"app".concat("_").concat(e).concat("_","description")},l=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(n)},h=function(e){return"menu".concat("_").concat(e)},d=function(e){return"tab".concat("_").concat(e)},p=function(e,t,n){var r=f(t);return u(r,e)||n||""},g=function(e,t,n){var r=c(t);return u(r,e)||n||""},b=function(e,t,n){var r=h(t);return u(r,e)||n||""},m=function(e,t,r){r.label=p(e,t,r.label||r.name),r.description=g(e,t,r.description),(0,n.translationI18nMenus)(e,r.admin_menus)},v=function(e,t){i.each(t,(function(t){var n=b(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,n){m(e,n,t)}))};n.translationI18nApps=y;var _=function(e,t,n){var r=o(n),s={};return s[f(t)]=p(e,t,r.label||r.name),s[c(t)]=g(e,t,r.description),i.each(r.admin_menus,(function(t){s[h(t._id)]=b(e,t._id,t.label||t.name)})),s};n.getAppI18nTemplate=_,n.appFallbackKeys={getAppLabelKey:f,getAppDescriptionKey:c,getAppGroupKey:l,getMenuLabelKey:h,getTabKey:d}}},translations:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SteedosTranslationPrefixKeys=n.convertObject=void 0;var r=t("tslib"),i=t("underscore");r.__exportStar(t("./objectTranslation"),n),r.__exportStar(t("./translation"),n),r.__exportStar(t("./templates/objectTranslation"),n),r.__exportStar(t("./templates/translation"),n);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},s=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(o(e))}))):n.push(o(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?n.push(o(e)):n.push(e)})),e.options=n}catch(r){console.error("Creator.convertFieldsOptions",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},a;n.convertObject=s,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(a=n.SteedosTranslationPrefixKeys||(n.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,n,e,r){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addObjectsTranslation=n.getObjectTranslationTemplate=n.translationObjects=n.translationObject=n.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),s=t("../index"),a=t("./index"),u=t("../i18n/i18n"),f=t("lodash"),c=t("crypto"),l,h=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function d(e){var t;return c.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(d(JSON.stringify(t)))},g=t("clone"),b=".",m="base",v="core",y="translation",_="object",w="field",k="listview",j="action",x=function(e,t){var n={lng:t,ns:y,keySeparator:!1};if((0,s.exists)(e,n))return(0,s._t)(e,n)},S=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},D=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},E=function(e){var t;return[D(),e].join(".")},A=function(e){var t;return[D("object"),e,"label"].join(".")},C=function(e){var t;return[D("object"),e,"description"].join(".")},M=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"label"].join(".")},O=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"help"].join(".")},T=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"description"].join(".")},B=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),r;return[D("field"),e,"group",n].join(".")},I=function(e,t,n){var r;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"options",n].join(".")},R=function(e,t){var n;return[D("action"),e,t].join(".")},F=function(e,t){var n;return[D("listview"),e,t].join(".")},P=function(e,t,n){var r,i=[A(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),x(i,e)||n||""};n.translationObjectLabel=P;var N=function(e,t,n){var r=C(t);return x(r,e)||n||""},L=function(e,t,n,r,i,o){var s,a=[M(t,n)],f=u.fallbackKeys.getObjectFieldLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=L(e,l,n,r,i))}return c||r||""},z=function(e,t,n,r,i,o){var s,a=[O(t,n)],f=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=z(e,l,n,r,i))}return c||r||""},U=function(e,t,n,r,i,o){var s=T(t,n),a,u=x([s],e);if(1!=o&&!u){var f=S(i);f&&"base"!=t&&"core"!=t&&(u=U(e,f,n,r,i))}return u||r||""},q=function(e,t,n,r,i,o){var s,a=[B(t,n)],f=u.fallbackKeys.getObjectFieldGroupKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=q(e,l,n,r,i))}return c||r||""},$=function(e,t,n,r,i,o,s){var a,f=[I(t,n,r)],c=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,n,r);c&&f.push(c);var l=x(f,e);if(1!=s&&!l){var h=S(o);h&&"base"!=t&&"core"!=t&&(l=$(e,h,n,r,i,o))}return l||i||""},W=function(e,t,n,r,i,o){var s,a=[R(t,n)],f=u.fallbackKeys.getObjectActionLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=W(e,l,n,r,i))}return c||r||""},H=function(e,t,n,r,i,o){var s,a=[F(t,n)],f=u.fallbackKeys.getObjectListviewLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=H(e,l,n,r,i))}return c||r||""},Y=function(e,t,r,o,s){void 0===s&&(s=!1);var u=p(e,r),c=h.get(u);if(c)return Object.assign(r,(0,f.cloneDeep)(c));o&&(0,a.convertObject)(r),r.label=(0,n.translationObjectLabel)(e,t,r.label),r.description=N(e,t,r.description),i.each(r.fields,(function(n,o){if(n.label=L(e,t,o,n.label,r.datasource,s),n.inlineHelpText=z(e,t,o,n.inlineHelpText,r.datasource,s),n.description=U(e,t,o,n.description,r.datasource,s),n.group&&(n.group=q(e,t,n.group,n.group,r.datasource,s)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var u=$(e,t,o,n.value,n.label,r.datasource,s);a.push(i.extend({},n,{label:u}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=W(e,t,i,n.label,r.datasource,s)})),i.each(r.list_views,(function(n,i){n.label=H(e,t,i,n.label,r.datasource,s)})),h.set(u,(0,f.cloneDeep)(r))};n.translationObject=Y;var V=function(e,t){i.each(t,(function(t,r){(0,n.translationObject)(e,r,t)}))};n.translationObjects=V;var K=function(e,t,r){var o=g(r);(0,a.convertObject)(o);var s={};return s[A(t)]=(0,n.translationObjectLabel)(e,t,o.label),s[C(t)]=N(e,t,o.description),i.each(o.fields,(function(n,r){s[M(t,r)]=L(e,t,r,n.label),n.inlineHelpText&&(s[O(t,r)]=z(e,t,r,n.inlineHelpText,o.datasource)),n.description&&(s[T(t,r)]=U(e,t,r,n.description,o.datasource)),n.group&&(s[B(t,n.group)]=q(e,t,n.group,n.group,o.datasource)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[I(t,r,n.value)]=$(e,t,r,n.value,n.label))}))})),i.each(o.actions,(function(n,r){s[R(t,r)]=W(e,t,r,n.label)})),i.each(o.list_views,(function(n,r){s[F(t,r)]=H(e,t,r,n.label)})),s};function G(e,t){var n=g(e);(0,a.convertObject)(n);var r={},o=n.name;return o||console.error("Error: Invalid objectTranslation:"+t),r[A(o)]=n.label,r[C(o)]=n.description,i.each(n.fields,(function(e,t){r[M(o,t)]=e.label,e.help&&(r[O(o,t)]=e.help),e.description&&(r[T(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(r[I(o,t,e.value)]=e.label)}))})),i.each(n.groups,(function(e,t){r[B(o,t)]=e})),i.each(n.actions,(function(e,t){r[R(o,t)]=e.label})),i.each(n.listviews,(function(e,t){r[F(o,t)]=e.label})),i.each(n.CustomLabels,(function(e,t){r[E(t)]=e})),r}n.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,s.addResourceBundle)(e.lng,y,t,!0,!0)}))};n.addObjectsTranslation=X},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addTranslations=n.convertTranslation=n.convertTranslationData=n.getAppTranslationTemplate=n.translationApps=n.translationMenus=n.translationApp=n.translationTabLabel=n.translationTabGroup=void 0;var r=t("../index"),i=t("underscore"),o=t("./"),s=t("../i18n/i18n.app"),a=t("clone"),u="translation",f=".",c="app",l="menu",h="tab",d=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[d(),e].join(".")},g=function(e,t){var n={lng:t,ns:u,keySeparator:!1};if((0,r.exists)(e,n))return(0,r._t)(e,n)},b=function(e){var t;return[d("app"),e,"name"].join(".")},m=function(e){var t;return[d("app"),e,"description"].join(".")},v=function(e,t){var n,r;return[d("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[d("menu"),"menu_".concat(e)].join(".")},_=function(e){var t;return[d("tab"),e].join(".")},w=function(e,t,n){var r,i=[b(t)],o=s.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),g(i,e)||n||""},k=function(e,t,n){var r,i=[m(t)],o=s.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),g(i,e)||n||""},j=function(e,t,n,r){var i,o=[v(t,n)],a=s.appFallbackKeys.getAppGroupKey(t,n);return a&&o.push(a),g(o,e)||r||""};n.translationTabGroup=j;var x=function(e,t,n){var r,i=[y(t)],o=s.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),g(i,e)||n||""},S=function(e,t,n){var r,i=[_(t)],o=s.appFallbackKeys.getTabKey(t);return o&&i.push(o),g(i,e)||n||""};n.translationTabLabel=S;var D=function(e,t,r){r.label=w(e,t,r.label||r.name),r.description=k(e,t,r.description),i.each(r.tab_groups,(function(i,o){r.tab_groups[o].id=i.id||i.group_name,r.tab_groups[o].group_name=(0,n.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,n.translationMenus)(e,r.admin_menus)};n.translationApp=D;var E=function(e,t){i.each(t,(function(t){var n=x(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationMenus=E;var A=function(e,t){i.each(t,(function(t,r){(0,n.translationApp)(e,r,t)}))};n.translationApps=A;var C=function(e,t,n){var r=a(n),o={};return o[b(t)]=w(e,t,r.label||r.name),o[m(t)]=k(e,t,r.description),i.each(r.admin_menus,(function(t){o[y(t._id)]=x(e,t._id,t.label||t.name)})),o};n.getAppTranslationTemplate=C;var M=function(e,t,n){i.isArray(n)?i.each(n,(function(e){M(e,"",e)})):n&&i.each(i.keys(n),(function(r){var o=t?"".concat(t,".").concat(r):r,s=n[r];"object"==typeof s?i.isArray(s)?i.each(s,(function(e){M(e,o,s)})):M(e,o,s):e[o]=s}))};function O(e){for(var t in e)"object"==typeof e[t]&&M(e,t,e[t]);return e}n.convertTranslationData=O;var T=function(e){var t=a(e),n={};return i.each(t.CustomApplications,(function(e,t){n[b(t)]=e.name,n[m(t)]=e.description,i.each(e.groups,(function(e,r){n[v(t,r)]=e}))})),i.each(t.CustomTabs,(function(e,t){n[_(t)]=e})),i.each(t.CustomLabels,(function(e,t){var r;if("simpleschema"!=t&&i.isObject(e)){var o=O(((r={})[t]=e,r));i.each(o,(function(e,t){i.isObject(e)||(n[p(t)]=e)}))}else n[p(t)]=e})),n};n.convertTranslation=T;var B=function(e){i.each(e,(function(e){var t=(0,n.convertTranslation)(e.data);(0,r.addResourceBundle)(e.lng,u,t,!0,!0)}))};n.addTranslations=B},templates:{"objectTranslation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getObjectMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]="help"===e?t.inlineHelpText||"":t[e]||""})),n}function a(e){return s(["label","description"],e)}function u(e){switch(e.type){case"select":return s(["label","help","options","description"],e);default:return s(["label","help","description"],e)}}function f(e){return s(["label"],e)}function c(e){return s(["label"],e)}function l(e){var t={};return r.each(e,(function(e,n){t[n]=u(e)})),t}function h(e){var t={};return r.each(e,(function(e,n){t[n]=c(e)})),t}function d(e){var t={};return r.each(e,(function(e,n){t[n]=f(e)})),t}function p(e,t){var n={};return r.each(e,(function(e,r){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");n[i]=t[r].group}})),n}var g=function(e,t,n,s){void 0===s&&(s=!1);var u=o(n);1!=s&&(0,i.translationObject)(e,t,u,!0,s);var f=Object.assign({},a(u));f=Object.assign({},f,{fields:l(u.fields)});var c=p(n.fields,u.fields);r.isEmpty(c)||(f=Object.assign({},f,{groups:c}));var g=d(u.list_views);r.isEmpty(g)||(f=Object.assign({},f,{listviews:g}));var b=h(u.actions);return r.isEmpty(b)||(f=Object.assign({},f,{actions:b})),Object.assign({name:t},f)};n.getObjectMetadataTranslationTemplate=g},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getAppMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]=t[e]||""})),n}function a(e){var t={groups:{}};return e?(r.each(e,(function(e){var n=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[n]=e.group_name})),t):{}}var u=function(e){return Object.assign({},s(["name","description"],e),a(e.tab_groups))},f=function(e){var t={};return r.each(e,(function(e,n){t[n]=n})),t},c=function(e){var t={};return r.each(e,(function(e){var n=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[n]=e})),t},l=function(e,t,n){var r,s=o(n);(0,i.translationApp)(e,t,s);var a={},l;return s.tab_items?a=f(s.tab_items):s.tabs&&(a=c(s.tabs)),Object.assign({},{CustomApplications:(r={},r[t]=u(s),r)},{CustomTabs:a})};n.getAppMetadataTranslationTemplate=l}}}},node_modules:{i18next:{"package.json":function e(t,n,e){e.exports={name:"i18next",version:"19.9.2",module:"./dist/esm/i18next.js",main:"./dist/cjs/i18next.js"}},dist:{esm:{"i18next.js":function e(t,n,e){let r,i,o,s,a,u,f,c;e.link("@babel/runtime/helpers/esm/typeof",{default(e){r=e}},0),e.link("@babel/runtime/helpers/esm/objectSpread",{default(e){i=e}},1),e.link("@babel/runtime/helpers/esm/classCallCheck",{default(e){o=e}},2),e.link("@babel/runtime/helpers/esm/createClass",{default(e){s=e}},3),e.link("@babel/runtime/helpers/esm/possibleConstructorReturn",{default(e){a=e}},4),e.link("@babel/runtime/helpers/esm/getPrototypeOf",{default(e){u=e}},5),e.link("@babel/runtime/helpers/esm/assertThisInitialized",{default(e){f=e}},6),e.link("@babel/runtime/helpers/esm/inherits",{default(e){c=e}},7);var l={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,n){console&&console[t]&&console[t].apply(console,n)}},h,d=new(function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.init(t,n)}return s(e,[{key:"init",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||l,this.options=n,this.debug=n.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,n=new Array(t),r=0;r1?n-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var s=r(o.shift());!e[s]&&n&&(e[s]=new n),e=Object.prototype.hasOwnProperty.call(e,s)?e[s]:{}}return i()?{}:{obj:e,k:r(o.shift())}}function y(e,t,n){var r=v(e,t,Object),i,o;r.obj[r.k]=n}function _(e,t,n,r){var i=v(e,t,Object),o=i.obj,s=i.k;o[s]=o[s]||[],r&&(o[s]=o[s].concat(n)),r||o[s].push(n)}function w(e,t){var n=v(e,t),r=n.obj,i=n.k;if(r)return r[i]}function k(e,t,n){var r=w(e,n);return void 0!==r?r:w(t,n)}function j(e,t,n){for(var r in t)"__proto__"!==r&&"constructor"!==r&&(r in e?"string"==typeof e[r]||e[r]instanceof String||"string"==typeof t[r]||t[r]instanceof String?n&&(e[r]=t[r]):j(e[r],t[r],n):e[r]=t[r]);return e}function x(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var S={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function D(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return S[e]})):e}var E="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,A=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),n.data=e||{},n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n}return c(t,e),s(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,s=[t,n];return r&&"string"!=typeof r&&(s=s.concat(r)),r&&"string"==typeof r&&(s=s.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(s=t.split(".")),w(this.data,s)}},{key:"addResource",value:function e(t,n,r,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},s=this.options.keySeparator;void 0===s&&(s=".");var a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(i=n,n=(a=t.split("."))[1]),this.addNamespaces(n),y(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}},{key:"addResources",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in r)"string"!=typeof r[o]&&"[object Array]"!==Object.prototype.toString.apply(r[o])||this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}},{key:"addResourceBundle",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},u=[t,n];t.indexOf(".")>-1&&(o=r,r=n,n=(u=t.split("."))[1]),this.addNamespaces(n);var f=w(this.data,u)||{};o?j(f,r,s):f=i({},f,r),y(this.data,u,f),a.silent||this.emit("added",t,n,r)}},{key:"removeResourceBundle",value:function e(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}},{key:"hasResourceBundle",value:function e(t,n){return void 0!==this.getResource(t,n)}},{key:"getResourceBundle",value:function e(t,n){return n||(n=this.options.defaultNS),"v1"===this.options.compatibilityAPI?i({},{},this.getResource(t,n)):this.getResource(t,n)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(p),C={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,n,r,i,o){var s=this;return t.forEach((function(e){s.processors[e]&&(n=s.processors[e].process(n,r,i,o))})),n}},M={},O=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),m(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,f(n)),n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n.logger=d.create("translator"),n}return c(t,e),s(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},r=this.resolve(t,n);return r&&void 0!==r.res}},{key:"extractFromKey",value:function e(t,n){var r=void 0!==n.nsSeparator?n.nsSeparator:this.options.nsSeparator;void 0===r&&(r=":");var i=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,o=n.ns||this.options.defaultNS;if(r&&t.indexOf(r)>-1){var s=t.match(this.interpolator.nestingRegexp);if(s&&s.length>0)return{key:t,namespaces:o};var a=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(a[0])>-1)&&(o=a.shift()),t=a.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(n,o,s){var a=this;if("object"!==r(o)&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),null==n)return"";Array.isArray(n)||(n=[String(n)]);var u=void 0!==o.keySeparator?o.keySeparator:this.options.keySeparator,f=this.extractFromKey(n[n.length-1],o),c=f.key,l=f.namespaces,h=l[l.length-1],d=o.lng||this.language,p=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d&&"cimode"===d.toLowerCase()){if(p){var g=o.nsSeparator||this.options.nsSeparator;return h+g+c}return c}var b=this.resolve(n,o),m=b&&b.res,v=b&&b.usedKey||c,y=b&&b.exactUsedKey||c,_=Object.prototype.toString.apply(m),w=["[object Number]","[object Function]","[object RegExp]"],k=void 0!==o.joinArrays?o.joinArrays:this.options.joinArrays,j=!this.i18nFormat||this.i18nFormat.handleAsObject,x="string"!=typeof m&&"boolean"!=typeof m&&"number"!=typeof m;if(j&&m&&x&&w.indexOf(_)<0&&("string"!=typeof k||"[object Array]"!==_)){if(!o.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,m,o):"key '".concat(c," (").concat(this.language,")' returned an object instead of string.");if(u){var S="[object Array]"===_,D=S?[]:{},E=S?y:v;for(var A in m)if(Object.prototype.hasOwnProperty.call(m,A)){var C="".concat(E).concat(u).concat(A);D[A]=this.translate(C,i({},o,{joinArrays:!1,ns:l})),D[A]===C&&(D[A]=m[A])}m=D}}else if(j&&"string"==typeof k&&"[object Array]"===_)(m=m.join(k))&&(m=this.extendTranslation(m,n,o,s));else{var M=!1,O=!1,T=void 0!==o.count&&"string"!=typeof o.count,B=t.hasDefaultValue(o),I=T?this.pluralResolver.getSuffix(d,o.count):"",R=o["defaultValue".concat(I)]||o.defaultValue;!this.isValidLookup(m)&&B&&(M=!0,m=R),this.isValidLookup(m)||(O=!0,m=c);var F=B&&R!==m&&this.options.updateMissing;if(O||M||F){if(this.logger.log(F?"updateKey":"missingKey",d,h,c,F?R:m),u){var P=this.resolve(c,i({},o,{keySeparator:!1}));P&&P.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var N=[],L=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if("fallback"===this.options.saveMissingTo&&L&&L[0])for(var z=0;z1&&void 0!==arguments[1]?arguments[1]:{},i,o,s,a,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!n.isValidLookup(i)){var t=n.extractFromKey(e,r),f=t.key;o=f;var c=t.namespaces;n.options.fallbackNS&&(c=c.concat(n.options.fallbackNS));var l=void 0!==r.count&&"string"!=typeof r.count,h=void 0!==r.context&&"string"==typeof r.context&&""!==r.context,d=r.lngs?r.lngs:n.languageUtils.toResolveHierarchy(r.lng||n.language,r.fallbackLng);c.forEach((function(e){n.isValidLookup(i)||(u=e,!M["".concat(d[0],"-").concat(e)]&&n.utils&&n.utils.hasLoadedNamespace&&!n.utils.hasLoadedNamespace(u)&&(M["".concat(d[0],"-").concat(e)]=!0,n.logger.warn('key "'.concat(o,'" for languages "').concat(d.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),d.forEach((function(t){if(!n.isValidLookup(i)){a=t;var o=f,u=[o],c,d;if(n.i18nFormat&&n.i18nFormat.addLookupKeys)n.i18nFormat.addLookupKeys(u,f,t,e,r);else l&&(c=n.pluralResolver.getSuffix(t,r.count)),l&&h&&u.push(o+c),h&&u.push(o+="".concat(n.options.contextSeparator).concat(r.context)),l&&u.push(o+=c);for(;d=u.pop();)n.isValidLookup(i)||(s=d,i=n.getResource(t,e,d,r))}})))}))}})),{res:i,usedKey:o,exactUsedKey:s,usedLng:a,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}}],[{key:"hasDefaultValue",value:function e(t){var n="defaultValue";for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&void 0!==t[r])return!0;return!1}}]),t}(p);function T(e){return e.charAt(0).toUpperCase()+e.slice(1)}var B=function(){function e(t){o(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=d.create("languageUtils")}return s(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var n=t.split("-");return 2===n.length?null:(n.pop(),"x"===n[n.length-1].toLowerCase()?null:this.formatLanguageCode(n.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var n=t.split("-");return this.formatLanguageCode(n[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var n=["hans","hant","latn","cyrl","cans","mong","arab"],r=t.split("-");return this.options.lowerCaseLng?r=r.map((function(e){return e.toLowerCase()})):2===r.length?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase()))):3===r.length&&(r[0]=r[0].toLowerCase(),2===r[1].length&&(r[1]=r[1].toUpperCase()),"sgn"!==r[0]&&2===r[2].length&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=T(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var n=this,r;return t?(t.forEach((function(e){if(!r){var t=n.formatLanguageCode(e);n.options.supportedLngs&&!n.isSupportedCode(t)||(r=t)}})),!r&&this.options.supportedLngs&&t.forEach((function(e){if(!r){var t=n.getLanguagePartFromCode(e);if(n.isSupportedCode(t))return r=t;r=n.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r):null}},{key:"getFallbackCodes",value:function e(t,n){if(!t)return[];if("function"==typeof t&&(t=t(n)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!n)return t.default||[];var r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}},{key:"toResolveHierarchy",value:function e(t,n){var r=this,i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),o=[],s=function e(t){t&&(r.isSupportedCode(t)?o.push(t):r.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&s(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&s(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&s(this.getLanguagePartFromCode(t))):"string"==typeof t&&s(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&s(r.formatLanguageCode(e))})),o}}]),e}(),I=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],R={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function F(){var e={};return I.forEach((function(t){t.lngs.forEach((function(n){e[n]={numbers:t.nr,plurals:R[t.fc]}}))})),e}var P=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.languageUtils=t,this.options=n,this.logger=d.create("pluralResolver"),this.rules=F()}return s(e,[{key:"addRule",value:function e(t,n){this.rules[t]=n}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var n=this.getRule(t);return n&&n.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,n){return this.getSuffixes(t).map((function(e){return n+e}))}},{key:"getSuffixes",value:function e(t){var n=this,r=this.getRule(t);return r?r.numbers.map((function(e){return n.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,n){var r=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(n):i.plurals(Math.abs(n)),s=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===s?s="plural":1===s&&(s=""));var a=function e(){return r.options.prepend&&s.toString()?r.options.prepend+s.toString():s.toString()};return"v1"===this.options.compatibilityJSON?1===s?"":"number"==typeof s?"_plural_".concat(s.toString()):a():"v2"===this.options.compatibilityJSON?a():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?a():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),N=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o(this,e),this.logger=d.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return s(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var n=t.interpolation;this.escape=void 0!==n.escape?n.escape:D,this.escapeValue=void 0===n.escapeValue||n.escapeValue,this.useRawValueToEscape=void 0!==n.useRawValueToEscape&&n.useRawValueToEscape,this.prefix=n.prefix?x(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?x(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?x(n.nestingPrefix):n.nestingPrefixEscaped||x("$t("),this.nestingSuffix=n.nestingSuffix?x(n.nestingSuffix):n.nestingSuffixEscaped||x(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=void 0!==n.alwaysFormat&&n.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var n="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(n,"g");var r="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(r,"g")}},{key:"interpolate",value:function e(t,n,r,i){var o=this,s,a,u,f=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function c(e){return e.replace(/\$/g,"$$$$")}var l=function e(t){if(t.indexOf(o.formatSeparator)<0){var s=k(n,f,t);return o.alwaysFormat?o.format(s,void 0,r):s}var a=t.split(o.formatSeparator),u=a.shift().trim(),c=a.join(o.formatSeparator).trim();return o.format(k(n,f,u),c,r,i)};this.resetRegExp();var h=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,d=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return c(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?c(o.escape(t)):c(t)}}].forEach((function(e){for(u=0;s=e.regex.exec(t);){if(void 0===(a=l(s[1].trim())))if("function"==typeof h){var n=h(t,s,i);a="string"==typeof n?n:""}else{if(d){a=s[0];continue}o.logger.warn("missed to pass in variable ".concat(s[1]," for interpolating ").concat(t)),a=""}else"string"==typeof a||o.useRawValueToEscape||(a=b(a));if(t=t.replace(s[0],e.safeValue(a)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,n){var r=this,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s,a,u=i({},o);function f(e,t){var n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;var r=e.split(new RegExp("".concat(n,"[ ]*{"))),o="{".concat(r[1]);e=r[0],o=(o=this.interpolate(o,u)).replace(/'/g,'"');try{u=JSON.parse(o),t&&(u=i({},t,u))}catch(s){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),s),"".concat(e).concat(n).concat(o)}return delete u.defaultValue,e}for(u.applyPostProcessor=!1,delete u.defaultValue;s=this.nestingRegexp.exec(t);){var c=[],l=!1;if(s[0].includes(this.formatSeparator)&&!/{.*}/.test(s[1])){var h=s[1].split(this.formatSeparator).map((function(e){return e.trim()}));s[1]=h.shift(),c=h,l=!0}if((a=n(f.call(this,s[1].trim(),u),u))&&s[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=b(a)),a||(this.logger.warn("missed to resolve ".concat(s[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return r.format(e,t,o.lng,o)}),a.trim())),t=t.replace(s[0],a),this.regexp.lastIndex=0}return t}}]),e}();function L(e,t){for(var n=e.indexOf(t);-1!==n;)e.splice(n,1),n=e.indexOf(t)}var z=function(e){function t(e,n,r){var i,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return o(this,t),i=a(this,u(t).call(this)),E&&p.call(f(i)),i.backend=e,i.store=n,i.services=r,i.languageUtils=r.languageUtils,i.options=s,i.logger=d.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(r,s.backend,s),i}return c(t,e),s(t,[{key:"queueLoad",value:function e(t,n,r,i){var o=this,s=[],a=[],u=[],f=[];return t.forEach((function(e){var t=!0;n.forEach((function(n){var i="".concat(e,"|").concat(n);!r.reload&&o.store.hasResourceBundle(e,n)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?a.indexOf(i)<0&&a.push(i):(o.state[i]=1,t=!1,a.indexOf(i)<0&&a.push(i),s.indexOf(i)<0&&s.push(i),f.indexOf(n)<0&&f.push(n)))})),t||u.push(e)})),(s.length||a.length)&&this.queue.push({pending:a,loaded:{},errors:[],callback:i}),{toLoad:s,pending:a,toLoadLanguages:u,toLoadNamespaces:f}}},{key:"loaded",value:function e(t,n,r){var i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;var e={};this.queue.forEach((function(r){_(r.loaded,[o],s),L(r.pending,t),n&&r.errors.push(n),0!==r.pending.length||r.done||(Object.keys(r.loaded).forEach((function(t){e[t]||(e[t]=[]),r.loaded[t].length&&r.loaded[t].forEach((function(n){e[t].indexOf(n)<0&&e[t].push(n)}))})),r.done=!0,r.errors.length?r.callback(r.errors):r.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,a=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[r](t,n,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,n,r,o+1,2*s,a)}),s):a(e,u)})):a(null,{})}},{key:"prepareLoading",value:function e(t,n){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof n&&(n=[n]);var s=this.queueLoad(t,n,i,o);if(!s.toLoad.length)return s.pending.length||o(),null;s.toLoad.forEach((function(e){r.loadOne(e)}))}},{key:"load",value:function e(t,n,r){this.prepareLoading(t,n,{},r)}},{key:"reload",value:function e(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}},{key:"loadOne",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],s=i[1];this.read(o,s,"read",void 0,void 0,(function(e,i){e&&n.logger.warn("".concat(r,"loading namespace ").concat(s," for language ").concat(o," failed"),e),!e&&i&&n.logger.log("".concat(r,"loaded namespace ").concat(s," for language ").concat(o),i),n.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)?this.logger.warn('did not save key "'.concat(r,'" as the namespace "').concat(n,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=r&&""!==r&&(this.backend&&this.backend.create&&this.backend.create(t,n,r,o,null,i({},a,{isUpdate:s})),t&&t[0]&&this.store.addResource(t[0],n,r,o))}}]),t}(p);function U(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var n={};if("object"===r(t[1])&&(n=t[1]),"string"==typeof t[1]&&(n.defaultValue=t[1]),"string"==typeof t[2]&&(n.tDescription=t[2]),"object"===r(t[2])||"object"===r(t[3])){var i=t[3]||t[2];Object.keys(i).forEach((function(e){n[e]=i[e]}))}return n},interpolation:{escapeValue:!0,format:function e(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function q(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function $(){}var W,H=new(function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(o(this,t),e=a(this,u(t).call(this)),E&&p.call(f(e)),e.options=q(n),e.services={},e.logger=d,e.modules={external:[]},r&&!e.isInitialized&&!n.isClone){if(!e.options.initImmediate)return e.init(n,r),a(e,f(e));setTimeout((function(){e.init(n,r)}),0)}return e}return c(t,e),s(t,[{key:"init",value:function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;function o(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof n&&(r=n,n={}),n.whitelist&&!n.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),n.nonExplicitWhitelist&&!n.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=i({},U(),this.options,q(n)),this.format=this.options.interpolation.format,r||(r=$),!this.options.isClone){this.modules.logger?d.init(o(this.modules.logger),this.options):d.init(null,this.options);var s=new B(this.options);this.store=new A(this.options.resources,this.options);var a=this.services;a.logger=d,a.resourceStore=this.store,a.languageUtils=s,a.pluralResolver=new P(s,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new N(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new z(o(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i1?n-1:0),i=1;i0&&"dev"!==u[0]&&(this.options.lng=u[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var f=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];f.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments),t}}));var l=g(),h=function e(){var n=function e(n,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),r(n,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return n(null,t.t.bind(t));t.changeLanguage(t.options.lng,n)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),l}},{key:"loadResources",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,i=r,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var s=[],a=function e(t){var r;t&&n.services.languageUtils.toResolveHierarchy(t).forEach((function(e){s.indexOf(e)<0&&s.push(e)}))};if(o)a(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return a(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return a(e)})),this.services.backendConnector.load(s,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,n,r){var i=g();return t||(t=this.languages),n||(n=this.options.ns),r||(r=$),this.services.backendConnector.reload(t,n,(function(e){i.resolve(),r(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&C.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,n){var r=this;this.isLanguageChangingTo=t;var i=g();this.emit("languageChanging",t);var o=function e(t,o){o?(r.language=o,r.languages=r.services.languageUtils.toResolveHierarchy(o),r.translator.changeLanguage(o),r.isLanguageChangingTo=void 0,r.emit("languageChanged",o),r.logger.log("languageChanged",o)):r.isLanguageChangingTo=void 0,i.resolve((function(){return r.t.apply(r,arguments)})),n&&n(t,(function(){return r.t.apply(r,arguments)}))},s=function e(t){var n="string"==typeof t?t:r.services.languageUtils.getBestMatchFromCodes(t);n&&(r.language||(r.language=n,r.languages=r.services.languageUtils.toResolveHierarchy(n)),r.translator.language||r.translator.changeLanguage(n),r.services.languageDetector&&r.services.languageDetector.cacheUserLanguage(n)),r.loadResources(n,(function(e){o(e,n)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(s):s(t):s(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,n){var o=this,s=function e(t,n){var s;if("object"!==r(n)){for(var a=arguments.length,u=new Array(a>2?a-2:0),f=2;f1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,s=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var a=function e(t,r){var i=n.services.backendConnector.state["".concat(t,"|").concat(r)];return-1===i||2===i};if(r.precheck){var u=r.precheck(this,a);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!a(i,t)||o&&!a(s,t)))}},{key:"loadNamespaces",value:function e(t,n){var r=this,i=g();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){r.options.ns.indexOf(e)<0&&r.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),n&&n(e)})),i):(n&&n(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,n){var r=g();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){r.resolve(),n&&n(e)})),r):(n&&n(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var n}},{key:"createInstance",value:function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;return new t(n,r)}},{key:"cloneInstance",value:function e(){var n=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,s=i({},this.options,r,{isClone:!0}),a=new t(s),u=["store","services","language"];return u.forEach((function(e){a[e]=n[e]})),a.services=i({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new O(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rr,root:()=>i,ArrayProto:()=>o,ObjProto:()=>s,SymbolProto:()=>a,push:()=>u,slice:()=>f,toString:()=>c,hasOwnProperty:()=>l,supportsArrayBuffer:()=>h,supportsDataView:()=>d,nativeIsArray:()=>p,nativeKeys:()=>g,nativeCreate:()=>b,nativeIsView:()=>m,_isNaN:()=>v,_isFinite:()=>y,hasEnumBug:()=>_,nonEnumerableProps:()=>w,MAX_ARRAY_INDEX:()=>k});var r="1.13.4",i="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},o=Array.prototype,s=Object.prototype,a="undefined"!=typeof Symbol?Symbol.prototype:null,u=o.push,f=o.slice,c=s.toString,l=s.hasOwnProperty,h="undefined"!=typeof ArrayBuffer,d="undefined"!=typeof DataView,p=Array.isArray,g=Object.keys,b=Object.create,m=h&&ArrayBuffer.isView,v=isNaN,y=isFinite,_=!{toString:null}.propertyIsEnumerable("toString"),w=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=Math.pow(2,53)-1},"restArguments.js":function e(t,n,e){function r(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;ir})},"isObject.js":function e(t,n,e){function r(e){var t=typeof e;return"function"===t||"object"===t&&!!e}e.export({default:()=>r})},"isNull.js":function e(t,n,e){function r(e){return null===e}e.export({default:()=>r})},"isUndefined.js":function e(t,n,e){function r(e){return void 0===e}e.export({default:()=>r})},"isBoolean.js":function e(t,n,e){let r;function i(e){return!0===e||!1===e||"[object Boolean]"===r.call(e)}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isElement.js":function e(t,n,e){function r(e){return!(!e||1!==e.nodeType)}e.export({default:()=>r})},"isString.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("String"))},"_tagTester.js":function e(t,n,e){let r;function i(e){var t="[object "+e+"]";return function(e){return r.call(e)===t}}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isNumber.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Number"))},"isDate.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Date"))},"isRegExp.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("RegExp"))},"isError.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Error"))},"isSymbol.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Symbol"))},"isArrayBuffer.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("ArrayBuffer"))},"isDataView.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isArrayBuffer.js",{default(e){o=e}},2),e.link("./_stringTagBug.js",{hasStringTagBug(e){s=e}},3);var a=r("DataView");function u(e){return null!=e&&i(e.getInt8)&&o(e.buffer)}e.exportDefault(s?u:a)},"isFunction.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_setup.js",{root(e){i=e}},1);var o=r("Function"),s=i.document&&i.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof s&&(o=function(e){return"function"==typeof e||!1}),e.exportDefault(o)},"_stringTagBug.js":function e(t,n,e){let r,i;e.export({hasStringTagBug:()=>o,isIE11:()=>s}),e.link("./_setup.js",{supportsDataView(e){r=e}},0),e.link("./_hasObjectTag.js",{default(e){i=e}},1);var o=r&&i(new DataView(new ArrayBuffer(8))),s="undefined"!=typeof Map&&i(new Map)},"_hasObjectTag.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Object"))},"isArray.js":function e(t,n,e){let r,i;e.link("./_setup.js",{nativeIsArray(e){r=e}},0),e.link("./_tagTester.js",{default(e){i=e}},1),e.exportDefault(r||i("Array"))},"isArguments.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1);var o=r("Arguments");!function(){o(arguments)||(o=function(e){return i(e,"callee")})}(),e.exportDefault(o)},"_has.js":function e(t,n,e){let r;function i(e,t){return null!=e&&r.call(e,t)}e.export({default:()=>i}),e.link("./_setup.js",{hasOwnProperty(e){r=e}},0)},"isFinite.js":function e(t,n,e){let r,i;function o(e){return!i(e)&&r(e)&&!isNaN(parseFloat(e))}e.export({default:()=>o}),e.link("./_setup.js",{_isFinite(e){r=e}},0),e.link("./isSymbol.js",{default(e){i=e}},1)},"isNaN.js":function e(t,n,e){let r,i;function o(e){return i(e)&&r(e)}e.export({default:()=>o}),e.link("./_setup.js",{_isNaN(e){r=e}},0),e.link("./isNumber.js",{default(e){i=e}},1)},"isTypedArray.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./_setup.js",{supportsArrayBuffer(e){r=e},nativeIsView(e){i=e},toString(e){o=e}},0),e.link("./isDataView.js",{default(e){s=e}},1),e.link("./constant.js",{default(e){a=e}},2),e.link("./_isBufferLike.js",{default(e){u=e}},3);var f=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function c(e){return i?i(e)&&!s(e):u(e)&&f.test(o.call(e))}e.exportDefault(r?c:a(!1))},"constant.js":function e(t,n,e){function r(e){return function(){return e}}e.export({default:()=>r})},"_isBufferLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getByteLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createSizePropertyCheck.js":function e(t,n,e){let r;function i(e){return function(t){var n=e(t);return"number"==typeof n&&n>=0&&n<=r}}e.export({default:()=>i}),e.link("./_setup.js",{MAX_ARRAY_INDEX(e){r=e}},0)},"_getByteLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("byteLength"))},"_shallowProperty.js":function e(t,n,e){function r(e){return function(t){return null==t?void 0:t[e]}}e.export({default:()=>r})},"isEmpty.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(null==e)return!0;var t=r(e);return"number"==typeof t&&(i(e)||o(e)||s(e))?0===t:0===r(a(e))}e.export({default:()=>u}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3),e.link("./keys.js",{default(e){a=e}},4)},"_getLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("length"))},"keys.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(!r(e))return[];if(i)return i(e);var t=[];for(var n in e)s(e,n)&&t.push(n);return o&&a(e,t),t}e.export({default:()=>u}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeKeys(e){i=e},hasEnumBug(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2),e.link("./_collectNonEnumProps.js",{default(e){a=e}},3)},"_collectNonEnumProps.js":function e(t,n,e){let r,i,o,s;function a(e){for(var t={},n=e.length,r=0;ru}),e.link("./_setup.js",{nonEnumerableProps(e){r=e},ObjProto(e){i=e}},0),e.link("./isFunction.js",{default(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2)},"isMatch.js":function e(t,n,e){let r;function i(e,t){var n=r(t),i=n.length;if(null==e)return!i;for(var o=Object(e),s=0;si}),e.link("./keys.js",{default(e){r=e}},0)},"isEqual.js":function e(t,n,e){let r,i,o,s,a,u,f,c,l,h,d;e.export({default:()=>m}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_setup.js",{toString(e){i=e},SymbolProto(e){o=e}},1),e.link("./_getByteLength.js",{default(e){s=e}},2),e.link("./isTypedArray.js",{default(e){a=e}},3),e.link("./isFunction.js",{default(e){u=e}},4),e.link("./_stringTagBug.js",{hasStringTagBug(e){f=e}},5),e.link("./isDataView.js",{default(e){c=e}},6),e.link("./keys.js",{default(e){l=e}},7),e.link("./_has.js",{default(e){h=e}},8),e.link("./_toBufferView.js",{default(e){d=e}},9);var p="[object DataView]";function g(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return!1;if(e!=e)return t!=t;var i=typeof e;return("function"===i||"object"===i||"object"==typeof t)&&b(e,t,n,r)}function b(e,t,n,m){e instanceof r&&(e=e._wrapped),t instanceof r&&(t=t._wrapped);var v=i.call(e);if(v!==i.call(t))return!1;if(f&&"[object Object]"==v&&c(e)){if(!c(t))return!1;v=p}switch(v){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object Symbol]":return o.valueOf.call(e)===o.valueOf.call(t);case"[object ArrayBuffer]":case p:return b(d(e),d(t),n,m)}var y="[object Array]"===v;if(!y&&a(e)){var _;if(s(e)!==s(t))return!1;if(e.buffer===t.buffer&&e.byteOffset===t.byteOffset)return!0;y=!0}if(!y){if("object"!=typeof e||"object"!=typeof t)return!1;var w=e.constructor,k=t.constructor;if(w!==k&&!(u(w)&&w instanceof w&&u(k)&&k instanceof k)&&"constructor"in e&&"constructor"in t)return!1}m=m||[];for(var j=(n=n||[]).length;j--;)if(n[j]===e)return m[j]===t;if(n.push(e),m.push(t),y){if((j=e.length)!==t.length)return!1;for(;j--;)if(!g(e[j],t[j],n,m))return!1}else{var x=l(e),S;if(j=x.length,l(t).length!==j)return!1;for(;j--;)if(S=x[j],!h(t,S)||!g(e[S],t[S],n,m))return!1}return n.pop(),m.pop(),!0}function m(e,t){return g(e,t)}},"underscore.js":function e(t,n,e){let r;function i(e){return e instanceof i?e:this instanceof i?void(this._wrapped=e):new i(e)}e.export({default:()=>i}),e.link("./_setup.js",{VERSION(e){r=e}},0),i.VERSION=r,i.prototype.value=function(){return this._wrapped},i.prototype.valueOf=i.prototype.toJSON=i.prototype.value,i.prototype.toString=function(){return String(this._wrapped)}},"_toBufferView.js":function e(t,n,e){let r;function i(e){return new Uint8Array(e.buffer||e,e.byteOffset||0,r(e))}e.export({default:()=>i}),e.link("./_getByteLength.js",{default(e){r=e}},0)},"isMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},mapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Map"))},"_methodFingerprint.js":function e(t,n,e){let r,i,o;function s(e){var t=r(e);return function(n){if(null==n)return!1;var s=o(n);if(r(s))return!1;for(var u=0;us,mapMethods:()=>l,weakMapMethods:()=>h,setMethods:()=>d}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./allKeys.js",{default(e){o=e}},2);var a="forEach",u="has",f=["clear","delete"],c=["get","has","set"],l=f.concat(a,c),h=f.concat(c),d=["add"].concat(f,a,"has")},"allKeys.js":function e(t,n,e){let r,i,o;function s(e){if(!r(e))return[];var t=[];for(var n in e)t.push(n);return i&&o(e,t),t}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{hasEnumBug(e){i=e}},1),e.link("./_collectNonEnumProps.js",{default(e){o=e}},2)},"isWeakMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},weakMapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("WeakMap"))},"isSet.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},setMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Set"))},"isWeakSet.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("WeakSet"))},"values.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"pairs.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"invert.js":function e(t,n,e){let r;function i(e){for(var t={},n=r(e),i=0,o=n.length;ii}),e.link("./keys.js",{default(e){r=e}},0)},"functions.js":function e(t,n,e){let r;function i(e){var t=[];for(var n in e)r(e[n])&&t.push(n);return t.sort()}e.export({default:()=>i}),e.link("./isFunction.js",{default(e){r=e}},0)},"extend.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createAssigner.js":function e(t,n,e){function r(e,t){return function(n){var r=arguments.length;if(t&&(n=Object(n)),r<2||null==n)return n;for(var i=1;ir})},"extendOwn.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"defaults.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i,!0))},"create.js":function e(t,n,e){let r,i;function o(e,t){var n=r(e);return t&&i(n,t),n}e.export({default:()=>o}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./extendOwn.js",{default(e){i=e}},1)},"_baseCreate.js":function e(t,n,e){let r,i;function o(){return function(){}}function s(e){if(!r(e))return{};if(i)return i(e);var t=function(){};t.prototype=e;var n=new t;return t.prototype=null,n}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeCreate(e){i=e}},1)},"clone.js":function e(t,n,e){let r,i,o;function s(e){return r(e)?i(e)?e.slice():o({},e):e}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./extend.js",{default(e){o=e}},2)},"tap.js":function e(t,n,e){function r(e,t){return t(e),e}e.export({default:()=>r})},"get.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=i(e,r(t));return o(s)?n:s}e.export({default:()=>s}),e.link("./_toPath.js",{default(e){r=e}},0),e.link("./_deepGet.js",{default(e){i=e}},1),e.link("./isUndefined.js",{default(e){o=e}},2)},"_toPath.js":function e(t,n,e){let r;function i(e){return r.toPath(e)}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./toPath.js")},"toPath.js":function e(t,n,e){let r,i;function o(e){return i(e)?e:[e]}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),r.toPath=o},"_deepGet.js":function e(t,n,e){function r(e,t){for(var n=t.length,r=0;rr})},"has.js":function e(t,n,e){let r,i;function o(e,t){for(var n=(t=i(t)).length,o=0;oo}),e.link("./_has.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"mapObject.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s=o.length,a={},u=0;uo}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"_cb.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r.iteratee!==o?r.iteratee(e,t):i(e,t,n)}e.export({default:()=>s}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),e.link("./iteratee.js",{default(e){o=e}},2)},"_baseIteratee.js":function e(t,n,e){let r,i,o,s,a,u,f;function c(e,t,n){return null==e?r:i(e)?f(e,t,n):o(e)&&!s(e)?a(e):u(e)}e.export({default:()=>c}),e.link("./identity.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isObject.js",{default(e){o=e}},2),e.link("./isArray.js",{default(e){s=e}},3),e.link("./matcher.js",{default(e){a=e}},4),e.link("./property.js",{default(e){u=e}},5),e.link("./_optimizeCb.js",{default(e){f=e}},6)},"identity.js":function e(t,n,e){function r(e){return e}e.export({default:()=>r})},"matcher.js":function e(t,n,e){let r,i;function o(e){return e=r({},e),function(t){return i(t,e)}}e.export({default:()=>o}),e.link("./extendOwn.js",{default(e){r=e}},0),e.link("./isMatch.js",{default(e){i=e}},1)},"property.js":function e(t,n,e){let r,i;function o(e){return e=i(e),function(t){return r(t,e)}}e.export({default:()=>o}),e.link("./_deepGet.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"_optimizeCb.js":function e(t,n,e){function r(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,o){return e.call(t,n,r,i,o)}}return function(){return e.apply(t,arguments)}}e.export({default:()=>r})},"iteratee.js":function e(t,n,e){let r,i;function o(e,t){return i(e,t,1/0)}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),r.iteratee=o},"noop.js":function e(t,n,e){function r(){}e.export({default:()=>r})},"propertyOf.js":function e(t,n,e){let r,i;function o(e){return null==e?r:function(t){return i(e,t)}}e.export({default:()=>o}),e.link("./noop.js",{default(e){r=e}},0),e.link("./get.js",{default(e){i=e}},1)},"times.js":function e(t,n,e){let r;function i(e,t,n){var i=Array(Math.max(0,e));t=r(t,n,1);for(var o=0;oi}),e.link("./_optimizeCb.js",{default(e){r=e}},0)},"random.js":function e(t,n,e){function r(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))}e.export({default:()=>r})},"now.js":function e(t,n,e){e.exportDefault(Date.now||function(){return(new Date).getTime()})},"escape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createEscaper.js":function e(t,n,e){let r;function i(e){var t=function(t){return e[t]},n="(?:"+r(e).join("|")+")",i=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":""+e,i.test(e)?e.replace(o,t):e}}e.export({default:()=>i}),e.link("./keys.js",{default(e){r=e}},0)},"_escapeMap.js":function e(t,n,e){e.exportDefault({"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"})},"unescape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_unescapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_unescapeMap.js":function e(t,n,e){let r,i;e.link("./invert.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"templateSettings.js":function e(t,n,e){let r;e.link("./underscore.js",{default(e){r=e}},0),e.exportDefault(r.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g})},"template.js":function e(t,n,e){let r,i;e.export({default:()=>c}),e.link("./defaults.js",{default(e){r=e}},0),e.link("./underscore.js",{default(e){i=e}},1),e.link("./templateSettings.js");var o=/(.)^/,s={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},a=/\\|'|\r|\n|\u2028|\u2029/g;function u(e){return"\\"+s[e]}var f=/^\s*(\w|\$)+\s*$/;function c(e,t,n){!t&&n&&(t=n),t=r({},t,i.templateSettings);var s=RegExp([(t.escape||o).source,(t.interpolate||o).source,(t.evaluate||o).source].join("|")+"|$","g"),c=0,l="__p+='";e.replace(s,(function(t,n,r,i,o){return l+=e.slice(c,o).replace(a,u),c=o+t.length,n?l+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?l+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(l+="';\n"+i+"\n__p+='"),t})),l+="';\n";var h=t.variable,d;if(h){if(!f.test(h))throw new Error("variable is not a bare identifier: "+h)}else l="with(obj||{}){\n"+l+"}\n",h="obj";l="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+l+"return __p;\n";try{d=new Function(h,"_",l)}catch(g){throw g.source=l,g}var p=function(e){return d.call(this,e,i)};return p.source="function("+h+"){\n"+l+"}",p}},"result.js":function e(t,n,e){let r,i;function o(e,t,n){var o=(t=i(t)).length;if(!o)return r(n)?n.call(e):n;for(var s=0;so}),e.link("./isFunction.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"uniqueId.js":function e(t,n,e){e.export({default:()=>i});var r=0;function i(e){var t=++r+"";return e?e+t:t}},"chain.js":function e(t,n,e){let r;function i(e){var t=r(e);return t._chain=!0,t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"partial.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_executeBound.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2);var s=r((function(e,t){var n=s.placeholder,r=function(){for(var o=0,s=t.length,a=Array(s),u=0;uo}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./isObject.js",{default(e){i=e}},1)},"bind.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_executeBound.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t,n){if(!i(e))throw new TypeError("Bind must be called on a function");var s=r((function(r){return o(e,s,t,this,n.concat(r))}));return s})))},"bindAll.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./bind.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t){var n=(t=i(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=o(e[r],e)}return e})))},"_flatten.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,u){if(u=u||[],t||0===t){if(t<=0)return u.concat(e)}else t=1/0;for(var f=u.length,c=0,l=r(e);c1)a(h,t-1,n,u),f=u.length;else for(var d=0,p=h.length;da}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&us}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isNaN.js",{default(e){o=e}},2)},"lastIndexOf.js":function e(t,n,e){let r,i;e.link("./findLastIndex.js",{default(e){r=e}},0),e.link("./_createIndexFinder.js",{default(e){i=e}},1),e.exportDefault(i(-1,r))},"find.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a=(r(e)?i:o)(e,t,n);if(void 0!==a&&-1!==a)return e[a]}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./findKey.js",{default(e){o=e}},2)},"findWhere.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./find.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"each.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a;if(t=r(t,n),i(e))for(s=0,a=e.length;ss}),e.link("./_optimizeCb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"map.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=Array(a),f=0;fs}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"reduce.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createReduce.js":function e(t,n,e){let r,i,o;function s(e){var t=function(t,n,o,s){var a=!r(t)&&i(t),u=(a||t).length,f=e>0?0:u-1;for(s||(o=t[a?a[f]:f],f+=e);f>=0&&f=3;return t(e,o(n,i,4),r,s)}}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2)},"reduceRight.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"filter.js":function e(t,n,e){let r,i;function o(e,t,n){var o=[];return t=r(t,n),i(e,(function(e,n,r){t(e,n,r)&&o.push(e)})),o}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"reject.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r(e,i(o(t)),n)}e.export({default:()=>s}),e.link("./filter.js",{default(e){r=e}},0),e.link("./negate.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2)},"every.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"some.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"contains.js":function e(t,n,e){let r,i,o;function s(e,t,n,s){return r(e)||(e=i(e)),("number"!=typeof n||s)&&(n=0),o(e,t,n)>=0}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./indexOf.js",{default(e){o=e}},2)},"invoke.js":function e(t,n,e){let r,i,o,s,a;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2),e.link("./_deepGet.js",{default(e){s=e}},3),e.link("./_toPath.js",{default(e){a=e}},4),e.exportDefault(r((function(e,t,n){var r,u;return i(t)?u=t:(t=a(t),r=t.slice(0,-1),t=t[t.length-1]),o(e,(function(e){var i=u;if(!i){if(r&&r.length&&(e=s(e,r)),null==e)return;i=e[t]}return null==i?i:i.apply(e,n)}))})))},"pluck.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./map.js",{default(e){r=e}},0),e.link("./property.js",{default(e){i=e}},1)},"where.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./filter.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"max.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=-1/0,u=-1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la&&(a=f);else t=o(t,n),s(e,(function(e,n,r){((c=t(e,n,r))>u||c===-1/0&&a===-1/0)&&(a=e,u=c)}));return a}e.export({default:()=>a}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"min.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=1/0,u=1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"shuffle.js":function e(t,n,e){let r;function i(e){return r(e,1/0)}e.export({default:()=>i}),e.link("./sample.js",{default(e){r=e}},0)},"sample.js":function e(t,n,e){let r,i,o,s,a;function u(e,t,n){if(null==t||n)return r(e)||(e=i(e)),e[s(e.length-1)];var u=a(e),f=o(u);t=Math.max(Math.min(t,f),0);for(var c=f-1,l=0;lu}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./random.js",{default(e){s=e}},3),e.link("./toArray.js",{default(e){a=e}},4)},"toArray.js":function e(t,n,e){let r,i,o,s,a,u,f;e.export({default:()=>l}),e.link("./isArray.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./_isArrayLike.js",{default(e){s=e}},3),e.link("./map.js",{default(e){a=e}},4),e.link("./identity.js",{default(e){u=e}},5),e.link("./values.js",{default(e){f=e}},6);var c=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function l(e){return e?r(e)?i.call(e):o(e)?e.match(c):s(e)?a(e,u):f(e):[]}},"sortBy.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=0;return t=r(t,n),i(o(e,(function(e,n,r){return{value:e,index:s++,criteria:t(e,n,r)}})).sort((function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||void 0===n)return 1;if(ns}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./pluck.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2)},"groupBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n].push(t):e[n]=[t]})))},"_group.js":function e(t,n,e){let r,i;function o(e,t){return function(n,o,s){var a=t?[[],[]]:{};return o=r(o,s),i(n,(function(t,r){var i=o(t,r,n);e(a,t,i)})),a}}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"indexBy.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n]=t})))},"countBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n]++:e[n]=1})))},"partition.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n?0:1].push(t)}),!0))},"size.js":function e(t,n,e){let r,i;function o(e){return null==e?0:r(e)?e.length:i(e).length}e.export({default:()=>o}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"pick.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2),e.link("./allKeys.js",{default(e){s=e}},3),e.link("./_keyInObj.js",{default(e){a=e}},4),e.link("./_flatten.js",{default(e){u=e}},5),e.exportDefault(r((function(e,t){var n={},r=t[0];if(null==e)return n;i(r)?(t.length>1&&(r=o(r,t[1])),t=s(e)):(r=a,t=u(t,!1,!1),e=Object(e));for(var f=0,c=t.length;fr})},"omit.js":function e(t,n,e){let r,i,o,s,a,u,f;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./negate.js",{default(e){o=e}},2),e.link("./map.js",{default(e){s=e}},3),e.link("./_flatten.js",{default(e){a=e}},4),e.link("./contains.js",{default(e){u=e}},5),e.link("./pick.js",{default(e){f=e}},6),e.exportDefault(r((function(e,t){var n=t[0],r;return i(n)?(n=o(n),t.length>1&&(r=t[1])):(t=s(a(t,!1,!1),String),n=function(e,n){return!u(t,n)}),f(e,n,r)})))},"first.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:r(e,e.length-t)}e.export({default:()=>i}),e.link("./initial.js",{default(e){r=e}},0)},"initial.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"last.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:r(e,Math.max(0,e.length-t))}e.export({default:()=>i}),e.link("./rest.js",{default(e){r=e}},0)},"rest.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,null==t||n?1:t)}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"compact.js":function e(t,n,e){let r;function i(e){return r(e,Boolean)}e.export({default:()=>i}),e.link("./filter.js",{default(e){r=e}},0)},"flatten.js":function e(t,n,e){let r;function i(e,t){return r(e,t,!1)}e.export({default:()=>i}),e.link("./_flatten.js",{default(e){r=e}},0)},"without.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./difference.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t){return i(e,t)})))},"difference.js":function e(t,n,e){let r,i,o,s;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./filter.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3),e.exportDefault(r((function(e,t){return t=i(t,!0,!0),o(e,(function(e){return!s(t,e)}))})))},"uniq.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,a){r(t)||(a=n,n=t,t=!1),null!=n&&(n=i(n,a));for(var u=[],f=[],c=0,l=o(e);ca}),e.link("./isBoolean.js",{default(e){r=e}},0),e.link("./_cb.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3)},"union.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./uniq.js",{default(e){i=e}},1),e.link("./_flatten.js",{default(e){o=e}},2),e.exportDefault(r((function(e){return i(o(e,!0,!0))})))},"intersection.js":function e(t,n,e){let r,i;function o(e){for(var t=[],n=arguments.length,o=0,s=r(e);oo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;ss}),e.link("./max.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.link("./pluck.js",{default(e){o=e}},2)},"zip.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./unzip.js",{default(e){i=e}},1),e.exportDefault(r(i))},"object.js":function e(t,n,e){let r;function i(e,t){for(var n={},i=0,o=r(e);ii}),e.link("./_getLength.js",{default(e){r=e}},0)},"range.js":function e(t,n,e){function r(e,t,n){null==t&&(t=e||0,e=0),n||(n=tr})},"chunk.js":function e(t,n,e){let r;function i(e,t){if(null==t||t<1)return[];for(var n=[],i=0,o=e.length;ii}),e.link("./_setup.js",{slice(e){r=e}},0)},"mixin.js":function e(t,n,e){let r,i,o,s,a;function u(e){return i(o(e),(function(t){var n=r[t]=e[t];r.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),a(this,n.apply(r,e))}})),r}e.export({default:()=>u}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./functions.js",{default(e){o=e}},2),e.link("./_setup.js",{push(e){s=e}},3),e.link("./_chainResult.js",{default(e){a=e}},4)},"_chainResult.js":function e(t,n,e){let r;function i(e,t){return e._chain?r(t).chain():t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"underscore-array-methods.js":function e(t,n,e){let r,i,o,s;e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./_setup.js",{ArrayProto(e){o=e}},2),e.link("./_chainResult.js",{default(e){s=e}},3),i(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=o[e];r.prototype[e]=function(){var n=this._wrapped;return null!=n&&(t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0]),s(this,n)}})),i(["concat","join","slice"],(function(e){var t=o[e];r.prototype[e]=function(){var e=this._wrapped;return null!=e&&(e=t.apply(e,arguments)),s(this,e)}})),e.exportDefault(r)}}}}},cachers:{"package.json":function e(t,n,e){e.exports={name:"@steedos/cachers",version:"2.7.4-beta.1",main:"lib/index.js"}},lib:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getCacherNames=n.clearCacher=n.getCacher=void 0;var r={},i=t("./memory"),o=t("./memory-lru"),s=function(e,t){return r[e]||(e.startsWith("lru.")?r[e]=new o.MemoryLRUCacher(t):r[e]=new i.MemoryCacher),r[e]};n.getCacher=s;var a=function(e){r[e]&&r[e].clear()};n.clearCacher=a;var u=function(){return Object.keys(r)};n.getCacherNames=u},"memory.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryCacher=void 0;var r=t("lodash"),i=function(){function e(){this.cache={}}return e.prototype.get=function(e){return this.cache[e]},e.prototype.delete=function(e){delete this.cache[e]},e.prototype.set=function(e,t){this.cache[e]=t},e.prototype.clear=function(){this.cache={}},e.prototype.keys=function(){return(0,r.keys)(this.cache)},e.prototype.values=function(){return(0,r.values)(this.cache)},e}();n.MemoryCacher=i},"memory-lru.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryLRUCacher=void 0;var r=t("lodash"),i=t("lru-cache"),o={max:5e3,ttl:null,keygen:null,maxParamsLength:null},s=function(){function e(e){this.opts=(0,r.defaultsDeep)(e,o),this.cache=new i({max:this.opts.max,maxAge:this.opts.ttl?1e3*this.opts.ttl:null,updateAgeOnGet:!!this.opts.ttl})}return e.prototype.get=function(e){return this.cache.get(e)},e.prototype.set=function(e,t,n){return this.cache.set(e,t,n)},e.prototype.delete=function(e){return this.cache.delete(e)},e.prototype.clear=function(){return this.cache.clear()},e.prototype.keys=function(){return this.cache.keys()},e.prototype.values=function(){return this.cache.values()},e}();n.MemoryLRUCacher=s}},node_modules:{"lru-cache":{"package.json":function e(t,n,e){e.exports={name:"lru-cache",version:"7.14.1",main:"index.js"}},"index.js":function e(t,n,e){const r="object"==typeof performance&&performance&&"function"==typeof performance.now?performance:Date,i="function"==typeof AbortController,o=i?AbortController:class e{constructor(){this.signal=new u}abort(){this.signal.dispatchEvent("abort")}},s="function"==typeof AbortSignal,a="function"==typeof o.AbortSignal,u=s?AbortSignal:a?o.AbortController:class e{constructor(){this.aborted=!1,this._listeners=[]}dispatchEvent(e){if("abort"===e){this.aborted=!0;const t={type:e,target:this};this.onabort(t),this._listeners.forEach(e=>e(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},f=new Set,c=(e,t)=>{const n=`LRU_CACHE_OPTION_${e}`;p(n)&&g(n,`${e} option`,`options.${t}`,_)},l=(e,t)=>{const n=`LRU_CACHE_METHOD_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} method`,`cache.${t}()`,i)}},h=(e,t)=>{const n=`LRU_CACHE_PROPERTY_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} property`,`cache.${t}`,i)}},d=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!f.has(e),g=(e,t,n,r)=>{f.add(e);const i=`The ${t} is deprecated. Please use ${n} instead.`;d(i,"DeprecationWarning",e,r)},b=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),m=e=>b(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=m(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class _{constructor(e={}){const{max:t=0,ttl:n,ttlResolution:r=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:s,allowStale:a,dispose:u,disposeAfter:l,noDisposeOnSet:h,noUpdateTTL:g,maxSize:v=0,maxEntrySize:w=0,sizeCalculation:k,fetchMethod:j,fetchContext:x,noDeleteOnFetchRejection:S,noDeleteOnStaleGet:D}=e,{length:E,maxAge:A,stale:C}=e instanceof _?{}:e;if(0!==t&&!b(t))throw new TypeError("max option must be a nonnegative integer");const M=t?m(t):Array;if(!M)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=w||this.maxSize,this.sizeCalculation=k||E,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=j||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=x,!this.fetchMethod&&void 0!==x)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new M(t),this.prev=new M(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof l?(this.disposeAfter=l,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!h,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!S,0!==this.maxEntrySize){if(0!==this.maxSize&&!b(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!b(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!a||!!C,this.noDeleteOnStaleGet=!!D,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!s,this.ttlResolution=b(r)||0===r?r:1,this.ttlAutopurge=!!i,this.ttl=n||A||0,this.ttl){if(!b(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){f.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";d(t,"UnboundedCacheWarning",e,_)}}C&&c("stale","allowStale"),A&&c("maxAge","ttl"),E&&c("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,n=r.now())=>{if(this.starts[e]=0!==t?n:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const n=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);n.unref&&n.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?r.now():0};let e=0;const t=()=>{const t=r.now();if(this.ttlResolution>0){e=t;const n=setTimeout(()=>e=0,this.ttlResolution);n.unref&&n.unref()}return t};this.getRemainingTTL=n=>{const r=this.keyMap.get(n);return void 0===r?0:0===this.ttls[r]||0===this.starts[r]?1/0:this.starts[r]+this.ttls[r]-(e||t())},this.isStale=n=>0!==this.ttls[n]&&0!==this.starts[n]&&(e||t())-this.starts[n]>this.ttls[n]}updateItemAge(e){}setItemTTL(e,t,n){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,n,r)=>{if(this.isBackgroundFetch(t))return 0;if(!b(n)){if(!r)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof r)throw new TypeError("sizeCalculation must be a function");if(n=r(t,e),!b(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return n},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,n,r){if(n||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const n of this.indexes())if(e(this.valList[n],this.keyList[n],this))return this.get(this.keyList[n],t)}forEach(e,t=this){for(const n of this.indexes())e.call(t,this.valList[n],this.keyList[n],this)}rforEach(e,t=this){for(const n of this.rindexes())e.call(t,this.valList[n],this.keyList[n],this)}get prune(){return l("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const n=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,s={value:o};if(this.ttls){s.ttl=this.ttls[t];const e=r.now()-this.starts[t];s.start=Math.floor(Date.now()-e)}this.sizes&&(s.size=this.sizes[t]),e.unshift([n,s])}return e}load(e){this.clear();for(const[t,n]of e){if(n.start){const e=Date.now()-n.start;n.start=r.now()-e}this.set(t,n.value,n)}}dispose(e,t,n){}set(e,t,{ttl:n=this.ttl,start:r,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:a=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,s),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),a=!1;else{const n=this.valList[u];t!==n&&(this.isBackgroundFetch(n)?n.__abortController.abort():i||(this.dispose(n,e,"set"),this.disposeAfter&&this.disposed.push([n,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===n||0!==this.ttl||this.ttls||this.initializeTTLTracking(),a||this.setItemTTL(u,n,r),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,n=this.keyList[t],r=this.valList[t];return this.isBackgroundFetch(r)?r.__abortController.abort():(this.dispose(r,n,"evict"),this.disposeAfter&&this.disposed.push([r,n,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(n),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const n=this.keyMap.get(e);return void 0!==n&&!this.isStale(n)&&(t&&this.updateItemAge(n),!0)}peek(e,{allowStale:t=this.allowStale}={}){const n=this.keyMap.get(e);if(void 0!==n&&(t||!this.isStale(n))){const e=this.valList[n];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,n,r){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const s=new o,a={signal:s.signal,options:n,context:r},u=t=>(s.signal.aborted||this.set(e,t,a.options),t),f=r=>{if(this.valList[t]===l){const r=!n.noDeleteOnFetchRejection||void 0===l.__staleWhileFetching;r?this.delete(e):this.valList[t]=l.__staleWhileFetching}if(l.__returned===l)throw r},c=t=>t(this.fetchMethod(e,i,a)),l=new Promise(c).then(u,f);return l.__abortController=s,l.__staleWhileFetching=i,l.__returned=null,void 0===t?(this.set(e,l,a.options),t=this.keyMap.get(e)):this.valList[t]=l,l}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:s=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,fetchContext:c=this.fetchContext,forceRefresh:l=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r});const h={allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r,ttl:i,noDisposeOnSet:o,size:s,sizeCalculation:a,noUpdateTTL:u,noDeleteOnFetchRejection:f};let d=this.keyMap.get(e);if(void 0===d){const t=this.backgroundFetch(e,d,h,c);return t.__returned=t}{const r=this.valList[d];if(this.isBackgroundFetch(r))return t&&void 0!==r.__staleWhileFetching?r.__staleWhileFetching:r.__returned=r;if(!l&&!this.isStale(d))return this.moveToTail(d),n&&this.updateItemAge(d),r;const i=this.backgroundFetch(e,d,h,c);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],s=this.isBackgroundFetch(o);if(this.isStale(i))return s?t?o.__staleWhileFetching:void 0:(r||this.delete(e),t?o:void 0);if(s)return;return this.moveToTail(i),n&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return l("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const n=this.keyMap.get(e);if(void 0!==n)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(n);const t=this.valList[n];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[n]=null,this.valList[n]=null,n===this.tail?this.tail=this.prev[n]:n===this.head?this.head=this.next[n]:(this.next[this.prev[n]]=this.next[n],this.prev[this.next[n]]=this.prev[n]),this.size--,this.free.push(n)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const n=this.keyList[e];this.dispose(t,n,"delete"),this.disposeAfter&&this.disposed.push([t,n,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return l("reset","clear"),this.clear}get length(){return h("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=_}}}},"form-builder":{"package.json":function e(t,n,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":[]}}},tslib:{"package.json":function e(t,n,e){e.exports={name:"tslib",version:"2.3.1",module:"tslib.es6.js",main:"tslib.js"}},"tslib.es6.js":function e(t,n,e){e.export({__extends:()=>i,__assign:()=>o,__rest:()=>s,__decorate:()=>a,__param:()=>u,__metadata:()=>f,__awaiter:()=>c,__generator:()=>l,__createBinding:()=>h,__exportStar:()=>d,__values:()=>p,__read:()=>g,__spread:()=>b,__spreadArrays:()=>m,__spreadArray:()=>v,__await:()=>y,__asyncGenerator:()=>_,__asyncDelegator:()=>w,__asyncValues:()=>k,__makeTemplateObject:()=>j,__importStar:()=>S,__importDefault:()=>D,__classPrivateFieldGet:()=>E,__classPrivateFieldSet:()=>A}); +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}e.fn.emulateTransitionEnd=function(t){var n=!1,r=this,i;return e(this).one("bsTransitionEnd",(function(){n=!0})),setTimeout((function(){n||e(r).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};function r(t){return this.each((function(){var r=e(this),i=r.data("bs.alert");i||r.data("bs.alert",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.TRANSITION_DURATION=150,n.prototype.close=function(t){var r=e(this),i=r.attr("data-target");i||(i=(i=r.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function s(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=r.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",s).emulateTransitionEnd(n.TRANSITION_DURATION):s())};var i=e.fn.alert;e.fn.alert=r,e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.isLoading=!1};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.button"),o="object"==typeof n&&n;i||r.data("bs.button",i=new t(this,o)),"toggle"==n?i.toggle():n&&i.setState(n)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var n="disabled",r=this.$element,i=r.is("input")?"val":"html",o=r.data();t+="Text",null==o.resetText&&r.data("resetText",r[i]()),setTimeout(e.proxy((function(){r[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n).prop(n,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n).prop(n,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=n,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var r=e(t.target).closest(".btn");n.call(r,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.carousel"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n),s="string"==typeof n?n:o.slide;i||r.data("bs.carousel",i=new t(this,o)),"number"==typeof n?i.to(n):s?i[s]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t),r;if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(n,r){var i=this.$element.find(".item.active"),o=r||this.getItemForDirection(n,i),s=this.interval,a="next"==n?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var f=o[0],c=e.Event("slide.bs.carousel",{relatedTarget:f,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,s&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=e(this.$indicators.children()[this.getItemIndex(o)]);l&&l.addClass("active")}var h=e.Event("slid.bs.carousel",{relatedTarget:f,direction:a});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(n),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(a),o.addClass(a),i.one("bsTransitionEnd",(function(){o.removeClass([n,a].join(" ")).addClass("active"),i.removeClass(["active",a].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(h)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(h)),s&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=n,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var i=function(t){var r=e(this),i=r.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=r.attr("data-target")||i,s=e(document).find(o);if(s.hasClass("carousel")){var a=e.extend({},s.data(),r.data()),u=r.attr("data-slide-to");u&&(a.interval=!1),n.call(s,a),u&&s.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);n.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.$trigger=e('[data-toggle="collapse"][href="#'+n.id+'"],[data-toggle="collapse"][data-target="#'+n.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(r)}function r(n){return this.each((function(){var r=e(this),i=r.data("bs.collapse"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n);!i&&o.toggle&&/show|hide/.test(n)&&(o.toggle=!1),i||r.data("bs.collapse",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var n,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(n=i.data("bs.collapse"))&&n.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(r.call(i,"hide"),n||i.data("bs.collapse",null));var s=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[s](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[s](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return a.call(this);var u=e.camelCase(["scroll",s].join("-"));this.$element.one("bsTransitionEnd",e.proxy(a,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[s](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var n=e.Event("hide.bs.collapse");if(this.$element.trigger(n),!n.isDefaultPrevented()){var r=this.dimension();this.$element[r](this.$element[r]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[r](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,r){var i=e(r);this.addAriaAndCollapsedClass(n(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var i=e.fn.collapse;e.fn.collapse=r,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=n(i),s,a=o.data("bs.collapse")?"toggle":i.data();r.call(o,a)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r="#"!==n?e(document).find(n):null;return r&&r.length?r:t.parent()}function o(r){r&&3===r.which||(e(t).remove(),e(n).each((function(){var t=e(this),n=i(t),o={relatedTarget:this};n.hasClass("open")&&(r&&"click"==r.type&&/input|textarea/i.test(r.target.tagName)&&e.contains(n[0],r.target)||(n.trigger(r=e.Event("hide.bs.dropdown",o)),r.isDefaultPrevented()||(t.attr("aria-expanded","false"),n.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function s(t){return this.each((function(){var n=e(this),i=n.data("bs.dropdown");i||n.data("bs.dropdown",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.prototype.toggle=function(t){var n=e(this);if(!n.is(".disabled, :disabled")){var r=i(n),s=r.hasClass("open");if(o(),!s){"ontouchstart"in document.documentElement&&!r.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var a={relatedTarget:this};if(r.trigger(t=e.Event("show.bs.dropdown",a)),t.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),r.toggleClass("open").trigger(e.Event("shown.bs.dropdown",a))}return!1}},r.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var r=e(this);if(t.preventDefault(),t.stopPropagation(),!r.is(".disabled, :disabled")){var o=i(r),s=o.hasClass("open");if(!s&&27!=t.which||s&&27==t.which)return 27==t.which&&o.find(n).trigger("focus"),r.trigger("click");var a=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+a);if(u.length){var f=u.index(t.target);38==t.which&&f>0&&f--,40==t.which&&fdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},f.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var s=i[o];if("click"==s)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",u="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},f.prototype.getDefaults=function(){return f.DEFAULTS},f.prototype.getOptions=function(n){var r=this.$element.data();for(var i in r)r.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete r[i];return(n=e.extend({},this.getDefaults(),r,n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.sanitize&&(n.template=u(n.template,n.whiteList,n.sanitizeFn)),n},f.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,(function(e,r){n[e]!=r&&(t[e]=r)})),t},f.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState)n.hoverState="in";else{if(clearTimeout(n.timeout),n.hoverState="in",!n.options.delay||!n.options.delay.show)return n.show();n.timeout=setTimeout((function(){"in"==n.hoverState&&n.show()}),n.options.delay.show)}},f.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},f.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),!n.isInStateTrue()){if(clearTimeout(n.timeout),n.hoverState="out",!n.options.delay||!n.options.delay.hide)return n.hide();n.timeout=setTimeout((function(){"out"==n.hoverState&&n.hide()}),n.options.delay.hide)}},f.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var n=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!n)return;var r=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,u=a.test(s);u&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var c=this.getPosition(),l=i[0].offsetWidth,h=i[0].offsetHeight;if(u){var d=s,p=this.getPosition(this.$viewport);s="bottom"==s&&c.bottom+h>p.bottom?"top":"top"==s&&c.top-hp.width?"left":"left"==s&&c.left-ls.top+s.height&&(i.top=s.top+s.height-u)}else{var f=t.left-o,c=t.left+o+n;fs.right&&(i.left=s.left+s.width-c)}return i},f.prototype.getTitle=function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)},f.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},f.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},f.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},f.prototype.enable=function(){this.enabled=!0},f.prototype.disable=function(){this.enabled=!1},f.prototype.toggleEnabled=function(){this.enabled=!this.enabled},f.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},f.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},f.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var l=e.fn.tooltip;e.fn.tooltip=c,e.fn.tooltip.Constructor=f,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=l,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function n(n){return this.each((function(){var r=e(this),i=r.data("bs.popover"),o="object"==typeof n&&n;!i&&/destroy|hide/.test(n)||(i||r.data("bs.popover",i=new t(this,o)),"string"==typeof n&&i[n]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();if(this.options.html){var r=typeof n;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===r&&(n=this.sanitizeHtml(n))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===r?"html":"append"](n)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(n);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var r=e.fn.popover;e.fn.popover=n,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=r,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(n).is(document.body)?e(window):e(n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each((function(){var r=e(this),i=r.data("bs.scrollspy"),o="object"==typeof n&&n;i||r.data("bs.scrollspy",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[n]().top+r,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),n=this.options.offset+t-this.$scrollElement.height(),r=this.offsets,i=this.targets,o=this.activeTarget,s;if(this.scrollHeight!=t&&this.refresh(),e>=n)return o!=(s=i[i.length-1])&&this.activate(s);if(o&&e=r[s]&&(void 0===r[s+1]||e .active"),s=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!r.find("> .fade").length);function a(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),n.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(n[0].offsetWidth,n.addClass("in")):n.removeClass("fade"),n.parent(".dropdown-menu").length&&n.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&s?o.one("bsTransitionEnd",a).emulateTransitionEnd(t.TRANSITION_DURATION):a(),o.removeClass("in")};var r=e.fn.tab;e.fn.tab=n,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var i=function(t){t.preventDefault(),n.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(n,r){this.options=e.extend({},t.DEFAULTS,r);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(n),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.affix"),o="object"==typeof n&&n;i||r.data("bs.affix",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,n,r){var i=this.$target.scrollTop(),o=this.$element.offset(),s=this.$target.height();if(null!=n&&"top"==this.affixed)return i=e-r&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),n=this.$element.offset();return this.pinnedOffset=n.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var n=this.$element.height(),r=this.options.offset,i=r.top,o=r.bottom,s=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(o=i=r),"function"==typeof i&&(i=r.top(this.$element)),"function"==typeof o&&(o=r.bottom(this.$element));var a=this.getState(s,n,i,o);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var u="affix"+(a?"-"+a:""),f=e.Event(u+".bs.affix");if(this.$element.trigger(f),f.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:s-n-o})}};var r=e.fn.affix;e.fn.affix=n,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),r=t.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),n.call(t,r)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,n,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,n,e,r,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),s=t("path"),a=t("detect-libc");Math.random();var u=s.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+a.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(c){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(c.stack||c.message||c),new Error("Missing binary. See message above.")}f(e.exports)}function f(e){try{var t=process.binding("async_wrap"),n;if(t.asyncIdStackSize instanceof Function)n=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");l=t.constants.kStackLength,n=function(){return t.async_hook_fields[l]}}var r=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,s;if(!r||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,s=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var a=t.async_id_fields||t.async_uid_fields;function u(){for(var e=n(),t=new Array(e);e>0;--e){var i=a[o];t[e-1]={asyncId:i,triggerId:a[s]},r(i)}return t}function f(e){for(var t=0;t0)i.changeLanguage(e,r);else if(0!=a[u]){a[u]=0;var f=new XMLHttpRequest;f.overrideMimeType("application/json"),f.open("GET",u,!1),f.send(null),200===f.status?a[u]=1:a[u]=-1,n.addResourceBundle(e,s,JSON.parse(f.response)||{}),i.changeLanguage(e,r)}};n.changeLanguage=p;var g=function(e,t,n){return i.format(e,t,n)};n.format=g;var b=function(){return i.languages};n.getLanguages=b;var m=function(e,t){return i.loadLanguages(e,t)};n.loadLanguages=m;var v=function(e,t){return i.loadNamespaces(e,t)};n.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};n.on=y;var _=function(e,t){return i.off(e,t)};n.off=_,r.__exportStar(t("./i18n/i18n"),n),r.__exportStar(t("./i18n/i18n.app"),n),r.__exportStar(t("./translations"),n)},i18n:{"i18n.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.fallbackKeys=n.getObjectI18nTemplate=n.translationI18nObjects=n.addObjectsI18n=n.translationI18nObject=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="_",a="base",u="core",f="translation",c=function(e,t){var n={lng:t,ns:f};if((0,r.exists)(e,n))return(0,r._t)(e,n)},l=function(e){return"".concat(e,"__object")},h=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},d=function(e,t){var n=h(e,t);return"".concat(n).concat("_","inlineHelpText")},p=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(n)},g=function(e,t,n){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(n)},b=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},m=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,n){var r=l(t);return c(r,e)||n||""},_=function(e,t,n,r,i){var o=h(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=_(e,a,n,r,i))}return s||r||""},w=function(e,t,n,r,i){var o=d(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=w(e,a,n,r,i))}return s||r||""},k=function(e,t,n,r){var i=p(t,n);return c(i,e)||r||""},j=function(e,t,n,r,i,o){var s=g(t,n,r),a=c(s,e);if(!a){var u=v(o);u&&"base"!=t&&"core"!=t&&(a=j(e,u,n,r,i,o))}return a||i||""},x=function(e,t,n,r,i){var o=b(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=x(e,a,n,r,i))}return s||r||""},S=function(e,t,n,r,i){var o=m(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=S(e,a,n,r,i))}return s||r||""},D=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},E=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(D(e))}))):n.push(D(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},A=function(e,t,n){n.label=y(e,t,n.label),i.each(n.fields,(function(r,o){if(r.label=_(e,t,o,r.label,n.datasource),r.inlineHelpText&&(r.inlineHelpText=w(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(r.group=k(e,t,r.group,r.group)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var a=j(e,t,o,r.value,r.label,n.datasource);s.push(i.extend({},r,{label:a}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=x(e,t,i,r.label,n.datasource)})),i.each(n.list_views,(function(r,i){r.label=S(e,t,i,r.label,n.datasource)}))};n.translationI18nObject=A;var C=function(e){i.each(e,(function(e){(0,r.addResourceBundle)(e.lng,f,e.data,!0,!0)}))};n.addObjectsI18n=C;var M=function(e,t){i.each(t,(function(t,r){(0,n.translationI18nObject)(e,r,t)}))};n.translationI18nObjects=M;var O=function(e,t,n){var r=o(n);E(r);var s={};return s[l(t)]=y(e,t,r.label),i.each(r.fields,(function(n,o){s[h(t,o)]=_(e,t,o,n.label),n.inlineHelpText&&(s[d(t,o)]=w(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(s[p(t,n.group)]=k(e,t,n.group,n.group)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[g(t,o,n.value)]=j(e,t,o,n.value,n.label))}))})),i.each(r.actions,(function(n,r){s[b(t,r)]=x(e,t,r,n.label)})),i.each(r.list_views,(function(n,r){s[m(t,r)]=S(e,t,r,n.label)})),s};n.getObjectI18nTemplate=O,n.fallbackKeys={getObjectLabelKey:l,getObjectFieldLabelKey:h,getObjectFieldInlineHelpTextLabelKey:d,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:g,getObjectActionLabelKey:b,getObjectListviewLabelKey:m}},"i18n.app.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.appFallbackKeys=n.getAppI18nTemplate=n.translationI18nApps=n.translationI18nMenus=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="translation",a="_",u=function(e,t){var n={lng:t,ns:s};if((0,r.exists)(e,n))return(0,r._t)(e,n)},f=function(e){return"app".concat("_").concat(e).concat("_","name")},c=function(e){return"app".concat("_").concat(e).concat("_","description")},l=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(n)},h=function(e){return"menu".concat("_").concat(e)},d=function(e){return"tab".concat("_").concat(e)},p=function(e,t,n){var r=f(t);return u(r,e)||n||""},g=function(e,t,n){var r=c(t);return u(r,e)||n||""},b=function(e,t,n){var r=h(t);return u(r,e)||n||""},m=function(e,t,r){r.label=p(e,t,r.label||r.name),r.description=g(e,t,r.description),(0,n.translationI18nMenus)(e,r.admin_menus)},v=function(e,t){i.each(t,(function(t){var n=b(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,n){m(e,n,t)}))};n.translationI18nApps=y;var _=function(e,t,n){var r=o(n),s={};return s[f(t)]=p(e,t,r.label||r.name),s[c(t)]=g(e,t,r.description),i.each(r.admin_menus,(function(t){s[h(t._id)]=b(e,t._id,t.label||t.name)})),s};n.getAppI18nTemplate=_,n.appFallbackKeys={getAppLabelKey:f,getAppDescriptionKey:c,getAppGroupKey:l,getMenuLabelKey:h,getTabKey:d}}},translations:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SteedosTranslationPrefixKeys=n.convertObject=void 0;var r=t("tslib"),i=t("underscore");r.__exportStar(t("./objectTranslation"),n),r.__exportStar(t("./translation"),n),r.__exportStar(t("./templates/objectTranslation"),n),r.__exportStar(t("./templates/translation"),n);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},s=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(o(e))}))):n.push(o(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?n.push(o(e)):n.push(e)})),e.options=n}catch(r){console.error("Creator.convertFieldsOptions",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},a;n.convertObject=s,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(a=n.SteedosTranslationPrefixKeys||(n.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,n,e,r){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addObjectsTranslation=n.getObjectTranslationTemplate=n.translationObjects=n.translationObject=n.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),s=t("../index"),a=t("./index"),u=t("../i18n/i18n"),f=t("lodash"),c=t("crypto"),l,h=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function d(e){var t;return c.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(d(JSON.stringify(t)))},g=t("clone"),b=".",m="base",v="core",y="translation",_="object",w="field",k="listview",j="action",x=function(e,t){var n={lng:t,ns:y,keySeparator:!1};if((0,s.exists)(e,n))return(0,s._t)(e,n)},S=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},D=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},E=function(e){var t;return[D(),e].join(".")},A=function(e){var t;return[D("object"),e,"label"].join(".")},C=function(e){var t;return[D("object"),e,"description"].join(".")},M=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"label"].join(".")},O=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"help"].join(".")},T=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"description"].join(".")},B=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),r;return[D("field"),e,"group",n].join(".")},I=function(e,t,n){var r;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"options",n].join(".")},R=function(e,t){var n;return[D("action"),e,t].join(".")},F=function(e,t){var n;return[D("listview"),e,t].join(".")},P=function(e,t,n){var r,i=[A(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),x(i,e)||n||""};n.translationObjectLabel=P;var N=function(e,t,n){var r=C(t);return x(r,e)||n||""},L=function(e,t,n,r,i,o){var s,a=[M(t,n)],f=u.fallbackKeys.getObjectFieldLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=L(e,l,n,r,i))}return c||r||""},z=function(e,t,n,r,i,o){var s,a=[O(t,n)],f=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=z(e,l,n,r,i))}return c||r||""},U=function(e,t,n,r,i,o){var s=T(t,n),a,u=x([s],e);if(1!=o&&!u){var f=S(i);f&&"base"!=t&&"core"!=t&&(u=U(e,f,n,r,i))}return u||r||""},q=function(e,t,n,r,i,o){var s,a=[B(t,n)],f=u.fallbackKeys.getObjectFieldGroupKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=q(e,l,n,r,i))}return c||r||""},$=function(e,t,n,r,i,o,s){var a,f=[I(t,n,r)],c=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,n,r);c&&f.push(c);var l=x(f,e);if(1!=s&&!l){var h=S(o);h&&"base"!=t&&"core"!=t&&(l=$(e,h,n,r,i,o))}return l||i||""},W=function(e,t,n,r,i,o){var s,a=[R(t,n)],f=u.fallbackKeys.getObjectActionLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=W(e,l,n,r,i))}return c||r||""},H=function(e,t,n,r,i,o){var s,a=[F(t,n)],f=u.fallbackKeys.getObjectListviewLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=H(e,l,n,r,i))}return c||r||""},Y=function(e,t,r,o,s){void 0===s&&(s=!1);var u=p(e,r),c=h.get(u);if(c)return Object.assign(r,(0,f.cloneDeep)(c));o&&(0,a.convertObject)(r),r.label=(0,n.translationObjectLabel)(e,t,r.label),r.description=N(e,t,r.description),i.each(r.fields,(function(n,o){if(n.label=L(e,t,o,n.label,r.datasource,s),n.inlineHelpText=z(e,t,o,n.inlineHelpText,r.datasource,s),n.description=U(e,t,o,n.description,r.datasource,s),n.group&&(n.group=q(e,t,n.group,n.group,r.datasource,s)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var u=$(e,t,o,n.value,n.label,r.datasource,s);a.push(i.extend({},n,{label:u}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=W(e,t,i,n.label,r.datasource,s)})),i.each(r.list_views,(function(n,i){n.label=H(e,t,i,n.label,r.datasource,s)})),h.set(u,(0,f.cloneDeep)(r))};n.translationObject=Y;var V=function(e,t){i.each(t,(function(t,r){(0,n.translationObject)(e,r,t)}))};n.translationObjects=V;var K=function(e,t,r){var o=g(r);(0,a.convertObject)(o);var s={};return s[A(t)]=(0,n.translationObjectLabel)(e,t,o.label),s[C(t)]=N(e,t,o.description),i.each(o.fields,(function(n,r){s[M(t,r)]=L(e,t,r,n.label),n.inlineHelpText&&(s[O(t,r)]=z(e,t,r,n.inlineHelpText,o.datasource)),n.description&&(s[T(t,r)]=U(e,t,r,n.description,o.datasource)),n.group&&(s[B(t,n.group)]=q(e,t,n.group,n.group,o.datasource)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[I(t,r,n.value)]=$(e,t,r,n.value,n.label))}))})),i.each(o.actions,(function(n,r){s[R(t,r)]=W(e,t,r,n.label)})),i.each(o.list_views,(function(n,r){s[F(t,r)]=H(e,t,r,n.label)})),s};function G(e,t){var n=g(e);(0,a.convertObject)(n);var r={},o=n.name;return o||console.error("Error: Invalid objectTranslation:"+t),r[A(o)]=n.label,r[C(o)]=n.description,i.each(n.fields,(function(e,t){r[M(o,t)]=e.label,e.help&&(r[O(o,t)]=e.help),e.description&&(r[T(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(r[I(o,t,e.value)]=e.label)}))})),i.each(n.groups,(function(e,t){r[B(o,t)]=e})),i.each(n.actions,(function(e,t){r[R(o,t)]=e.label})),i.each(n.listviews,(function(e,t){r[F(o,t)]=e.label})),i.each(n.CustomLabels,(function(e,t){r[E(t)]=e})),r}n.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,s.addResourceBundle)(e.lng,y,t,!0,!0)}))};n.addObjectsTranslation=X},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addTranslations=n.convertTranslation=n.convertTranslationData=n.getAppTranslationTemplate=n.translationApps=n.translationMenus=n.translationApp=n.translationTabLabel=n.translationTabGroup=void 0;var r=t("../index"),i=t("underscore"),o=t("./"),s=t("../i18n/i18n.app"),a=t("clone"),u="translation",f=".",c="app",l="menu",h="tab",d=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[d(),e].join(".")},g=function(e,t){var n={lng:t,ns:u,keySeparator:!1};if((0,r.exists)(e,n))return(0,r._t)(e,n)},b=function(e){var t;return[d("app"),e,"name"].join(".")},m=function(e){var t;return[d("app"),e,"description"].join(".")},v=function(e,t){var n,r;return[d("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[d("menu"),"menu_".concat(e)].join(".")},_=function(e){var t;return[d("tab"),e].join(".")},w=function(e,t,n){var r,i=[b(t)],o=s.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),g(i,e)||n||""},k=function(e,t,n){var r,i=[m(t)],o=s.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),g(i,e)||n||""},j=function(e,t,n,r){var i,o=[v(t,n)],a=s.appFallbackKeys.getAppGroupKey(t,n);return a&&o.push(a),g(o,e)||r||""};n.translationTabGroup=j;var x=function(e,t,n){var r,i=[y(t)],o=s.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),g(i,e)||n||""},S=function(e,t,n){var r,i=[_(t)],o=s.appFallbackKeys.getTabKey(t);return o&&i.push(o),g(i,e)||n||""};n.translationTabLabel=S;var D=function(e,t,r){r.label=w(e,t,r.label||r.name),r.description=k(e,t,r.description),i.each(r.tab_groups,(function(i,o){r.tab_groups[o].id=i.id||i.group_name,r.tab_groups[o].group_name=(0,n.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,n.translationMenus)(e,r.admin_menus)};n.translationApp=D;var E=function(e,t){i.each(t,(function(t){var n=x(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationMenus=E;var A=function(e,t){i.each(t,(function(t,r){(0,n.translationApp)(e,r,t)}))};n.translationApps=A;var C=function(e,t,n){var r=a(n),o={};return o[b(t)]=w(e,t,r.label||r.name),o[m(t)]=k(e,t,r.description),i.each(r.admin_menus,(function(t){o[y(t._id)]=x(e,t._id,t.label||t.name)})),o};n.getAppTranslationTemplate=C;var M=function(e,t,n){i.isArray(n)?i.each(n,(function(e){M(e,"",e)})):n&&i.each(i.keys(n),(function(r){var o=t?"".concat(t,".").concat(r):r,s=n[r];"object"==typeof s?i.isArray(s)?i.each(s,(function(e){M(e,o,s)})):M(e,o,s):e[o]=s}))};function O(e){for(var t in e)"object"==typeof e[t]&&M(e,t,e[t]);return e}n.convertTranslationData=O;var T=function(e){var t=a(e),n={};return i.each(t.CustomApplications,(function(e,t){n[b(t)]=e.name,n[m(t)]=e.description,i.each(e.groups,(function(e,r){n[v(t,r)]=e}))})),i.each(t.CustomTabs,(function(e,t){n[_(t)]=e})),i.each(t.CustomLabels,(function(e,t){var r;if("simpleschema"!=t&&i.isObject(e)){var o=O(((r={})[t]=e,r));i.each(o,(function(e,t){i.isObject(e)||(n[p(t)]=e)}))}else n[p(t)]=e})),n};n.convertTranslation=T;var B=function(e){i.each(e,(function(e){var t=(0,n.convertTranslation)(e.data);(0,r.addResourceBundle)(e.lng,u,t,!0,!0)}))};n.addTranslations=B},templates:{"objectTranslation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getObjectMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]="help"===e?t.inlineHelpText||"":t[e]||""})),n}function a(e){return s(["label","description"],e)}function u(e){switch(e.type){case"select":return s(["label","help","options","description"],e);default:return s(["label","help","description"],e)}}function f(e){return s(["label"],e)}function c(e){return s(["label"],e)}function l(e){var t={};return r.each(e,(function(e,n){t[n]=u(e)})),t}function h(e){var t={};return r.each(e,(function(e,n){t[n]=c(e)})),t}function d(e){var t={};return r.each(e,(function(e,n){t[n]=f(e)})),t}function p(e,t){var n={};return r.each(e,(function(e,r){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");n[i]=t[r].group}})),n}var g=function(e,t,n,s){void 0===s&&(s=!1);var u=o(n);1!=s&&(0,i.translationObject)(e,t,u,!0,s);var f=Object.assign({},a(u));f=Object.assign({},f,{fields:l(u.fields)});var c=p(n.fields,u.fields);r.isEmpty(c)||(f=Object.assign({},f,{groups:c}));var g=d(u.list_views);r.isEmpty(g)||(f=Object.assign({},f,{listviews:g}));var b=h(u.actions);return r.isEmpty(b)||(f=Object.assign({},f,{actions:b})),Object.assign({name:t},f)};n.getObjectMetadataTranslationTemplate=g},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getAppMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]=t[e]||""})),n}function a(e){var t={groups:{}};return e?(r.each(e,(function(e){var n=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[n]=e.group_name})),t):{}}var u=function(e){return Object.assign({},s(["name","description"],e),a(e.tab_groups))},f=function(e){var t={};return r.each(e,(function(e,n){t[n]=n})),t},c=function(e){var t={};return r.each(e,(function(e){var n=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[n]=e})),t},l=function(e,t,n){var r,s=o(n);(0,i.translationApp)(e,t,s);var a={},l;return s.tab_items?a=f(s.tab_items):s.tabs&&(a=c(s.tabs)),Object.assign({},{CustomApplications:(r={},r[t]=u(s),r)},{CustomTabs:a})};n.getAppMetadataTranslationTemplate=l}}}},node_modules:{i18next:{"package.json":function e(t,n,e){e.exports={name:"i18next",version:"19.9.2",module:"./dist/esm/i18next.js",main:"./dist/cjs/i18next.js"}},dist:{esm:{"i18next.js":function e(t,n,e){let r,i,o,s,a,u,f,c;e.link("@babel/runtime/helpers/esm/typeof",{default(e){r=e}},0),e.link("@babel/runtime/helpers/esm/objectSpread",{default(e){i=e}},1),e.link("@babel/runtime/helpers/esm/classCallCheck",{default(e){o=e}},2),e.link("@babel/runtime/helpers/esm/createClass",{default(e){s=e}},3),e.link("@babel/runtime/helpers/esm/possibleConstructorReturn",{default(e){a=e}},4),e.link("@babel/runtime/helpers/esm/getPrototypeOf",{default(e){u=e}},5),e.link("@babel/runtime/helpers/esm/assertThisInitialized",{default(e){f=e}},6),e.link("@babel/runtime/helpers/esm/inherits",{default(e){c=e}},7);var l={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,n){console&&console[t]&&console[t].apply(console,n)}},h,d=new(function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.init(t,n)}return s(e,[{key:"init",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||l,this.options=n,this.debug=n.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,n=new Array(t),r=0;r1?n-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var s=r(o.shift());!e[s]&&n&&(e[s]=new n),e=Object.prototype.hasOwnProperty.call(e,s)?e[s]:{}}return i()?{}:{obj:e,k:r(o.shift())}}function y(e,t,n){var r=v(e,t,Object),i,o;r.obj[r.k]=n}function _(e,t,n,r){var i=v(e,t,Object),o=i.obj,s=i.k;o[s]=o[s]||[],r&&(o[s]=o[s].concat(n)),r||o[s].push(n)}function w(e,t){var n=v(e,t),r=n.obj,i=n.k;if(r)return r[i]}function k(e,t,n){var r=w(e,n);return void 0!==r?r:w(t,n)}function j(e,t,n){for(var r in t)"__proto__"!==r&&"constructor"!==r&&(r in e?"string"==typeof e[r]||e[r]instanceof String||"string"==typeof t[r]||t[r]instanceof String?n&&(e[r]=t[r]):j(e[r],t[r],n):e[r]=t[r]);return e}function x(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var S={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function D(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return S[e]})):e}var E="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,A=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),n.data=e||{},n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n}return c(t,e),s(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,s=[t,n];return r&&"string"!=typeof r&&(s=s.concat(r)),r&&"string"==typeof r&&(s=s.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(s=t.split(".")),w(this.data,s)}},{key:"addResource",value:function e(t,n,r,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},s=this.options.keySeparator;void 0===s&&(s=".");var a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(i=n,n=(a=t.split("."))[1]),this.addNamespaces(n),y(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}},{key:"addResources",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in r)"string"!=typeof r[o]&&"[object Array]"!==Object.prototype.toString.apply(r[o])||this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}},{key:"addResourceBundle",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},u=[t,n];t.indexOf(".")>-1&&(o=r,r=n,n=(u=t.split("."))[1]),this.addNamespaces(n);var f=w(this.data,u)||{};o?j(f,r,s):f=i({},f,r),y(this.data,u,f),a.silent||this.emit("added",t,n,r)}},{key:"removeResourceBundle",value:function e(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}},{key:"hasResourceBundle",value:function e(t,n){return void 0!==this.getResource(t,n)}},{key:"getResourceBundle",value:function e(t,n){return n||(n=this.options.defaultNS),"v1"===this.options.compatibilityAPI?i({},{},this.getResource(t,n)):this.getResource(t,n)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(p),C={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,n,r,i,o){var s=this;return t.forEach((function(e){s.processors[e]&&(n=s.processors[e].process(n,r,i,o))})),n}},M={},O=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),m(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,f(n)),n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n.logger=d.create("translator"),n}return c(t,e),s(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},r=this.resolve(t,n);return r&&void 0!==r.res}},{key:"extractFromKey",value:function e(t,n){var r=void 0!==n.nsSeparator?n.nsSeparator:this.options.nsSeparator;void 0===r&&(r=":");var i=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,o=n.ns||this.options.defaultNS;if(r&&t.indexOf(r)>-1){var s=t.match(this.interpolator.nestingRegexp);if(s&&s.length>0)return{key:t,namespaces:o};var a=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(a[0])>-1)&&(o=a.shift()),t=a.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(n,o,s){var a=this;if("object"!==r(o)&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),null==n)return"";Array.isArray(n)||(n=[String(n)]);var u=void 0!==o.keySeparator?o.keySeparator:this.options.keySeparator,f=this.extractFromKey(n[n.length-1],o),c=f.key,l=f.namespaces,h=l[l.length-1],d=o.lng||this.language,p=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d&&"cimode"===d.toLowerCase()){if(p){var g=o.nsSeparator||this.options.nsSeparator;return h+g+c}return c}var b=this.resolve(n,o),m=b&&b.res,v=b&&b.usedKey||c,y=b&&b.exactUsedKey||c,_=Object.prototype.toString.apply(m),w=["[object Number]","[object Function]","[object RegExp]"],k=void 0!==o.joinArrays?o.joinArrays:this.options.joinArrays,j=!this.i18nFormat||this.i18nFormat.handleAsObject,x="string"!=typeof m&&"boolean"!=typeof m&&"number"!=typeof m;if(j&&m&&x&&w.indexOf(_)<0&&("string"!=typeof k||"[object Array]"!==_)){if(!o.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,m,o):"key '".concat(c," (").concat(this.language,")' returned an object instead of string.");if(u){var S="[object Array]"===_,D=S?[]:{},E=S?y:v;for(var A in m)if(Object.prototype.hasOwnProperty.call(m,A)){var C="".concat(E).concat(u).concat(A);D[A]=this.translate(C,i({},o,{joinArrays:!1,ns:l})),D[A]===C&&(D[A]=m[A])}m=D}}else if(j&&"string"==typeof k&&"[object Array]"===_)(m=m.join(k))&&(m=this.extendTranslation(m,n,o,s));else{var M=!1,O=!1,T=void 0!==o.count&&"string"!=typeof o.count,B=t.hasDefaultValue(o),I=T?this.pluralResolver.getSuffix(d,o.count):"",R=o["defaultValue".concat(I)]||o.defaultValue;!this.isValidLookup(m)&&B&&(M=!0,m=R),this.isValidLookup(m)||(O=!0,m=c);var F=B&&R!==m&&this.options.updateMissing;if(O||M||F){if(this.logger.log(F?"updateKey":"missingKey",d,h,c,F?R:m),u){var P=this.resolve(c,i({},o,{keySeparator:!1}));P&&P.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var N=[],L=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if("fallback"===this.options.saveMissingTo&&L&&L[0])for(var z=0;z1&&void 0!==arguments[1]?arguments[1]:{},i,o,s,a,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!n.isValidLookup(i)){var t=n.extractFromKey(e,r),f=t.key;o=f;var c=t.namespaces;n.options.fallbackNS&&(c=c.concat(n.options.fallbackNS));var l=void 0!==r.count&&"string"!=typeof r.count,h=void 0!==r.context&&"string"==typeof r.context&&""!==r.context,d=r.lngs?r.lngs:n.languageUtils.toResolveHierarchy(r.lng||n.language,r.fallbackLng);c.forEach((function(e){n.isValidLookup(i)||(u=e,!M["".concat(d[0],"-").concat(e)]&&n.utils&&n.utils.hasLoadedNamespace&&!n.utils.hasLoadedNamespace(u)&&(M["".concat(d[0],"-").concat(e)]=!0,n.logger.warn('key "'.concat(o,'" for languages "').concat(d.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),d.forEach((function(t){if(!n.isValidLookup(i)){a=t;var o=f,u=[o],c,d;if(n.i18nFormat&&n.i18nFormat.addLookupKeys)n.i18nFormat.addLookupKeys(u,f,t,e,r);else l&&(c=n.pluralResolver.getSuffix(t,r.count)),l&&h&&u.push(o+c),h&&u.push(o+="".concat(n.options.contextSeparator).concat(r.context)),l&&u.push(o+=c);for(;d=u.pop();)n.isValidLookup(i)||(s=d,i=n.getResource(t,e,d,r))}})))}))}})),{res:i,usedKey:o,exactUsedKey:s,usedLng:a,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}}],[{key:"hasDefaultValue",value:function e(t){var n="defaultValue";for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&void 0!==t[r])return!0;return!1}}]),t}(p);function T(e){return e.charAt(0).toUpperCase()+e.slice(1)}var B=function(){function e(t){o(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=d.create("languageUtils")}return s(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var n=t.split("-");return 2===n.length?null:(n.pop(),"x"===n[n.length-1].toLowerCase()?null:this.formatLanguageCode(n.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var n=t.split("-");return this.formatLanguageCode(n[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var n=["hans","hant","latn","cyrl","cans","mong","arab"],r=t.split("-");return this.options.lowerCaseLng?r=r.map((function(e){return e.toLowerCase()})):2===r.length?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase()))):3===r.length&&(r[0]=r[0].toLowerCase(),2===r[1].length&&(r[1]=r[1].toUpperCase()),"sgn"!==r[0]&&2===r[2].length&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=T(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var n=this,r;return t?(t.forEach((function(e){if(!r){var t=n.formatLanguageCode(e);n.options.supportedLngs&&!n.isSupportedCode(t)||(r=t)}})),!r&&this.options.supportedLngs&&t.forEach((function(e){if(!r){var t=n.getLanguagePartFromCode(e);if(n.isSupportedCode(t))return r=t;r=n.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r):null}},{key:"getFallbackCodes",value:function e(t,n){if(!t)return[];if("function"==typeof t&&(t=t(n)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!n)return t.default||[];var r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}},{key:"toResolveHierarchy",value:function e(t,n){var r=this,i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),o=[],s=function e(t){t&&(r.isSupportedCode(t)?o.push(t):r.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&s(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&s(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&s(this.getLanguagePartFromCode(t))):"string"==typeof t&&s(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&s(r.formatLanguageCode(e))})),o}}]),e}(),I=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],R={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function F(){var e={};return I.forEach((function(t){t.lngs.forEach((function(n){e[n]={numbers:t.nr,plurals:R[t.fc]}}))})),e}var P=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.languageUtils=t,this.options=n,this.logger=d.create("pluralResolver"),this.rules=F()}return s(e,[{key:"addRule",value:function e(t,n){this.rules[t]=n}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var n=this.getRule(t);return n&&n.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,n){return this.getSuffixes(t).map((function(e){return n+e}))}},{key:"getSuffixes",value:function e(t){var n=this,r=this.getRule(t);return r?r.numbers.map((function(e){return n.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,n){var r=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(n):i.plurals(Math.abs(n)),s=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===s?s="plural":1===s&&(s=""));var a=function e(){return r.options.prepend&&s.toString()?r.options.prepend+s.toString():s.toString()};return"v1"===this.options.compatibilityJSON?1===s?"":"number"==typeof s?"_plural_".concat(s.toString()):a():"v2"===this.options.compatibilityJSON?a():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?a():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),N=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o(this,e),this.logger=d.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return s(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var n=t.interpolation;this.escape=void 0!==n.escape?n.escape:D,this.escapeValue=void 0===n.escapeValue||n.escapeValue,this.useRawValueToEscape=void 0!==n.useRawValueToEscape&&n.useRawValueToEscape,this.prefix=n.prefix?x(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?x(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?x(n.nestingPrefix):n.nestingPrefixEscaped||x("$t("),this.nestingSuffix=n.nestingSuffix?x(n.nestingSuffix):n.nestingSuffixEscaped||x(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=void 0!==n.alwaysFormat&&n.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var n="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(n,"g");var r="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(r,"g")}},{key:"interpolate",value:function e(t,n,r,i){var o=this,s,a,u,f=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function c(e){return e.replace(/\$/g,"$$$$")}var l=function e(t){if(t.indexOf(o.formatSeparator)<0){var s=k(n,f,t);return o.alwaysFormat?o.format(s,void 0,r):s}var a=t.split(o.formatSeparator),u=a.shift().trim(),c=a.join(o.formatSeparator).trim();return o.format(k(n,f,u),c,r,i)};this.resetRegExp();var h=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,d=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return c(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?c(o.escape(t)):c(t)}}].forEach((function(e){for(u=0;s=e.regex.exec(t);){if(void 0===(a=l(s[1].trim())))if("function"==typeof h){var n=h(t,s,i);a="string"==typeof n?n:""}else{if(d){a=s[0];continue}o.logger.warn("missed to pass in variable ".concat(s[1]," for interpolating ").concat(t)),a=""}else"string"==typeof a||o.useRawValueToEscape||(a=b(a));if(t=t.replace(s[0],e.safeValue(a)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,n){var r=this,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s,a,u=i({},o);function f(e,t){var n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;var r=e.split(new RegExp("".concat(n,"[ ]*{"))),o="{".concat(r[1]);e=r[0],o=(o=this.interpolate(o,u)).replace(/'/g,'"');try{u=JSON.parse(o),t&&(u=i({},t,u))}catch(s){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),s),"".concat(e).concat(n).concat(o)}return delete u.defaultValue,e}for(u.applyPostProcessor=!1,delete u.defaultValue;s=this.nestingRegexp.exec(t);){var c=[],l=!1;if(s[0].includes(this.formatSeparator)&&!/{.*}/.test(s[1])){var h=s[1].split(this.formatSeparator).map((function(e){return e.trim()}));s[1]=h.shift(),c=h,l=!0}if((a=n(f.call(this,s[1].trim(),u),u))&&s[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=b(a)),a||(this.logger.warn("missed to resolve ".concat(s[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return r.format(e,t,o.lng,o)}),a.trim())),t=t.replace(s[0],a),this.regexp.lastIndex=0}return t}}]),e}();function L(e,t){for(var n=e.indexOf(t);-1!==n;)e.splice(n,1),n=e.indexOf(t)}var z=function(e){function t(e,n,r){var i,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return o(this,t),i=a(this,u(t).call(this)),E&&p.call(f(i)),i.backend=e,i.store=n,i.services=r,i.languageUtils=r.languageUtils,i.options=s,i.logger=d.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(r,s.backend,s),i}return c(t,e),s(t,[{key:"queueLoad",value:function e(t,n,r,i){var o=this,s=[],a=[],u=[],f=[];return t.forEach((function(e){var t=!0;n.forEach((function(n){var i="".concat(e,"|").concat(n);!r.reload&&o.store.hasResourceBundle(e,n)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?a.indexOf(i)<0&&a.push(i):(o.state[i]=1,t=!1,a.indexOf(i)<0&&a.push(i),s.indexOf(i)<0&&s.push(i),f.indexOf(n)<0&&f.push(n)))})),t||u.push(e)})),(s.length||a.length)&&this.queue.push({pending:a,loaded:{},errors:[],callback:i}),{toLoad:s,pending:a,toLoadLanguages:u,toLoadNamespaces:f}}},{key:"loaded",value:function e(t,n,r){var i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;var e={};this.queue.forEach((function(r){_(r.loaded,[o],s),L(r.pending,t),n&&r.errors.push(n),0!==r.pending.length||r.done||(Object.keys(r.loaded).forEach((function(t){e[t]||(e[t]=[]),r.loaded[t].length&&r.loaded[t].forEach((function(n){e[t].indexOf(n)<0&&e[t].push(n)}))})),r.done=!0,r.errors.length?r.callback(r.errors):r.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,a=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[r](t,n,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,n,r,o+1,2*s,a)}),s):a(e,u)})):a(null,{})}},{key:"prepareLoading",value:function e(t,n){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof n&&(n=[n]);var s=this.queueLoad(t,n,i,o);if(!s.toLoad.length)return s.pending.length||o(),null;s.toLoad.forEach((function(e){r.loadOne(e)}))}},{key:"load",value:function e(t,n,r){this.prepareLoading(t,n,{},r)}},{key:"reload",value:function e(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}},{key:"loadOne",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],s=i[1];this.read(o,s,"read",void 0,void 0,(function(e,i){e&&n.logger.warn("".concat(r,"loading namespace ").concat(s," for language ").concat(o," failed"),e),!e&&i&&n.logger.log("".concat(r,"loaded namespace ").concat(s," for language ").concat(o),i),n.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)?this.logger.warn('did not save key "'.concat(r,'" as the namespace "').concat(n,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=r&&""!==r&&(this.backend&&this.backend.create&&this.backend.create(t,n,r,o,null,i({},a,{isUpdate:s})),t&&t[0]&&this.store.addResource(t[0],n,r,o))}}]),t}(p);function U(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var n={};if("object"===r(t[1])&&(n=t[1]),"string"==typeof t[1]&&(n.defaultValue=t[1]),"string"==typeof t[2]&&(n.tDescription=t[2]),"object"===r(t[2])||"object"===r(t[3])){var i=t[3]||t[2];Object.keys(i).forEach((function(e){n[e]=i[e]}))}return n},interpolation:{escapeValue:!0,format:function e(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function q(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function $(){}var W,H=new(function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(o(this,t),e=a(this,u(t).call(this)),E&&p.call(f(e)),e.options=q(n),e.services={},e.logger=d,e.modules={external:[]},r&&!e.isInitialized&&!n.isClone){if(!e.options.initImmediate)return e.init(n,r),a(e,f(e));setTimeout((function(){e.init(n,r)}),0)}return e}return c(t,e),s(t,[{key:"init",value:function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;function o(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof n&&(r=n,n={}),n.whitelist&&!n.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),n.nonExplicitWhitelist&&!n.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=i({},U(),this.options,q(n)),this.format=this.options.interpolation.format,r||(r=$),!this.options.isClone){this.modules.logger?d.init(o(this.modules.logger),this.options):d.init(null,this.options);var s=new B(this.options);this.store=new A(this.options.resources,this.options);var a=this.services;a.logger=d,a.resourceStore=this.store,a.languageUtils=s,a.pluralResolver=new P(s,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new N(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new z(o(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i1?n-1:0),i=1;i0&&"dev"!==u[0]&&(this.options.lng=u[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var f=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];f.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments),t}}));var l=g(),h=function e(){var n=function e(n,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),r(n,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return n(null,t.t.bind(t));t.changeLanguage(t.options.lng,n)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),l}},{key:"loadResources",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,i=r,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var s=[],a=function e(t){var r;t&&n.services.languageUtils.toResolveHierarchy(t).forEach((function(e){s.indexOf(e)<0&&s.push(e)}))};if(o)a(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return a(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return a(e)})),this.services.backendConnector.load(s,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,n,r){var i=g();return t||(t=this.languages),n||(n=this.options.ns),r||(r=$),this.services.backendConnector.reload(t,n,(function(e){i.resolve(),r(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&C.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,n){var r=this;this.isLanguageChangingTo=t;var i=g();this.emit("languageChanging",t);var o=function e(t,o){o?(r.language=o,r.languages=r.services.languageUtils.toResolveHierarchy(o),r.translator.changeLanguage(o),r.isLanguageChangingTo=void 0,r.emit("languageChanged",o),r.logger.log("languageChanged",o)):r.isLanguageChangingTo=void 0,i.resolve((function(){return r.t.apply(r,arguments)})),n&&n(t,(function(){return r.t.apply(r,arguments)}))},s=function e(t){var n="string"==typeof t?t:r.services.languageUtils.getBestMatchFromCodes(t);n&&(r.language||(r.language=n,r.languages=r.services.languageUtils.toResolveHierarchy(n)),r.translator.language||r.translator.changeLanguage(n),r.services.languageDetector&&r.services.languageDetector.cacheUserLanguage(n)),r.loadResources(n,(function(e){o(e,n)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(s):s(t):s(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,n){var o=this,s=function e(t,n){var s;if("object"!==r(n)){for(var a=arguments.length,u=new Array(a>2?a-2:0),f=2;f1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,s=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var a=function e(t,r){var i=n.services.backendConnector.state["".concat(t,"|").concat(r)];return-1===i||2===i};if(r.precheck){var u=r.precheck(this,a);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!a(i,t)||o&&!a(s,t)))}},{key:"loadNamespaces",value:function e(t,n){var r=this,i=g();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){r.options.ns.indexOf(e)<0&&r.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),n&&n(e)})),i):(n&&n(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,n){var r=g();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){r.resolve(),n&&n(e)})),r):(n&&n(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var n}},{key:"createInstance",value:function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;return new t(n,r)}},{key:"cloneInstance",value:function e(){var n=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,s=i({},this.options,r,{isClone:!0}),a=new t(s),u=["store","services","language"];return u.forEach((function(e){a[e]=n[e]})),a.services=i({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new O(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rr,root:()=>i,ArrayProto:()=>o,ObjProto:()=>s,SymbolProto:()=>a,push:()=>u,slice:()=>f,toString:()=>c,hasOwnProperty:()=>l,supportsArrayBuffer:()=>h,supportsDataView:()=>d,nativeIsArray:()=>p,nativeKeys:()=>g,nativeCreate:()=>b,nativeIsView:()=>m,_isNaN:()=>v,_isFinite:()=>y,hasEnumBug:()=>_,nonEnumerableProps:()=>w,MAX_ARRAY_INDEX:()=>k});var r="1.13.4",i="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},o=Array.prototype,s=Object.prototype,a="undefined"!=typeof Symbol?Symbol.prototype:null,u=o.push,f=o.slice,c=s.toString,l=s.hasOwnProperty,h="undefined"!=typeof ArrayBuffer,d="undefined"!=typeof DataView,p=Array.isArray,g=Object.keys,b=Object.create,m=h&&ArrayBuffer.isView,v=isNaN,y=isFinite,_=!{toString:null}.propertyIsEnumerable("toString"),w=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=Math.pow(2,53)-1},"restArguments.js":function e(t,n,e){function r(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;ir})},"isObject.js":function e(t,n,e){function r(e){var t=typeof e;return"function"===t||"object"===t&&!!e}e.export({default:()=>r})},"isNull.js":function e(t,n,e){function r(e){return null===e}e.export({default:()=>r})},"isUndefined.js":function e(t,n,e){function r(e){return void 0===e}e.export({default:()=>r})},"isBoolean.js":function e(t,n,e){let r;function i(e){return!0===e||!1===e||"[object Boolean]"===r.call(e)}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isElement.js":function e(t,n,e){function r(e){return!(!e||1!==e.nodeType)}e.export({default:()=>r})},"isString.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("String"))},"_tagTester.js":function e(t,n,e){let r;function i(e){var t="[object "+e+"]";return function(e){return r.call(e)===t}}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isNumber.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Number"))},"isDate.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Date"))},"isRegExp.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("RegExp"))},"isError.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Error"))},"isSymbol.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Symbol"))},"isArrayBuffer.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("ArrayBuffer"))},"isDataView.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isArrayBuffer.js",{default(e){o=e}},2),e.link("./_stringTagBug.js",{hasStringTagBug(e){s=e}},3);var a=r("DataView");function u(e){return null!=e&&i(e.getInt8)&&o(e.buffer)}e.exportDefault(s?u:a)},"isFunction.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_setup.js",{root(e){i=e}},1);var o=r("Function"),s=i.document&&i.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof s&&(o=function(e){return"function"==typeof e||!1}),e.exportDefault(o)},"_stringTagBug.js":function e(t,n,e){let r,i;e.export({hasStringTagBug:()=>o,isIE11:()=>s}),e.link("./_setup.js",{supportsDataView(e){r=e}},0),e.link("./_hasObjectTag.js",{default(e){i=e}},1);var o=r&&i(new DataView(new ArrayBuffer(8))),s="undefined"!=typeof Map&&i(new Map)},"_hasObjectTag.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Object"))},"isArray.js":function e(t,n,e){let r,i;e.link("./_setup.js",{nativeIsArray(e){r=e}},0),e.link("./_tagTester.js",{default(e){i=e}},1),e.exportDefault(r||i("Array"))},"isArguments.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1);var o=r("Arguments");!function(){o(arguments)||(o=function(e){return i(e,"callee")})}(),e.exportDefault(o)},"_has.js":function e(t,n,e){let r;function i(e,t){return null!=e&&r.call(e,t)}e.export({default:()=>i}),e.link("./_setup.js",{hasOwnProperty(e){r=e}},0)},"isFinite.js":function e(t,n,e){let r,i;function o(e){return!i(e)&&r(e)&&!isNaN(parseFloat(e))}e.export({default:()=>o}),e.link("./_setup.js",{_isFinite(e){r=e}},0),e.link("./isSymbol.js",{default(e){i=e}},1)},"isNaN.js":function e(t,n,e){let r,i;function o(e){return i(e)&&r(e)}e.export({default:()=>o}),e.link("./_setup.js",{_isNaN(e){r=e}},0),e.link("./isNumber.js",{default(e){i=e}},1)},"isTypedArray.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./_setup.js",{supportsArrayBuffer(e){r=e},nativeIsView(e){i=e},toString(e){o=e}},0),e.link("./isDataView.js",{default(e){s=e}},1),e.link("./constant.js",{default(e){a=e}},2),e.link("./_isBufferLike.js",{default(e){u=e}},3);var f=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function c(e){return i?i(e)&&!s(e):u(e)&&f.test(o.call(e))}e.exportDefault(r?c:a(!1))},"constant.js":function e(t,n,e){function r(e){return function(){return e}}e.export({default:()=>r})},"_isBufferLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getByteLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createSizePropertyCheck.js":function e(t,n,e){let r;function i(e){return function(t){var n=e(t);return"number"==typeof n&&n>=0&&n<=r}}e.export({default:()=>i}),e.link("./_setup.js",{MAX_ARRAY_INDEX(e){r=e}},0)},"_getByteLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("byteLength"))},"_shallowProperty.js":function e(t,n,e){function r(e){return function(t){return null==t?void 0:t[e]}}e.export({default:()=>r})},"isEmpty.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(null==e)return!0;var t=r(e);return"number"==typeof t&&(i(e)||o(e)||s(e))?0===t:0===r(a(e))}e.export({default:()=>u}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3),e.link("./keys.js",{default(e){a=e}},4)},"_getLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("length"))},"keys.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(!r(e))return[];if(i)return i(e);var t=[];for(var n in e)s(e,n)&&t.push(n);return o&&a(e,t),t}e.export({default:()=>u}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeKeys(e){i=e},hasEnumBug(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2),e.link("./_collectNonEnumProps.js",{default(e){a=e}},3)},"_collectNonEnumProps.js":function e(t,n,e){let r,i,o,s;function a(e){for(var t={},n=e.length,r=0;ru}),e.link("./_setup.js",{nonEnumerableProps(e){r=e},ObjProto(e){i=e}},0),e.link("./isFunction.js",{default(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2)},"isMatch.js":function e(t,n,e){let r;function i(e,t){var n=r(t),i=n.length;if(null==e)return!i;for(var o=Object(e),s=0;si}),e.link("./keys.js",{default(e){r=e}},0)},"isEqual.js":function e(t,n,e){let r,i,o,s,a,u,f,c,l,h,d;e.export({default:()=>m}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_setup.js",{toString(e){i=e},SymbolProto(e){o=e}},1),e.link("./_getByteLength.js",{default(e){s=e}},2),e.link("./isTypedArray.js",{default(e){a=e}},3),e.link("./isFunction.js",{default(e){u=e}},4),e.link("./_stringTagBug.js",{hasStringTagBug(e){f=e}},5),e.link("./isDataView.js",{default(e){c=e}},6),e.link("./keys.js",{default(e){l=e}},7),e.link("./_has.js",{default(e){h=e}},8),e.link("./_toBufferView.js",{default(e){d=e}},9);var p="[object DataView]";function g(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return!1;if(e!=e)return t!=t;var i=typeof e;return("function"===i||"object"===i||"object"==typeof t)&&b(e,t,n,r)}function b(e,t,n,m){e instanceof r&&(e=e._wrapped),t instanceof r&&(t=t._wrapped);var v=i.call(e);if(v!==i.call(t))return!1;if(f&&"[object Object]"==v&&c(e)){if(!c(t))return!1;v=p}switch(v){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object Symbol]":return o.valueOf.call(e)===o.valueOf.call(t);case"[object ArrayBuffer]":case p:return b(d(e),d(t),n,m)}var y="[object Array]"===v;if(!y&&a(e)){var _;if(s(e)!==s(t))return!1;if(e.buffer===t.buffer&&e.byteOffset===t.byteOffset)return!0;y=!0}if(!y){if("object"!=typeof e||"object"!=typeof t)return!1;var w=e.constructor,k=t.constructor;if(w!==k&&!(u(w)&&w instanceof w&&u(k)&&k instanceof k)&&"constructor"in e&&"constructor"in t)return!1}m=m||[];for(var j=(n=n||[]).length;j--;)if(n[j]===e)return m[j]===t;if(n.push(e),m.push(t),y){if((j=e.length)!==t.length)return!1;for(;j--;)if(!g(e[j],t[j],n,m))return!1}else{var x=l(e),S;if(j=x.length,l(t).length!==j)return!1;for(;j--;)if(S=x[j],!h(t,S)||!g(e[S],t[S],n,m))return!1}return n.pop(),m.pop(),!0}function m(e,t){return g(e,t)}},"underscore.js":function e(t,n,e){let r;function i(e){return e instanceof i?e:this instanceof i?void(this._wrapped=e):new i(e)}e.export({default:()=>i}),e.link("./_setup.js",{VERSION(e){r=e}},0),i.VERSION=r,i.prototype.value=function(){return this._wrapped},i.prototype.valueOf=i.prototype.toJSON=i.prototype.value,i.prototype.toString=function(){return String(this._wrapped)}},"_toBufferView.js":function e(t,n,e){let r;function i(e){return new Uint8Array(e.buffer||e,e.byteOffset||0,r(e))}e.export({default:()=>i}),e.link("./_getByteLength.js",{default(e){r=e}},0)},"isMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},mapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Map"))},"_methodFingerprint.js":function e(t,n,e){let r,i,o;function s(e){var t=r(e);return function(n){if(null==n)return!1;var s=o(n);if(r(s))return!1;for(var u=0;us,mapMethods:()=>l,weakMapMethods:()=>h,setMethods:()=>d}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./allKeys.js",{default(e){o=e}},2);var a="forEach",u="has",f=["clear","delete"],c=["get","has","set"],l=f.concat(a,c),h=f.concat(c),d=["add"].concat(f,a,"has")},"allKeys.js":function e(t,n,e){let r,i,o;function s(e){if(!r(e))return[];var t=[];for(var n in e)t.push(n);return i&&o(e,t),t}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{hasEnumBug(e){i=e}},1),e.link("./_collectNonEnumProps.js",{default(e){o=e}},2)},"isWeakMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},weakMapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("WeakMap"))},"isSet.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},setMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Set"))},"isWeakSet.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("WeakSet"))},"values.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"pairs.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"invert.js":function e(t,n,e){let r;function i(e){for(var t={},n=r(e),i=0,o=n.length;ii}),e.link("./keys.js",{default(e){r=e}},0)},"functions.js":function e(t,n,e){let r;function i(e){var t=[];for(var n in e)r(e[n])&&t.push(n);return t.sort()}e.export({default:()=>i}),e.link("./isFunction.js",{default(e){r=e}},0)},"extend.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createAssigner.js":function e(t,n,e){function r(e,t){return function(n){var r=arguments.length;if(t&&(n=Object(n)),r<2||null==n)return n;for(var i=1;ir})},"extendOwn.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"defaults.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i,!0))},"create.js":function e(t,n,e){let r,i;function o(e,t){var n=r(e);return t&&i(n,t),n}e.export({default:()=>o}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./extendOwn.js",{default(e){i=e}},1)},"_baseCreate.js":function e(t,n,e){let r,i;function o(){return function(){}}function s(e){if(!r(e))return{};if(i)return i(e);var t=function(){};t.prototype=e;var n=new t;return t.prototype=null,n}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeCreate(e){i=e}},1)},"clone.js":function e(t,n,e){let r,i,o;function s(e){return r(e)?i(e)?e.slice():o({},e):e}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./extend.js",{default(e){o=e}},2)},"tap.js":function e(t,n,e){function r(e,t){return t(e),e}e.export({default:()=>r})},"get.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=i(e,r(t));return o(s)?n:s}e.export({default:()=>s}),e.link("./_toPath.js",{default(e){r=e}},0),e.link("./_deepGet.js",{default(e){i=e}},1),e.link("./isUndefined.js",{default(e){o=e}},2)},"_toPath.js":function e(t,n,e){let r;function i(e){return r.toPath(e)}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./toPath.js")},"toPath.js":function e(t,n,e){let r,i;function o(e){return i(e)?e:[e]}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),r.toPath=o},"_deepGet.js":function e(t,n,e){function r(e,t){for(var n=t.length,r=0;rr})},"has.js":function e(t,n,e){let r,i;function o(e,t){for(var n=(t=i(t)).length,o=0;oo}),e.link("./_has.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"mapObject.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s=o.length,a={},u=0;uo}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"_cb.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r.iteratee!==o?r.iteratee(e,t):i(e,t,n)}e.export({default:()=>s}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),e.link("./iteratee.js",{default(e){o=e}},2)},"_baseIteratee.js":function e(t,n,e){let r,i,o,s,a,u,f;function c(e,t,n){return null==e?r:i(e)?f(e,t,n):o(e)&&!s(e)?a(e):u(e)}e.export({default:()=>c}),e.link("./identity.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isObject.js",{default(e){o=e}},2),e.link("./isArray.js",{default(e){s=e}},3),e.link("./matcher.js",{default(e){a=e}},4),e.link("./property.js",{default(e){u=e}},5),e.link("./_optimizeCb.js",{default(e){f=e}},6)},"identity.js":function e(t,n,e){function r(e){return e}e.export({default:()=>r})},"matcher.js":function e(t,n,e){let r,i;function o(e){return e=r({},e),function(t){return i(t,e)}}e.export({default:()=>o}),e.link("./extendOwn.js",{default(e){r=e}},0),e.link("./isMatch.js",{default(e){i=e}},1)},"property.js":function e(t,n,e){let r,i;function o(e){return e=i(e),function(t){return r(t,e)}}e.export({default:()=>o}),e.link("./_deepGet.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"_optimizeCb.js":function e(t,n,e){function r(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,o){return e.call(t,n,r,i,o)}}return function(){return e.apply(t,arguments)}}e.export({default:()=>r})},"iteratee.js":function e(t,n,e){let r,i;function o(e,t){return i(e,t,1/0)}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),r.iteratee=o},"noop.js":function e(t,n,e){function r(){}e.export({default:()=>r})},"propertyOf.js":function e(t,n,e){let r,i;function o(e){return null==e?r:function(t){return i(e,t)}}e.export({default:()=>o}),e.link("./noop.js",{default(e){r=e}},0),e.link("./get.js",{default(e){i=e}},1)},"times.js":function e(t,n,e){let r;function i(e,t,n){var i=Array(Math.max(0,e));t=r(t,n,1);for(var o=0;oi}),e.link("./_optimizeCb.js",{default(e){r=e}},0)},"random.js":function e(t,n,e){function r(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))}e.export({default:()=>r})},"now.js":function e(t,n,e){e.exportDefault(Date.now||function(){return(new Date).getTime()})},"escape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createEscaper.js":function e(t,n,e){let r;function i(e){var t=function(t){return e[t]},n="(?:"+r(e).join("|")+")",i=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":""+e,i.test(e)?e.replace(o,t):e}}e.export({default:()=>i}),e.link("./keys.js",{default(e){r=e}},0)},"_escapeMap.js":function e(t,n,e){e.exportDefault({"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"})},"unescape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_unescapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_unescapeMap.js":function e(t,n,e){let r,i;e.link("./invert.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"templateSettings.js":function e(t,n,e){let r;e.link("./underscore.js",{default(e){r=e}},0),e.exportDefault(r.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g})},"template.js":function e(t,n,e){let r,i;e.export({default:()=>c}),e.link("./defaults.js",{default(e){r=e}},0),e.link("./underscore.js",{default(e){i=e}},1),e.link("./templateSettings.js");var o=/(.)^/,s={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},a=/\\|'|\r|\n|\u2028|\u2029/g;function u(e){return"\\"+s[e]}var f=/^\s*(\w|\$)+\s*$/;function c(e,t,n){!t&&n&&(t=n),t=r({},t,i.templateSettings);var s=RegExp([(t.escape||o).source,(t.interpolate||o).source,(t.evaluate||o).source].join("|")+"|$","g"),c=0,l="__p+='";e.replace(s,(function(t,n,r,i,o){return l+=e.slice(c,o).replace(a,u),c=o+t.length,n?l+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?l+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(l+="';\n"+i+"\n__p+='"),t})),l+="';\n";var h=t.variable,d;if(h){if(!f.test(h))throw new Error("variable is not a bare identifier: "+h)}else l="with(obj||{}){\n"+l+"}\n",h="obj";l="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+l+"return __p;\n";try{d=new Function(h,"_",l)}catch(g){throw g.source=l,g}var p=function(e){return d.call(this,e,i)};return p.source="function("+h+"){\n"+l+"}",p}},"result.js":function e(t,n,e){let r,i;function o(e,t,n){var o=(t=i(t)).length;if(!o)return r(n)?n.call(e):n;for(var s=0;so}),e.link("./isFunction.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"uniqueId.js":function e(t,n,e){e.export({default:()=>i});var r=0;function i(e){var t=++r+"";return e?e+t:t}},"chain.js":function e(t,n,e){let r;function i(e){var t=r(e);return t._chain=!0,t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"partial.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_executeBound.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2);var s=r((function(e,t){var n=s.placeholder,r=function(){for(var o=0,s=t.length,a=Array(s),u=0;uo}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./isObject.js",{default(e){i=e}},1)},"bind.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_executeBound.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t,n){if(!i(e))throw new TypeError("Bind must be called on a function");var s=r((function(r){return o(e,s,t,this,n.concat(r))}));return s})))},"bindAll.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./bind.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t){var n=(t=i(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=o(e[r],e)}return e})))},"_flatten.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,u){if(u=u||[],t||0===t){if(t<=0)return u.concat(e)}else t=1/0;for(var f=u.length,c=0,l=r(e);c1)a(h,t-1,n,u),f=u.length;else for(var d=0,p=h.length;da}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&us}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isNaN.js",{default(e){o=e}},2)},"lastIndexOf.js":function e(t,n,e){let r,i;e.link("./findLastIndex.js",{default(e){r=e}},0),e.link("./_createIndexFinder.js",{default(e){i=e}},1),e.exportDefault(i(-1,r))},"find.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a=(r(e)?i:o)(e,t,n);if(void 0!==a&&-1!==a)return e[a]}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./findKey.js",{default(e){o=e}},2)},"findWhere.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./find.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"each.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a;if(t=r(t,n),i(e))for(s=0,a=e.length;ss}),e.link("./_optimizeCb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"map.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=Array(a),f=0;fs}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"reduce.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createReduce.js":function e(t,n,e){let r,i,o;function s(e){var t=function(t,n,o,s){var a=!r(t)&&i(t),u=(a||t).length,f=e>0?0:u-1;for(s||(o=t[a?a[f]:f],f+=e);f>=0&&f=3;return t(e,o(n,i,4),r,s)}}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2)},"reduceRight.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"filter.js":function e(t,n,e){let r,i;function o(e,t,n){var o=[];return t=r(t,n),i(e,(function(e,n,r){t(e,n,r)&&o.push(e)})),o}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"reject.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r(e,i(o(t)),n)}e.export({default:()=>s}),e.link("./filter.js",{default(e){r=e}},0),e.link("./negate.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2)},"every.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"some.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"contains.js":function e(t,n,e){let r,i,o;function s(e,t,n,s){return r(e)||(e=i(e)),("number"!=typeof n||s)&&(n=0),o(e,t,n)>=0}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./indexOf.js",{default(e){o=e}},2)},"invoke.js":function e(t,n,e){let r,i,o,s,a;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2),e.link("./_deepGet.js",{default(e){s=e}},3),e.link("./_toPath.js",{default(e){a=e}},4),e.exportDefault(r((function(e,t,n){var r,u;return i(t)?u=t:(t=a(t),r=t.slice(0,-1),t=t[t.length-1]),o(e,(function(e){var i=u;if(!i){if(r&&r.length&&(e=s(e,r)),null==e)return;i=e[t]}return null==i?i:i.apply(e,n)}))})))},"pluck.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./map.js",{default(e){r=e}},0),e.link("./property.js",{default(e){i=e}},1)},"where.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./filter.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"max.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=-1/0,u=-1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la&&(a=f);else t=o(t,n),s(e,(function(e,n,r){((c=t(e,n,r))>u||c===-1/0&&a===-1/0)&&(a=e,u=c)}));return a}e.export({default:()=>a}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"min.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=1/0,u=1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"shuffle.js":function e(t,n,e){let r;function i(e){return r(e,1/0)}e.export({default:()=>i}),e.link("./sample.js",{default(e){r=e}},0)},"sample.js":function e(t,n,e){let r,i,o,s,a;function u(e,t,n){if(null==t||n)return r(e)||(e=i(e)),e[s(e.length-1)];var u=a(e),f=o(u);t=Math.max(Math.min(t,f),0);for(var c=f-1,l=0;lu}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./random.js",{default(e){s=e}},3),e.link("./toArray.js",{default(e){a=e}},4)},"toArray.js":function e(t,n,e){let r,i,o,s,a,u,f;e.export({default:()=>l}),e.link("./isArray.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./_isArrayLike.js",{default(e){s=e}},3),e.link("./map.js",{default(e){a=e}},4),e.link("./identity.js",{default(e){u=e}},5),e.link("./values.js",{default(e){f=e}},6);var c=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function l(e){return e?r(e)?i.call(e):o(e)?e.match(c):s(e)?a(e,u):f(e):[]}},"sortBy.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=0;return t=r(t,n),i(o(e,(function(e,n,r){return{value:e,index:s++,criteria:t(e,n,r)}})).sort((function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||void 0===n)return 1;if(ns}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./pluck.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2)},"groupBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n].push(t):e[n]=[t]})))},"_group.js":function e(t,n,e){let r,i;function o(e,t){return function(n,o,s){var a=t?[[],[]]:{};return o=r(o,s),i(n,(function(t,r){var i=o(t,r,n);e(a,t,i)})),a}}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"indexBy.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n]=t})))},"countBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n]++:e[n]=1})))},"partition.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n?0:1].push(t)}),!0))},"size.js":function e(t,n,e){let r,i;function o(e){return null==e?0:r(e)?e.length:i(e).length}e.export({default:()=>o}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"pick.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2),e.link("./allKeys.js",{default(e){s=e}},3),e.link("./_keyInObj.js",{default(e){a=e}},4),e.link("./_flatten.js",{default(e){u=e}},5),e.exportDefault(r((function(e,t){var n={},r=t[0];if(null==e)return n;i(r)?(t.length>1&&(r=o(r,t[1])),t=s(e)):(r=a,t=u(t,!1,!1),e=Object(e));for(var f=0,c=t.length;fr})},"omit.js":function e(t,n,e){let r,i,o,s,a,u,f;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./negate.js",{default(e){o=e}},2),e.link("./map.js",{default(e){s=e}},3),e.link("./_flatten.js",{default(e){a=e}},4),e.link("./contains.js",{default(e){u=e}},5),e.link("./pick.js",{default(e){f=e}},6),e.exportDefault(r((function(e,t){var n=t[0],r;return i(n)?(n=o(n),t.length>1&&(r=t[1])):(t=s(a(t,!1,!1),String),n=function(e,n){return!u(t,n)}),f(e,n,r)})))},"first.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:r(e,e.length-t)}e.export({default:()=>i}),e.link("./initial.js",{default(e){r=e}},0)},"initial.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"last.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:r(e,Math.max(0,e.length-t))}e.export({default:()=>i}),e.link("./rest.js",{default(e){r=e}},0)},"rest.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,null==t||n?1:t)}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"compact.js":function e(t,n,e){let r;function i(e){return r(e,Boolean)}e.export({default:()=>i}),e.link("./filter.js",{default(e){r=e}},0)},"flatten.js":function e(t,n,e){let r;function i(e,t){return r(e,t,!1)}e.export({default:()=>i}),e.link("./_flatten.js",{default(e){r=e}},0)},"without.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./difference.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t){return i(e,t)})))},"difference.js":function e(t,n,e){let r,i,o,s;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./filter.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3),e.exportDefault(r((function(e,t){return t=i(t,!0,!0),o(e,(function(e){return!s(t,e)}))})))},"uniq.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,a){r(t)||(a=n,n=t,t=!1),null!=n&&(n=i(n,a));for(var u=[],f=[],c=0,l=o(e);ca}),e.link("./isBoolean.js",{default(e){r=e}},0),e.link("./_cb.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3)},"union.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./uniq.js",{default(e){i=e}},1),e.link("./_flatten.js",{default(e){o=e}},2),e.exportDefault(r((function(e){return i(o(e,!0,!0))})))},"intersection.js":function e(t,n,e){let r,i;function o(e){for(var t=[],n=arguments.length,o=0,s=r(e);oo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;ss}),e.link("./max.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.link("./pluck.js",{default(e){o=e}},2)},"zip.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./unzip.js",{default(e){i=e}},1),e.exportDefault(r(i))},"object.js":function e(t,n,e){let r;function i(e,t){for(var n={},i=0,o=r(e);ii}),e.link("./_getLength.js",{default(e){r=e}},0)},"range.js":function e(t,n,e){function r(e,t,n){null==t&&(t=e||0,e=0),n||(n=tr})},"chunk.js":function e(t,n,e){let r;function i(e,t){if(null==t||t<1)return[];for(var n=[],i=0,o=e.length;ii}),e.link("./_setup.js",{slice(e){r=e}},0)},"mixin.js":function e(t,n,e){let r,i,o,s,a;function u(e){return i(o(e),(function(t){var n=r[t]=e[t];r.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),a(this,n.apply(r,e))}})),r}e.export({default:()=>u}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./functions.js",{default(e){o=e}},2),e.link("./_setup.js",{push(e){s=e}},3),e.link("./_chainResult.js",{default(e){a=e}},4)},"_chainResult.js":function e(t,n,e){let r;function i(e,t){return e._chain?r(t).chain():t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"underscore-array-methods.js":function e(t,n,e){let r,i,o,s;e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./_setup.js",{ArrayProto(e){o=e}},2),e.link("./_chainResult.js",{default(e){s=e}},3),i(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=o[e];r.prototype[e]=function(){var n=this._wrapped;return null!=n&&(t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0]),s(this,n)}})),i(["concat","join","slice"],(function(e){var t=o[e];r.prototype[e]=function(){var e=this._wrapped;return null!=e&&(e=t.apply(e,arguments)),s(this,e)}})),e.exportDefault(r)}}}}},cachers:{"package.json":function e(t,n,e){e.exports={name:"@steedos/cachers",version:"2.7.4-beta.2",main:"lib/index.js"}},lib:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getCacherNames=n.clearCacher=n.getCacher=void 0;var r={},i=t("./memory"),o=t("./memory-lru"),s=function(e,t){return r[e]||(e.startsWith("lru.")?r[e]=new o.MemoryLRUCacher(t):r[e]=new i.MemoryCacher),r[e]};n.getCacher=s;var a=function(e){r[e]&&r[e].clear()};n.clearCacher=a;var u=function(){return Object.keys(r)};n.getCacherNames=u},"memory.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryCacher=void 0;var r=t("lodash"),i=function(){function e(){this.cache={}}return e.prototype.get=function(e){return this.cache[e]},e.prototype.delete=function(e){delete this.cache[e]},e.prototype.set=function(e,t){this.cache[e]=t},e.prototype.clear=function(){this.cache={}},e.prototype.keys=function(){return(0,r.keys)(this.cache)},e.prototype.values=function(){return(0,r.values)(this.cache)},e}();n.MemoryCacher=i},"memory-lru.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryLRUCacher=void 0;var r=t("lodash"),i=t("lru-cache"),o={max:5e3,ttl:null,keygen:null,maxParamsLength:null},s=function(){function e(e){this.opts=(0,r.defaultsDeep)(e,o),this.cache=new i({max:this.opts.max,maxAge:this.opts.ttl?1e3*this.opts.ttl:null,updateAgeOnGet:!!this.opts.ttl})}return e.prototype.get=function(e){return this.cache.get(e)},e.prototype.set=function(e,t,n){return this.cache.set(e,t,n)},e.prototype.delete=function(e){return this.cache.delete(e)},e.prototype.clear=function(){return this.cache.clear()},e.prototype.keys=function(){return this.cache.keys()},e.prototype.values=function(){return this.cache.values()},e}();n.MemoryLRUCacher=s}},node_modules:{"lru-cache":{"package.json":function e(t,n,e){e.exports={name:"lru-cache",version:"7.14.1",main:"index.js"}},"index.js":function e(t,n,e){const r="object"==typeof performance&&performance&&"function"==typeof performance.now?performance:Date,i="function"==typeof AbortController,o=i?AbortController:class e{constructor(){this.signal=new u}abort(){this.signal.dispatchEvent("abort")}},s="function"==typeof AbortSignal,a="function"==typeof o.AbortSignal,u=s?AbortSignal:a?o.AbortController:class e{constructor(){this.aborted=!1,this._listeners=[]}dispatchEvent(e){if("abort"===e){this.aborted=!0;const t={type:e,target:this};this.onabort(t),this._listeners.forEach(e=>e(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},f=new Set,c=(e,t)=>{const n=`LRU_CACHE_OPTION_${e}`;p(n)&&g(n,`${e} option`,`options.${t}`,_)},l=(e,t)=>{const n=`LRU_CACHE_METHOD_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} method`,`cache.${t}()`,i)}},h=(e,t)=>{const n=`LRU_CACHE_PROPERTY_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} property`,`cache.${t}`,i)}},d=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!f.has(e),g=(e,t,n,r)=>{f.add(e);const i=`The ${t} is deprecated. Please use ${n} instead.`;d(i,"DeprecationWarning",e,r)},b=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),m=e=>b(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=m(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class _{constructor(e={}){const{max:t=0,ttl:n,ttlResolution:r=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:s,allowStale:a,dispose:u,disposeAfter:l,noDisposeOnSet:h,noUpdateTTL:g,maxSize:v=0,maxEntrySize:w=0,sizeCalculation:k,fetchMethod:j,fetchContext:x,noDeleteOnFetchRejection:S,noDeleteOnStaleGet:D}=e,{length:E,maxAge:A,stale:C}=e instanceof _?{}:e;if(0!==t&&!b(t))throw new TypeError("max option must be a nonnegative integer");const M=t?m(t):Array;if(!M)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=w||this.maxSize,this.sizeCalculation=k||E,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=j||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=x,!this.fetchMethod&&void 0!==x)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new M(t),this.prev=new M(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof l?(this.disposeAfter=l,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!h,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!S,0!==this.maxEntrySize){if(0!==this.maxSize&&!b(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!b(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!a||!!C,this.noDeleteOnStaleGet=!!D,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!s,this.ttlResolution=b(r)||0===r?r:1,this.ttlAutopurge=!!i,this.ttl=n||A||0,this.ttl){if(!b(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){f.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";d(t,"UnboundedCacheWarning",e,_)}}C&&c("stale","allowStale"),A&&c("maxAge","ttl"),E&&c("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,n=r.now())=>{if(this.starts[e]=0!==t?n:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const n=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);n.unref&&n.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?r.now():0};let e=0;const t=()=>{const t=r.now();if(this.ttlResolution>0){e=t;const n=setTimeout(()=>e=0,this.ttlResolution);n.unref&&n.unref()}return t};this.getRemainingTTL=n=>{const r=this.keyMap.get(n);return void 0===r?0:0===this.ttls[r]||0===this.starts[r]?1/0:this.starts[r]+this.ttls[r]-(e||t())},this.isStale=n=>0!==this.ttls[n]&&0!==this.starts[n]&&(e||t())-this.starts[n]>this.ttls[n]}updateItemAge(e){}setItemTTL(e,t,n){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,n,r)=>{if(this.isBackgroundFetch(t))return 0;if(!b(n)){if(!r)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof r)throw new TypeError("sizeCalculation must be a function");if(n=r(t,e),!b(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return n},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,n,r){if(n||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const n of this.indexes())if(e(this.valList[n],this.keyList[n],this))return this.get(this.keyList[n],t)}forEach(e,t=this){for(const n of this.indexes())e.call(t,this.valList[n],this.keyList[n],this)}rforEach(e,t=this){for(const n of this.rindexes())e.call(t,this.valList[n],this.keyList[n],this)}get prune(){return l("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const n=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,s={value:o};if(this.ttls){s.ttl=this.ttls[t];const e=r.now()-this.starts[t];s.start=Math.floor(Date.now()-e)}this.sizes&&(s.size=this.sizes[t]),e.unshift([n,s])}return e}load(e){this.clear();for(const[t,n]of e){if(n.start){const e=Date.now()-n.start;n.start=r.now()-e}this.set(t,n.value,n)}}dispose(e,t,n){}set(e,t,{ttl:n=this.ttl,start:r,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:a=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,s),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),a=!1;else{const n=this.valList[u];t!==n&&(this.isBackgroundFetch(n)?n.__abortController.abort():i||(this.dispose(n,e,"set"),this.disposeAfter&&this.disposed.push([n,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===n||0!==this.ttl||this.ttls||this.initializeTTLTracking(),a||this.setItemTTL(u,n,r),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,n=this.keyList[t],r=this.valList[t];return this.isBackgroundFetch(r)?r.__abortController.abort():(this.dispose(r,n,"evict"),this.disposeAfter&&this.disposed.push([r,n,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(n),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const n=this.keyMap.get(e);return void 0!==n&&!this.isStale(n)&&(t&&this.updateItemAge(n),!0)}peek(e,{allowStale:t=this.allowStale}={}){const n=this.keyMap.get(e);if(void 0!==n&&(t||!this.isStale(n))){const e=this.valList[n];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,n,r){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const s=new o,a={signal:s.signal,options:n,context:r},u=t=>(s.signal.aborted||this.set(e,t,a.options),t),f=r=>{if(this.valList[t]===l){const r=!n.noDeleteOnFetchRejection||void 0===l.__staleWhileFetching;r?this.delete(e):this.valList[t]=l.__staleWhileFetching}if(l.__returned===l)throw r},c=t=>t(this.fetchMethod(e,i,a)),l=new Promise(c).then(u,f);return l.__abortController=s,l.__staleWhileFetching=i,l.__returned=null,void 0===t?(this.set(e,l,a.options),t=this.keyMap.get(e)):this.valList[t]=l,l}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:s=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,fetchContext:c=this.fetchContext,forceRefresh:l=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r});const h={allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r,ttl:i,noDisposeOnSet:o,size:s,sizeCalculation:a,noUpdateTTL:u,noDeleteOnFetchRejection:f};let d=this.keyMap.get(e);if(void 0===d){const t=this.backgroundFetch(e,d,h,c);return t.__returned=t}{const r=this.valList[d];if(this.isBackgroundFetch(r))return t&&void 0!==r.__staleWhileFetching?r.__staleWhileFetching:r.__returned=r;if(!l&&!this.isStale(d))return this.moveToTail(d),n&&this.updateItemAge(d),r;const i=this.backgroundFetch(e,d,h,c);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],s=this.isBackgroundFetch(o);if(this.isStale(i))return s?t?o.__staleWhileFetching:void 0:(r||this.delete(e),t?o:void 0);if(s)return;return this.moveToTail(i),n&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return l("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const n=this.keyMap.get(e);if(void 0!==n)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(n);const t=this.valList[n];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[n]=null,this.valList[n]=null,n===this.tail?this.tail=this.prev[n]:n===this.head?this.head=this.next[n]:(this.next[this.prev[n]]=this.next[n],this.prev[this.next[n]]=this.prev[n]),this.size--,this.free.push(n)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const n=this.keyList[e];this.dispose(t,n,"delete"),this.disposeAfter&&this.disposed.push([t,n,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return l("reset","clear"),this.clear}get length(){return h("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=_}}}},"form-builder":{"package.json":function e(t,n,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":[]}}},tslib:{"package.json":function e(t,n,e){e.exports={name:"tslib",version:"2.3.1",module:"tslib.es6.js",main:"tslib.js"}},"tslib.es6.js":function e(t,n,e){e.export({__extends:()=>i,__assign:()=>o,__rest:()=>s,__decorate:()=>a,__param:()=>u,__metadata:()=>f,__awaiter:()=>c,__generator:()=>l,__createBinding:()=>h,__exportStar:()=>d,__values:()=>p,__read:()=>g,__spread:()=>b,__spreadArrays:()=>m,__spreadArray:()=>v,__await:()=>y,__asyncGenerator:()=>_,__asyncDelegator:()=>w,__asyncValues:()=>k,__makeTemplateObject:()=>j,__importStar:()=>S,__importDefault:()=>D,__classPrivateFieldGet:()=>E,__classPrivateFieldSet:()=>A}); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -249,7 +249,7 @@ Package._define("mobile-experience"); !function(){var a=Package["ddp-client"].DDP;Package._define("ddp",{DDP:a})}(); -Package._define("ddp-server"); +!function(){var e,a,d;Package._define("ddp-server")}(); !function(){var e=Package.meteor.Meteor,t=Package.meteor.global,o=Package.meteor.meteorEnv,n=Package.minimongo.LocalCollection,r=Package.minimongo.Minimongo,i=Package.check.check,c=Package.check.Match,s=Package.ejson.EJSON,l=Package["ddp-client"].DDP,a=Package.modules.meteorInstall,d=Package.promise.Promise,f,u;a({node_modules:{meteor:{"allow-deny":{"allow-deny.js":function t(){const o=Object.prototype.hasOwnProperty,r=(f={CollectionPrototype:{}}).CollectionPrototype;r.allow=function(e){h(this,"allow",e)},r.deny=function(e){h(this,"deny",e)},r._defineMutationMethods=function(t){const n=this;if(t=t||{},n._restricted=!1,n._insecure=void 0,n._validators={insert:{allow:[],deny:[]},update:{allow:[],deny:[]},remove:{allow:[],deny:[]},upsert:{allow:[],deny:[]},fetch:[],fetchAllFields:!1},n._name&&(n._prefix="/"+n._name+"/",n._connection&&(n._connection===e.server||e.isClient))){const r={};["insert","update","remove"].forEach(s=>{const l=n._prefix+s;if(t.useExisting){const t=e.isClient?"_methodHandlers":"method_handlers";if(n._connection[t]&&"function"==typeof n._connection[t][l])return}r[l]=function(){i(arguments,[c.Any]);const t=Array.from(arguments);try{let r=null;if("insert"!==s||o.call(t[0],"_id")||(r=n._makeNewID()),this.isSimulation)return null!==r&&(t[0]._id=r),n._collection[s].apply(n._collection,t);if("insert"!==s&&_(t[0],s),n._restricted){if(0===n._validators[s].allow.length)throw new e.Error(403,"Access denied. No allow validators set on restricted collection for method '"+s+"'.");const o="_validated"+s.charAt(0).toUpperCase()+s.slice(1);return t.unshift(this.userId),"insert"===s&&t.push(r),n[o].apply(n,t)}if(n._isInsecure())return null!==r&&(t[0]._id=r),n._collection[s].apply(n._collection,t);throw new e.Error(403,"Access denied")}catch(r){throw"MongoError"===r.name||"MinimongoError"===r.name?new e.Error(409,r.toString()):r}}}),n._connection.methods(r)}},r._updateFetch=function(e){const t=this;if(!t._validators.fetchAllFields)if(e){const o=Object.create(null),n=e=>e&&e.forEach(e=>o[e]=1);n(t._validators.fetch),n(e),t._validators.fetch=Object.keys(o)}else t._validators.fetchAllFields=!0,t._validators.fetch=null},r._isInsecure=function(){const e=this;return void 0===this._insecure?!!Package.insecure:this._insecure},r._validatedInsert=function(t,o,n){const r=this;if(this._validators.insert.deny.some(e=>e(t,u(e,o,n))))throw new e.Error(403,"Access denied");if(this._validators.insert.allow.every(e=>!e(t,u(e,o,n))))throw new e.Error(403,"Access denied");null!==n&&(o._id=n),this._collection.insert.call(this._collection,o)},r._validatedUpdate=function(t,r,c,s){const l=this;if(i(c,Object),s=Object.assign(Object.create(null),s),!n._selectorIsIdPerhapsAsObject(r))throw new Error("validated update should be of a single ID");if(s.upsert)throw new e.Error(403,"Access denied. Upserts not allowed in a restricted collection.");const f="Access denied. In a restricted collection you can only update documents, not replace them. Use a Mongo update operator, such as '$set'.",u=Object.keys(c),h={};if(0===u.length)throw new e.Error(403,f);u.forEach(t=>{const n=c[t];if("$"!==t.charAt(0))throw new e.Error(403,f);if(!o.call(a,t))throw new e.Error(403,"Access denied. Operator "+t+" not allowed in a restricted collection.");Object.keys(n).forEach(e=>{-1!==e.indexOf(".")&&(e=e.substring(0,e.indexOf("."))),h[e]=!0})});const _=Object.keys(h),m={transform:null};l._validators.fetchAllFields||(m.fields={},l._validators.fetch.forEach(e=>{m.fields[e]=1}));const w=l._collection.findOne(r,m);if(!w)return 0;if(l._validators.update.deny.some(e=>{const o=d(e,w);return e(t,o,_,c)}))throw new e.Error(403,"Access denied");if(l._validators.update.allow.every(e=>{const o=d(e,w);return!e(t,o,_,c)}))throw new e.Error(403,"Access denied");return s._forbidReplace=!0,l._collection.update.call(l._collection,r,c,s)};const a={$inc:1,$set:1,$unset:1,$addToSet:1,$pop:1,$pullAll:1,$pull:1,$pushAll:1,$push:1,$bit:1};function d(e,t){return e.transform?e.transform(t):t}function u(e,t,o){let n=t;return e.transform&&(n=s.clone(t),null!==o&&(n._id=o),n=e.transform(n)),n}function h(e,t,r){const i=/^(?:insert|update|remove|fetch|transform)$/;if(Object.keys(r).forEach(e=>{if(!i.test(e))throw new Error(t+": Invalid key: "+e)}),e._restricted=!0,["insert","update","remove"].forEach(i=>{if(o.call(r,i)){if(!(r[i]instanceof Function))throw new Error(t+": Value for `"+i+"` must be a function");void 0===r.transform?r[i].transform=e._transform:r[i].transform=n.wrapTransform(r.transform),e._validators[i][t].push(r[i])}}),r.update||r.remove||r.fetch){if(r.fetch&&!(r.fetch instanceof Array))throw new Error(t+": Value for `fetch` must be an array");e._updateFetch(r.fetch)}}function _(t,o){if(!n._selectorIsIdPerhapsAsObject(t))throw new e.Error(403,"Not permitted. Untrusted code may only "+o+" documents by ID.")}function m(){var e;const t=(l._CurrentMethodInvocation||l._CurrentInvocation).get();return t&&t.isSimulation}r._validatedRemove=function(t,o){const n=this,r={transform:null};n._validators.fetchAllFields||(r.fields={},n._validators.fetch.forEach(e=>{r.fields[e]=1}));const i=n._collection.findOne(o,r);if(!i)return 0;if(n._validators.remove.deny.some(e=>e(t,d(e,i))))throw new e.Error(403,"Access denied");if(n._validators.remove.allow.every(e=>!e(t,d(e,i))))throw new e.Error(403,"Access denied");return n._collection.remove.call(n._collection,o)},r._callMutatorMethod=function t(o,n,r){!e.isClient||r||m()||(r=function(t){t&&e._debug(o+" failed: "+(t.reason||t.stack))});const i="update"===o||"remove"===o;i&&!m()&&_(n[0],o);const c=this._prefix+o;return this._connection.apply(c,n,{returnStubValue:!0},r)}}}}}},{extensions:[".js",".json"]})("/node_modules/meteor/allow-deny/allow-deny.js"),Package._define("allow-deny",{AllowDeny:f})}(); diff --git a/server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json b/server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json similarity index 99% rename from server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json rename to server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json index f421ff5a81..32cdd99b94 100644 --- a/server/bundle/programs/web.browser.legacy/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json +++ b/server/bundle/programs/web.browser.legacy/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json @@ -3,8 +3,8 @@ "name": "standard-minifier-js", "version": "2.6.0" }, - "totalMinifiedBytes": 4306712, - "totalMinifiedGzipBytes": 1085048, + "totalMinifiedBytes": 4306737, + "totalMinifiedGzipBytes": 1085046, "minifiedBytesByPackage": { "packages/meteor.js": 9504, "packages/coffeescript.js": 32, @@ -1584,7 +1584,7 @@ } ], "packages/ddp.js": 78, - "packages/ddp-server.js": 30, + "packages/ddp-server.js": 55, "packages/allow-deny.js": [ 5767, { diff --git a/server/bundle/programs/web.browser.legacy/program.json b/server/bundle/programs/web.browser.legacy/program.json index ebba1ab57a..8dc087892f 100644 --- a/server/bundle/programs/web.browser.legacy/program.json +++ b/server/bundle/programs/web.browser.legacy/program.json @@ -2,24 +2,24 @@ "format": "web-program-pre1", "manifest": [ { - "path": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js", + "path": "7d27de16d6eab9175efa4d52871e8cc6588f4811.js", "where": "client", "type": "js", "cacheable": true, - "url": "/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js?meteor_js_resource=true", - "size": 4306712, - "hash": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9", - "sri": "8V1LAdKwQ3YDuCf6NLWIc8ANTjyPPal4eMgPcDSh7DgxhEPYKlU6Ng1mUyFf41upRtf3cWipGUF8Bks86cK3Xg==" + "url": "/7d27de16d6eab9175efa4d52871e8cc6588f4811.js?meteor_js_resource=true", + "size": 4306737, + "hash": "7d27de16d6eab9175efa4d52871e8cc6588f4811", + "sri": "mQJ9d8Y1Rd2yLC9UkYFqc8DKdWTK+EbdVcXzlUriN9g92KUMPH+VnggxIBgtYFspWYpGlxV7xGxOIieDJ5ACcg==" }, { - "path": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json", + "path": "7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json", "where": "client", "type": "json", "cacheable": true, - "url": "/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json?meteor_js_resource=true", + "url": "/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json?meteor_js_resource=true", "size": 92684, - "hash": "84b3c49ed8cbcc47c24972dbe109f0a26e1c615f", - "sri": "9TD3noiNc7n1kIu/MLlA5a+iI7Zw7X3uqMMLIepNxhm2titxz91fBgCPj5bpXr60mvkrz+5WmQd7JBkRh5M8PQ==" + "hash": "09ae6c73b3f27edc9130f5c46771c9c45954f508", + "sri": "zVvOLAKlxGGT0HM1ez3LJh6n8LNY7HTZ23MTiXz0eUEOUNiG6OYB/AID6bCJaDNjWU9eKCk3WsYO5YL6W6Tiaw==" }, { "path": "dynamic/node_modules/@steedos/form-builder/dist/form-builder.min.js", diff --git a/server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js b/server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.js similarity index 99% rename from server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js rename to server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.js index a92b7b4af7..3947c05c4c 100644 --- a/server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js +++ b/server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.js @@ -68,7 +68,7 @@ object-assign * Copyright 2011-2019 Twitter, Inc. * Licensed under the MIT license */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}e.fn.emulateTransitionEnd=function(t){var n=!1,r=this,i;return e(this).one("bsTransitionEnd",(function(){n=!0})),setTimeout((function(){n||e(r).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};function r(t){return this.each((function(){var r=e(this),i=r.data("bs.alert");i||r.data("bs.alert",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.TRANSITION_DURATION=150,n.prototype.close=function(t){var r=e(this),i=r.attr("data-target");i||(i=(i=r.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function s(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=r.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",s).emulateTransitionEnd(n.TRANSITION_DURATION):s())};var i=e.fn.alert;e.fn.alert=r,e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.isLoading=!1};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.button"),o="object"==typeof n&&n;i||r.data("bs.button",i=new t(this,o)),"toggle"==n?i.toggle():n&&i.setState(n)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var n="disabled",r=this.$element,i=r.is("input")?"val":"html",o=r.data();t+="Text",null==o.resetText&&r.data("resetText",r[i]()),setTimeout(e.proxy((function(){r[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n).prop(n,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n).prop(n,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=n,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var r=e(t.target).closest(".btn");n.call(r,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.carousel"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n),s="string"==typeof n?n:o.slide;i||r.data("bs.carousel",i=new t(this,o)),"number"==typeof n?i.to(n):s?i[s]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t),r;if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(n,r){var i=this.$element.find(".item.active"),o=r||this.getItemForDirection(n,i),s=this.interval,a="next"==n?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var f=o[0],c=e.Event("slide.bs.carousel",{relatedTarget:f,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,s&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=e(this.$indicators.children()[this.getItemIndex(o)]);l&&l.addClass("active")}var h=e.Event("slid.bs.carousel",{relatedTarget:f,direction:a});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(n),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(a),o.addClass(a),i.one("bsTransitionEnd",(function(){o.removeClass([n,a].join(" ")).addClass("active"),i.removeClass(["active",a].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(h)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(h)),s&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=n,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var i=function(t){var r=e(this),i=r.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=r.attr("data-target")||i,s=e(document).find(o);if(s.hasClass("carousel")){var a=e.extend({},s.data(),r.data()),u=r.attr("data-slide-to");u&&(a.interval=!1),n.call(s,a),u&&s.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);n.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.$trigger=e('[data-toggle="collapse"][href="#'+n.id+'"],[data-toggle="collapse"][data-target="#'+n.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(r)}function r(n){return this.each((function(){var r=e(this),i=r.data("bs.collapse"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n);!i&&o.toggle&&/show|hide/.test(n)&&(o.toggle=!1),i||r.data("bs.collapse",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var n,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(n=i.data("bs.collapse"))&&n.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(r.call(i,"hide"),n||i.data("bs.collapse",null));var s=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[s](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[s](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return a.call(this);var u=e.camelCase(["scroll",s].join("-"));this.$element.one("bsTransitionEnd",e.proxy(a,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[s](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var n=e.Event("hide.bs.collapse");if(this.$element.trigger(n),!n.isDefaultPrevented()){var r=this.dimension();this.$element[r](this.$element[r]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[r](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,r){var i=e(r);this.addAriaAndCollapsedClass(n(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var i=e.fn.collapse;e.fn.collapse=r,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=n(i),s,a=o.data("bs.collapse")?"toggle":i.data();r.call(o,a)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r="#"!==n?e(document).find(n):null;return r&&r.length?r:t.parent()}function o(r){r&&3===r.which||(e(t).remove(),e(n).each((function(){var t=e(this),n=i(t),o={relatedTarget:this};n.hasClass("open")&&(r&&"click"==r.type&&/input|textarea/i.test(r.target.tagName)&&e.contains(n[0],r.target)||(n.trigger(r=e.Event("hide.bs.dropdown",o)),r.isDefaultPrevented()||(t.attr("aria-expanded","false"),n.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function s(t){return this.each((function(){var n=e(this),i=n.data("bs.dropdown");i||n.data("bs.dropdown",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.prototype.toggle=function(t){var n=e(this);if(!n.is(".disabled, :disabled")){var r=i(n),s=r.hasClass("open");if(o(),!s){"ontouchstart"in document.documentElement&&!r.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var a={relatedTarget:this};if(r.trigger(t=e.Event("show.bs.dropdown",a)),t.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),r.toggleClass("open").trigger(e.Event("shown.bs.dropdown",a))}return!1}},r.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var r=e(this);if(t.preventDefault(),t.stopPropagation(),!r.is(".disabled, :disabled")){var o=i(r),s=o.hasClass("open");if(!s&&27!=t.which||s&&27==t.which)return 27==t.which&&o.find(n).trigger("focus"),r.trigger("click");var a=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+a);if(u.length){var f=u.index(t.target);38==t.which&&f>0&&f--,40==t.which&&fdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},f.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var s=i[o];if("click"==s)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",u="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},f.prototype.getDefaults=function(){return f.DEFAULTS},f.prototype.getOptions=function(n){var r=this.$element.data();for(var i in r)r.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete r[i];return(n=e.extend({},this.getDefaults(),r,n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.sanitize&&(n.template=u(n.template,n.whiteList,n.sanitizeFn)),n},f.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,(function(e,r){n[e]!=r&&(t[e]=r)})),t},f.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState)n.hoverState="in";else{if(clearTimeout(n.timeout),n.hoverState="in",!n.options.delay||!n.options.delay.show)return n.show();n.timeout=setTimeout((function(){"in"==n.hoverState&&n.show()}),n.options.delay.show)}},f.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},f.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),!n.isInStateTrue()){if(clearTimeout(n.timeout),n.hoverState="out",!n.options.delay||!n.options.delay.hide)return n.hide();n.timeout=setTimeout((function(){"out"==n.hoverState&&n.hide()}),n.options.delay.hide)}},f.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var n=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!n)return;var r=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,u=a.test(s);u&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var c=this.getPosition(),l=i[0].offsetWidth,h=i[0].offsetHeight;if(u){var d=s,p=this.getPosition(this.$viewport);s="bottom"==s&&c.bottom+h>p.bottom?"top":"top"==s&&c.top-hp.width?"left":"left"==s&&c.left-ls.top+s.height&&(i.top=s.top+s.height-u)}else{var f=t.left-o,c=t.left+o+n;fs.right&&(i.left=s.left+s.width-c)}return i},f.prototype.getTitle=function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)},f.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},f.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},f.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},f.prototype.enable=function(){this.enabled=!0},f.prototype.disable=function(){this.enabled=!1},f.prototype.toggleEnabled=function(){this.enabled=!this.enabled},f.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},f.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},f.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var l=e.fn.tooltip;e.fn.tooltip=c,e.fn.tooltip.Constructor=f,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=l,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function n(n){return this.each((function(){var r=e(this),i=r.data("bs.popover"),o="object"==typeof n&&n;!i&&/destroy|hide/.test(n)||(i||r.data("bs.popover",i=new t(this,o)),"string"==typeof n&&i[n]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();if(this.options.html){var r=typeof n;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===r&&(n=this.sanitizeHtml(n))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===r?"html":"append"](n)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(n);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var r=e.fn.popover;e.fn.popover=n,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=r,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(n).is(document.body)?e(window):e(n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each((function(){var r=e(this),i=r.data("bs.scrollspy"),o="object"==typeof n&&n;i||r.data("bs.scrollspy",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[n]().top+r,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),n=this.options.offset+t-this.$scrollElement.height(),r=this.offsets,i=this.targets,o=this.activeTarget,s;if(this.scrollHeight!=t&&this.refresh(),e>=n)return o!=(s=i[i.length-1])&&this.activate(s);if(o&&e=r[s]&&(void 0===r[s+1]||e .active"),s=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!r.find("> .fade").length);function a(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),n.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(n[0].offsetWidth,n.addClass("in")):n.removeClass("fade"),n.parent(".dropdown-menu").length&&n.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&s?o.one("bsTransitionEnd",a).emulateTransitionEnd(t.TRANSITION_DURATION):a(),o.removeClass("in")};var r=e.fn.tab;e.fn.tab=n,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var i=function(t){t.preventDefault(),n.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(n,r){this.options=e.extend({},t.DEFAULTS,r);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(n),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.affix"),o="object"==typeof n&&n;i||r.data("bs.affix",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,n,r){var i=this.$target.scrollTop(),o=this.$element.offset(),s=this.$target.height();if(null!=n&&"top"==this.affixed)return i=e-r&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),n=this.$element.offset();return this.pinnedOffset=n.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var n=this.$element.height(),r=this.options.offset,i=r.top,o=r.bottom,s=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(o=i=r),"function"==typeof i&&(i=r.top(this.$element)),"function"==typeof o&&(o=r.bottom(this.$element));var a=this.getState(s,n,i,o);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var u="affix"+(a?"-"+a:""),f=e.Event(u+".bs.affix");if(this.$element.trigger(f),f.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:s-n-o})}};var r=e.fn.affix;e.fn.affix=n,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),r=t.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),n.call(t,r)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,n,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,n,e,r,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),s=t("path"),a=t("detect-libc");Math.random();var u=s.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+a.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(c){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(c.stack||c.message||c),new Error("Missing binary. See message above.")}f(e.exports)}function f(e){try{var t=process.binding("async_wrap"),n;if(t.asyncIdStackSize instanceof Function)n=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");l=t.constants.kStackLength,n=function(){return t.async_hook_fields[l]}}var r=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,s;if(!r||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,s=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var a=t.async_id_fields||t.async_uid_fields;function u(){for(var e=n(),t=new Array(e);e>0;--e){var i=a[o];t[e-1]={asyncId:i,triggerId:a[s]},r(i)}return t}function f(e){for(var t=0;t0)i.changeLanguage(e,r);else if(0!=a[u]){a[u]=0;var f=new XMLHttpRequest;f.overrideMimeType("application/json"),f.open("GET",u,!1),f.send(null),200===f.status?a[u]=1:a[u]=-1,n.addResourceBundle(e,s,JSON.parse(f.response)||{}),i.changeLanguage(e,r)}};n.changeLanguage=p;var g=function(e,t,n){return i.format(e,t,n)};n.format=g;var b=function(){return i.languages};n.getLanguages=b;var m=function(e,t){return i.loadLanguages(e,t)};n.loadLanguages=m;var v=function(e,t){return i.loadNamespaces(e,t)};n.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};n.on=y;var _=function(e,t){return i.off(e,t)};n.off=_,r.__exportStar(t("./i18n/i18n"),n),r.__exportStar(t("./i18n/i18n.app"),n),r.__exportStar(t("./translations"),n)},i18n:{"i18n.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.fallbackKeys=n.getObjectI18nTemplate=n.translationI18nObjects=n.addObjectsI18n=n.translationI18nObject=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="_",a="base",u="core",f="translation",c=function(e,t){var n={lng:t,ns:f};if((0,r.exists)(e,n))return(0,r._t)(e,n)},l=function(e){return"".concat(e,"__object")},h=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},d=function(e,t){var n=h(e,t);return"".concat(n).concat("_","inlineHelpText")},p=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(n)},g=function(e,t,n){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(n)},b=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},m=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,n){var r=l(t);return c(r,e)||n||""},_=function(e,t,n,r,i){var o=h(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=_(e,a,n,r,i))}return s||r||""},w=function(e,t,n,r,i){var o=d(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=w(e,a,n,r,i))}return s||r||""},k=function(e,t,n,r){var i=p(t,n);return c(i,e)||r||""},j=function(e,t,n,r,i,o){var s=g(t,n,r),a=c(s,e);if(!a){var u=v(o);u&&"base"!=t&&"core"!=t&&(a=j(e,u,n,r,i,o))}return a||i||""},x=function(e,t,n,r,i){var o=b(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=x(e,a,n,r,i))}return s||r||""},S=function(e,t,n,r,i){var o=m(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=S(e,a,n,r,i))}return s||r||""},D=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},E=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(D(e))}))):n.push(D(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},A=function(e,t,n){n.label=y(e,t,n.label),i.each(n.fields,(function(r,o){if(r.label=_(e,t,o,r.label,n.datasource),r.inlineHelpText&&(r.inlineHelpText=w(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(r.group=k(e,t,r.group,r.group)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var a=j(e,t,o,r.value,r.label,n.datasource);s.push(i.extend({},r,{label:a}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=x(e,t,i,r.label,n.datasource)})),i.each(n.list_views,(function(r,i){r.label=S(e,t,i,r.label,n.datasource)}))};n.translationI18nObject=A;var C=function(e){i.each(e,(function(e){(0,r.addResourceBundle)(e.lng,f,e.data,!0,!0)}))};n.addObjectsI18n=C;var M=function(e,t){i.each(t,(function(t,r){(0,n.translationI18nObject)(e,r,t)}))};n.translationI18nObjects=M;var O=function(e,t,n){var r=o(n);E(r);var s={};return s[l(t)]=y(e,t,r.label),i.each(r.fields,(function(n,o){s[h(t,o)]=_(e,t,o,n.label),n.inlineHelpText&&(s[d(t,o)]=w(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(s[p(t,n.group)]=k(e,t,n.group,n.group)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[g(t,o,n.value)]=j(e,t,o,n.value,n.label))}))})),i.each(r.actions,(function(n,r){s[b(t,r)]=x(e,t,r,n.label)})),i.each(r.list_views,(function(n,r){s[m(t,r)]=S(e,t,r,n.label)})),s};n.getObjectI18nTemplate=O,n.fallbackKeys={getObjectLabelKey:l,getObjectFieldLabelKey:h,getObjectFieldInlineHelpTextLabelKey:d,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:g,getObjectActionLabelKey:b,getObjectListviewLabelKey:m}},"i18n.app.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.appFallbackKeys=n.getAppI18nTemplate=n.translationI18nApps=n.translationI18nMenus=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="translation",a="_",u=function(e,t){var n={lng:t,ns:s};if((0,r.exists)(e,n))return(0,r._t)(e,n)},f=function(e){return"app".concat("_").concat(e).concat("_","name")},c=function(e){return"app".concat("_").concat(e).concat("_","description")},l=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(n)},h=function(e){return"menu".concat("_").concat(e)},d=function(e){return"tab".concat("_").concat(e)},p=function(e,t,n){var r=f(t);return u(r,e)||n||""},g=function(e,t,n){var r=c(t);return u(r,e)||n||""},b=function(e,t,n){var r=h(t);return u(r,e)||n||""},m=function(e,t,r){r.label=p(e,t,r.label||r.name),r.description=g(e,t,r.description),(0,n.translationI18nMenus)(e,r.admin_menus)},v=function(e,t){i.each(t,(function(t){var n=b(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,n){m(e,n,t)}))};n.translationI18nApps=y;var _=function(e,t,n){var r=o(n),s={};return s[f(t)]=p(e,t,r.label||r.name),s[c(t)]=g(e,t,r.description),i.each(r.admin_menus,(function(t){s[h(t._id)]=b(e,t._id,t.label||t.name)})),s};n.getAppI18nTemplate=_,n.appFallbackKeys={getAppLabelKey:f,getAppDescriptionKey:c,getAppGroupKey:l,getMenuLabelKey:h,getTabKey:d}}},translations:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SteedosTranslationPrefixKeys=n.convertObject=void 0;var r=t("tslib"),i=t("underscore");r.__exportStar(t("./objectTranslation"),n),r.__exportStar(t("./translation"),n),r.__exportStar(t("./templates/objectTranslation"),n),r.__exportStar(t("./templates/translation"),n);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},s=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(o(e))}))):n.push(o(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?n.push(o(e)):n.push(e)})),e.options=n}catch(r){console.error("Creator.convertFieldsOptions",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},a;n.convertObject=s,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(a=n.SteedosTranslationPrefixKeys||(n.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,n,e,r){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addObjectsTranslation=n.getObjectTranslationTemplate=n.translationObjects=n.translationObject=n.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),s=t("../index"),a=t("./index"),u=t("../i18n/i18n"),f=t("lodash"),c=t("crypto"),l,h=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function d(e){var t;return c.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(d(JSON.stringify(t)))},g=t("clone"),b=".",m="base",v="core",y="translation",_="object",w="field",k="listview",j="action",x=function(e,t){var n={lng:t,ns:y,keySeparator:!1};if((0,s.exists)(e,n))return(0,s._t)(e,n)},S=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},D=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},E=function(e){var t;return[D(),e].join(".")},A=function(e){var t;return[D("object"),e,"label"].join(".")},C=function(e){var t;return[D("object"),e,"description"].join(".")},M=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"label"].join(".")},O=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"help"].join(".")},T=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"description"].join(".")},B=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),r;return[D("field"),e,"group",n].join(".")},I=function(e,t,n){var r;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"options",n].join(".")},R=function(e,t){var n;return[D("action"),e,t].join(".")},F=function(e,t){var n;return[D("listview"),e,t].join(".")},P=function(e,t,n){var r,i=[A(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),x(i,e)||n||""};n.translationObjectLabel=P;var N=function(e,t,n){var r=C(t);return x(r,e)||n||""},L=function(e,t,n,r,i,o){var s,a=[M(t,n)],f=u.fallbackKeys.getObjectFieldLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=L(e,l,n,r,i))}return c||r||""},z=function(e,t,n,r,i,o){var s,a=[O(t,n)],f=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=z(e,l,n,r,i))}return c||r||""},U=function(e,t,n,r,i,o){var s=T(t,n),a,u=x([s],e);if(1!=o&&!u){var f=S(i);f&&"base"!=t&&"core"!=t&&(u=U(e,f,n,r,i))}return u||r||""},q=function(e,t,n,r,i,o){var s,a=[B(t,n)],f=u.fallbackKeys.getObjectFieldGroupKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=q(e,l,n,r,i))}return c||r||""},$=function(e,t,n,r,i,o,s){var a,f=[I(t,n,r)],c=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,n,r);c&&f.push(c);var l=x(f,e);if(1!=s&&!l){var h=S(o);h&&"base"!=t&&"core"!=t&&(l=$(e,h,n,r,i,o))}return l||i||""},W=function(e,t,n,r,i,o){var s,a=[R(t,n)],f=u.fallbackKeys.getObjectActionLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=W(e,l,n,r,i))}return c||r||""},H=function(e,t,n,r,i,o){var s,a=[F(t,n)],f=u.fallbackKeys.getObjectListviewLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=H(e,l,n,r,i))}return c||r||""},Y=function(e,t,r,o,s){void 0===s&&(s=!1);var u=p(e,r),c=h.get(u);if(c)return Object.assign(r,(0,f.cloneDeep)(c));o&&(0,a.convertObject)(r),r.label=(0,n.translationObjectLabel)(e,t,r.label),r.description=N(e,t,r.description),i.each(r.fields,(function(n,o){if(n.label=L(e,t,o,n.label,r.datasource,s),n.inlineHelpText=z(e,t,o,n.inlineHelpText,r.datasource,s),n.description=U(e,t,o,n.description,r.datasource,s),n.group&&(n.group=q(e,t,n.group,n.group,r.datasource,s)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var u=$(e,t,o,n.value,n.label,r.datasource,s);a.push(i.extend({},n,{label:u}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=W(e,t,i,n.label,r.datasource,s)})),i.each(r.list_views,(function(n,i){n.label=H(e,t,i,n.label,r.datasource,s)})),h.set(u,(0,f.cloneDeep)(r))};n.translationObject=Y;var V=function(e,t){i.each(t,(function(t,r){(0,n.translationObject)(e,r,t)}))};n.translationObjects=V;var K=function(e,t,r){var o=g(r);(0,a.convertObject)(o);var s={};return s[A(t)]=(0,n.translationObjectLabel)(e,t,o.label),s[C(t)]=N(e,t,o.description),i.each(o.fields,(function(n,r){s[M(t,r)]=L(e,t,r,n.label),n.inlineHelpText&&(s[O(t,r)]=z(e,t,r,n.inlineHelpText,o.datasource)),n.description&&(s[T(t,r)]=U(e,t,r,n.description,o.datasource)),n.group&&(s[B(t,n.group)]=q(e,t,n.group,n.group,o.datasource)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[I(t,r,n.value)]=$(e,t,r,n.value,n.label))}))})),i.each(o.actions,(function(n,r){s[R(t,r)]=W(e,t,r,n.label)})),i.each(o.list_views,(function(n,r){s[F(t,r)]=H(e,t,r,n.label)})),s};function G(e,t){var n=g(e);(0,a.convertObject)(n);var r={},o=n.name;return o||console.error("Error: Invalid objectTranslation:"+t),r[A(o)]=n.label,r[C(o)]=n.description,i.each(n.fields,(function(e,t){r[M(o,t)]=e.label,e.help&&(r[O(o,t)]=e.help),e.description&&(r[T(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(r[I(o,t,e.value)]=e.label)}))})),i.each(n.groups,(function(e,t){r[B(o,t)]=e})),i.each(n.actions,(function(e,t){r[R(o,t)]=e.label})),i.each(n.listviews,(function(e,t){r[F(o,t)]=e.label})),i.each(n.CustomLabels,(function(e,t){r[E(t)]=e})),r}n.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,s.addResourceBundle)(e.lng,y,t,!0,!0)}))};n.addObjectsTranslation=X},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addTranslations=n.convertTranslation=n.convertTranslationData=n.getAppTranslationTemplate=n.translationApps=n.translationMenus=n.translationApp=n.translationTabLabel=n.translationTabGroup=void 0;var r=t("../index"),i=t("underscore"),o=t("./"),s=t("../i18n/i18n.app"),a=t("clone"),u="translation",f=".",c="app",l="menu",h="tab",d=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[d(),e].join(".")},g=function(e,t){var n={lng:t,ns:u,keySeparator:!1};if((0,r.exists)(e,n))return(0,r._t)(e,n)},b=function(e){var t;return[d("app"),e,"name"].join(".")},m=function(e){var t;return[d("app"),e,"description"].join(".")},v=function(e,t){var n,r;return[d("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[d("menu"),"menu_".concat(e)].join(".")},_=function(e){var t;return[d("tab"),e].join(".")},w=function(e,t,n){var r,i=[b(t)],o=s.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),g(i,e)||n||""},k=function(e,t,n){var r,i=[m(t)],o=s.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),g(i,e)||n||""},j=function(e,t,n,r){var i,o=[v(t,n)],a=s.appFallbackKeys.getAppGroupKey(t,n);return a&&o.push(a),g(o,e)||r||""};n.translationTabGroup=j;var x=function(e,t,n){var r,i=[y(t)],o=s.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),g(i,e)||n||""},S=function(e,t,n){var r,i=[_(t)],o=s.appFallbackKeys.getTabKey(t);return o&&i.push(o),g(i,e)||n||""};n.translationTabLabel=S;var D=function(e,t,r){r.label=w(e,t,r.label||r.name),r.description=k(e,t,r.description),i.each(r.tab_groups,(function(i,o){r.tab_groups[o].id=i.id||i.group_name,r.tab_groups[o].group_name=(0,n.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,n.translationMenus)(e,r.admin_menus)};n.translationApp=D;var E=function(e,t){i.each(t,(function(t){var n=x(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationMenus=E;var A=function(e,t){i.each(t,(function(t,r){(0,n.translationApp)(e,r,t)}))};n.translationApps=A;var C=function(e,t,n){var r=a(n),o={};return o[b(t)]=w(e,t,r.label||r.name),o[m(t)]=k(e,t,r.description),i.each(r.admin_menus,(function(t){o[y(t._id)]=x(e,t._id,t.label||t.name)})),o};n.getAppTranslationTemplate=C;var M=function(e,t,n){i.isArray(n)?i.each(n,(function(e){M(e,"",e)})):n&&i.each(i.keys(n),(function(r){var o=t?"".concat(t,".").concat(r):r,s=n[r];"object"==typeof s?i.isArray(s)?i.each(s,(function(e){M(e,o,s)})):M(e,o,s):e[o]=s}))};function O(e){for(var t in e)"object"==typeof e[t]&&M(e,t,e[t]);return e}n.convertTranslationData=O;var T=function(e){var t=a(e),n={};return i.each(t.CustomApplications,(function(e,t){n[b(t)]=e.name,n[m(t)]=e.description,i.each(e.groups,(function(e,r){n[v(t,r)]=e}))})),i.each(t.CustomTabs,(function(e,t){n[_(t)]=e})),i.each(t.CustomLabels,(function(e,t){var r;if("simpleschema"!=t&&i.isObject(e)){var o=O(((r={})[t]=e,r));i.each(o,(function(e,t){i.isObject(e)||(n[p(t)]=e)}))}else n[p(t)]=e})),n};n.convertTranslation=T;var B=function(e){i.each(e,(function(e){var t=(0,n.convertTranslation)(e.data);(0,r.addResourceBundle)(e.lng,u,t,!0,!0)}))};n.addTranslations=B},templates:{"objectTranslation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getObjectMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]="help"===e?t.inlineHelpText||"":t[e]||""})),n}function a(e){return s(["label","description"],e)}function u(e){switch(e.type){case"select":return s(["label","help","options","description"],e);default:return s(["label","help","description"],e)}}function f(e){return s(["label"],e)}function c(e){return s(["label"],e)}function l(e){var t={};return r.each(e,(function(e,n){t[n]=u(e)})),t}function h(e){var t={};return r.each(e,(function(e,n){t[n]=c(e)})),t}function d(e){var t={};return r.each(e,(function(e,n){t[n]=f(e)})),t}function p(e,t){var n={};return r.each(e,(function(e,r){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");n[i]=t[r].group}})),n}var g=function(e,t,n,s){void 0===s&&(s=!1);var u=o(n);1!=s&&(0,i.translationObject)(e,t,u,!0,s);var f=Object.assign({},a(u));f=Object.assign({},f,{fields:l(u.fields)});var c=p(n.fields,u.fields);r.isEmpty(c)||(f=Object.assign({},f,{groups:c}));var g=d(u.list_views);r.isEmpty(g)||(f=Object.assign({},f,{listviews:g}));var b=h(u.actions);return r.isEmpty(b)||(f=Object.assign({},f,{actions:b})),Object.assign({name:t},f)};n.getObjectMetadataTranslationTemplate=g},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getAppMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]=t[e]||""})),n}function a(e){var t={groups:{}};return e?(r.each(e,(function(e){var n=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[n]=e.group_name})),t):{}}var u=function(e){return Object.assign({},s(["name","description"],e),a(e.tab_groups))},f=function(e){var t={};return r.each(e,(function(e,n){t[n]=n})),t},c=function(e){var t={};return r.each(e,(function(e){var n=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[n]=e})),t},l=function(e,t,n){var r,s=o(n);(0,i.translationApp)(e,t,s);var a={},l;return s.tab_items?a=f(s.tab_items):s.tabs&&(a=c(s.tabs)),Object.assign({},{CustomApplications:(r={},r[t]=u(s),r)},{CustomTabs:a})};n.getAppMetadataTranslationTemplate=l}}}},node_modules:{i18next:{"package.json":function e(t,n,e){e.exports={name:"i18next",version:"19.9.2",module:"./dist/esm/i18next.js",main:"./dist/cjs/i18next.js"}},dist:{esm:{"i18next.js":function e(t,n,e){let r,i,o,s,a,u,f,c;e.link("@babel/runtime/helpers/esm/typeof",{default(e){r=e}},0),e.link("@babel/runtime/helpers/esm/objectSpread",{default(e){i=e}},1),e.link("@babel/runtime/helpers/esm/classCallCheck",{default(e){o=e}},2),e.link("@babel/runtime/helpers/esm/createClass",{default(e){s=e}},3),e.link("@babel/runtime/helpers/esm/possibleConstructorReturn",{default(e){a=e}},4),e.link("@babel/runtime/helpers/esm/getPrototypeOf",{default(e){u=e}},5),e.link("@babel/runtime/helpers/esm/assertThisInitialized",{default(e){f=e}},6),e.link("@babel/runtime/helpers/esm/inherits",{default(e){c=e}},7);var l={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,n){console&&console[t]&&console[t].apply(console,n)}},h,d=new(function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.init(t,n)}return s(e,[{key:"init",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||l,this.options=n,this.debug=n.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,n=new Array(t),r=0;r1?n-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var s=r(o.shift());!e[s]&&n&&(e[s]=new n),e=Object.prototype.hasOwnProperty.call(e,s)?e[s]:{}}return i()?{}:{obj:e,k:r(o.shift())}}function y(e,t,n){var r=v(e,t,Object),i,o;r.obj[r.k]=n}function _(e,t,n,r){var i=v(e,t,Object),o=i.obj,s=i.k;o[s]=o[s]||[],r&&(o[s]=o[s].concat(n)),r||o[s].push(n)}function w(e,t){var n=v(e,t),r=n.obj,i=n.k;if(r)return r[i]}function k(e,t,n){var r=w(e,n);return void 0!==r?r:w(t,n)}function j(e,t,n){for(var r in t)"__proto__"!==r&&"constructor"!==r&&(r in e?"string"==typeof e[r]||e[r]instanceof String||"string"==typeof t[r]||t[r]instanceof String?n&&(e[r]=t[r]):j(e[r],t[r],n):e[r]=t[r]);return e}function x(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var S={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function D(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return S[e]})):e}var E="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,A=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),n.data=e||{},n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n}return c(t,e),s(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,s=[t,n];return r&&"string"!=typeof r&&(s=s.concat(r)),r&&"string"==typeof r&&(s=s.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(s=t.split(".")),w(this.data,s)}},{key:"addResource",value:function e(t,n,r,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},s=this.options.keySeparator;void 0===s&&(s=".");var a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(i=n,n=(a=t.split("."))[1]),this.addNamespaces(n),y(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}},{key:"addResources",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in r)"string"!=typeof r[o]&&"[object Array]"!==Object.prototype.toString.apply(r[o])||this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}},{key:"addResourceBundle",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},u=[t,n];t.indexOf(".")>-1&&(o=r,r=n,n=(u=t.split("."))[1]),this.addNamespaces(n);var f=w(this.data,u)||{};o?j(f,r,s):f=i({},f,r),y(this.data,u,f),a.silent||this.emit("added",t,n,r)}},{key:"removeResourceBundle",value:function e(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}},{key:"hasResourceBundle",value:function e(t,n){return void 0!==this.getResource(t,n)}},{key:"getResourceBundle",value:function e(t,n){return n||(n=this.options.defaultNS),"v1"===this.options.compatibilityAPI?i({},{},this.getResource(t,n)):this.getResource(t,n)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(p),C={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,n,r,i,o){var s=this;return t.forEach((function(e){s.processors[e]&&(n=s.processors[e].process(n,r,i,o))})),n}},M={},O=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),m(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,f(n)),n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n.logger=d.create("translator"),n}return c(t,e),s(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},r=this.resolve(t,n);return r&&void 0!==r.res}},{key:"extractFromKey",value:function e(t,n){var r=void 0!==n.nsSeparator?n.nsSeparator:this.options.nsSeparator;void 0===r&&(r=":");var i=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,o=n.ns||this.options.defaultNS;if(r&&t.indexOf(r)>-1){var s=t.match(this.interpolator.nestingRegexp);if(s&&s.length>0)return{key:t,namespaces:o};var a=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(a[0])>-1)&&(o=a.shift()),t=a.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(n,o,s){var a=this;if("object"!==r(o)&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),null==n)return"";Array.isArray(n)||(n=[String(n)]);var u=void 0!==o.keySeparator?o.keySeparator:this.options.keySeparator,f=this.extractFromKey(n[n.length-1],o),c=f.key,l=f.namespaces,h=l[l.length-1],d=o.lng||this.language,p=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d&&"cimode"===d.toLowerCase()){if(p){var g=o.nsSeparator||this.options.nsSeparator;return h+g+c}return c}var b=this.resolve(n,o),m=b&&b.res,v=b&&b.usedKey||c,y=b&&b.exactUsedKey||c,_=Object.prototype.toString.apply(m),w=["[object Number]","[object Function]","[object RegExp]"],k=void 0!==o.joinArrays?o.joinArrays:this.options.joinArrays,j=!this.i18nFormat||this.i18nFormat.handleAsObject,x="string"!=typeof m&&"boolean"!=typeof m&&"number"!=typeof m;if(j&&m&&x&&w.indexOf(_)<0&&("string"!=typeof k||"[object Array]"!==_)){if(!o.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,m,o):"key '".concat(c," (").concat(this.language,")' returned an object instead of string.");if(u){var S="[object Array]"===_,D=S?[]:{},E=S?y:v;for(var A in m)if(Object.prototype.hasOwnProperty.call(m,A)){var C="".concat(E).concat(u).concat(A);D[A]=this.translate(C,i({},o,{joinArrays:!1,ns:l})),D[A]===C&&(D[A]=m[A])}m=D}}else if(j&&"string"==typeof k&&"[object Array]"===_)(m=m.join(k))&&(m=this.extendTranslation(m,n,o,s));else{var M=!1,O=!1,T=void 0!==o.count&&"string"!=typeof o.count,B=t.hasDefaultValue(o),I=T?this.pluralResolver.getSuffix(d,o.count):"",R=o["defaultValue".concat(I)]||o.defaultValue;!this.isValidLookup(m)&&B&&(M=!0,m=R),this.isValidLookup(m)||(O=!0,m=c);var F=B&&R!==m&&this.options.updateMissing;if(O||M||F){if(this.logger.log(F?"updateKey":"missingKey",d,h,c,F?R:m),u){var P=this.resolve(c,i({},o,{keySeparator:!1}));P&&P.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var N=[],L=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if("fallback"===this.options.saveMissingTo&&L&&L[0])for(var z=0;z1&&void 0!==arguments[1]?arguments[1]:{},i,o,s,a,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!n.isValidLookup(i)){var t=n.extractFromKey(e,r),f=t.key;o=f;var c=t.namespaces;n.options.fallbackNS&&(c=c.concat(n.options.fallbackNS));var l=void 0!==r.count&&"string"!=typeof r.count,h=void 0!==r.context&&"string"==typeof r.context&&""!==r.context,d=r.lngs?r.lngs:n.languageUtils.toResolveHierarchy(r.lng||n.language,r.fallbackLng);c.forEach((function(e){n.isValidLookup(i)||(u=e,!M["".concat(d[0],"-").concat(e)]&&n.utils&&n.utils.hasLoadedNamespace&&!n.utils.hasLoadedNamespace(u)&&(M["".concat(d[0],"-").concat(e)]=!0,n.logger.warn('key "'.concat(o,'" for languages "').concat(d.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),d.forEach((function(t){if(!n.isValidLookup(i)){a=t;var o=f,u=[o],c,d;if(n.i18nFormat&&n.i18nFormat.addLookupKeys)n.i18nFormat.addLookupKeys(u,f,t,e,r);else l&&(c=n.pluralResolver.getSuffix(t,r.count)),l&&h&&u.push(o+c),h&&u.push(o+="".concat(n.options.contextSeparator).concat(r.context)),l&&u.push(o+=c);for(;d=u.pop();)n.isValidLookup(i)||(s=d,i=n.getResource(t,e,d,r))}})))}))}})),{res:i,usedKey:o,exactUsedKey:s,usedLng:a,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}}],[{key:"hasDefaultValue",value:function e(t){var n="defaultValue";for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&void 0!==t[r])return!0;return!1}}]),t}(p);function T(e){return e.charAt(0).toUpperCase()+e.slice(1)}var B=function(){function e(t){o(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=d.create("languageUtils")}return s(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var n=t.split("-");return 2===n.length?null:(n.pop(),"x"===n[n.length-1].toLowerCase()?null:this.formatLanguageCode(n.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var n=t.split("-");return this.formatLanguageCode(n[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var n=["hans","hant","latn","cyrl","cans","mong","arab"],r=t.split("-");return this.options.lowerCaseLng?r=r.map((function(e){return e.toLowerCase()})):2===r.length?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase()))):3===r.length&&(r[0]=r[0].toLowerCase(),2===r[1].length&&(r[1]=r[1].toUpperCase()),"sgn"!==r[0]&&2===r[2].length&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=T(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var n=this,r;return t?(t.forEach((function(e){if(!r){var t=n.formatLanguageCode(e);n.options.supportedLngs&&!n.isSupportedCode(t)||(r=t)}})),!r&&this.options.supportedLngs&&t.forEach((function(e){if(!r){var t=n.getLanguagePartFromCode(e);if(n.isSupportedCode(t))return r=t;r=n.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r):null}},{key:"getFallbackCodes",value:function e(t,n){if(!t)return[];if("function"==typeof t&&(t=t(n)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!n)return t.default||[];var r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}},{key:"toResolveHierarchy",value:function e(t,n){var r=this,i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),o=[],s=function e(t){t&&(r.isSupportedCode(t)?o.push(t):r.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&s(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&s(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&s(this.getLanguagePartFromCode(t))):"string"==typeof t&&s(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&s(r.formatLanguageCode(e))})),o}}]),e}(),I=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],R={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function F(){var e={};return I.forEach((function(t){t.lngs.forEach((function(n){e[n]={numbers:t.nr,plurals:R[t.fc]}}))})),e}var P=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.languageUtils=t,this.options=n,this.logger=d.create("pluralResolver"),this.rules=F()}return s(e,[{key:"addRule",value:function e(t,n){this.rules[t]=n}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var n=this.getRule(t);return n&&n.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,n){return this.getSuffixes(t).map((function(e){return n+e}))}},{key:"getSuffixes",value:function e(t){var n=this,r=this.getRule(t);return r?r.numbers.map((function(e){return n.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,n){var r=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(n):i.plurals(Math.abs(n)),s=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===s?s="plural":1===s&&(s=""));var a=function e(){return r.options.prepend&&s.toString()?r.options.prepend+s.toString():s.toString()};return"v1"===this.options.compatibilityJSON?1===s?"":"number"==typeof s?"_plural_".concat(s.toString()):a():"v2"===this.options.compatibilityJSON?a():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?a():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),N=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o(this,e),this.logger=d.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return s(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var n=t.interpolation;this.escape=void 0!==n.escape?n.escape:D,this.escapeValue=void 0===n.escapeValue||n.escapeValue,this.useRawValueToEscape=void 0!==n.useRawValueToEscape&&n.useRawValueToEscape,this.prefix=n.prefix?x(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?x(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?x(n.nestingPrefix):n.nestingPrefixEscaped||x("$t("),this.nestingSuffix=n.nestingSuffix?x(n.nestingSuffix):n.nestingSuffixEscaped||x(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=void 0!==n.alwaysFormat&&n.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var n="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(n,"g");var r="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(r,"g")}},{key:"interpolate",value:function e(t,n,r,i){var o=this,s,a,u,f=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function c(e){return e.replace(/\$/g,"$$$$")}var l=function e(t){if(t.indexOf(o.formatSeparator)<0){var s=k(n,f,t);return o.alwaysFormat?o.format(s,void 0,r):s}var a=t.split(o.formatSeparator),u=a.shift().trim(),c=a.join(o.formatSeparator).trim();return o.format(k(n,f,u),c,r,i)};this.resetRegExp();var h=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,d=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return c(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?c(o.escape(t)):c(t)}}].forEach((function(e){for(u=0;s=e.regex.exec(t);){if(void 0===(a=l(s[1].trim())))if("function"==typeof h){var n=h(t,s,i);a="string"==typeof n?n:""}else{if(d){a=s[0];continue}o.logger.warn("missed to pass in variable ".concat(s[1]," for interpolating ").concat(t)),a=""}else"string"==typeof a||o.useRawValueToEscape||(a=b(a));if(t=t.replace(s[0],e.safeValue(a)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,n){var r=this,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s,a,u=i({},o);function f(e,t){var n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;var r=e.split(new RegExp("".concat(n,"[ ]*{"))),o="{".concat(r[1]);e=r[0],o=(o=this.interpolate(o,u)).replace(/'/g,'"');try{u=JSON.parse(o),t&&(u=i({},t,u))}catch(s){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),s),"".concat(e).concat(n).concat(o)}return delete u.defaultValue,e}for(u.applyPostProcessor=!1,delete u.defaultValue;s=this.nestingRegexp.exec(t);){var c=[],l=!1;if(s[0].includes(this.formatSeparator)&&!/{.*}/.test(s[1])){var h=s[1].split(this.formatSeparator).map((function(e){return e.trim()}));s[1]=h.shift(),c=h,l=!0}if((a=n(f.call(this,s[1].trim(),u),u))&&s[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=b(a)),a||(this.logger.warn("missed to resolve ".concat(s[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return r.format(e,t,o.lng,o)}),a.trim())),t=t.replace(s[0],a),this.regexp.lastIndex=0}return t}}]),e}();function L(e,t){for(var n=e.indexOf(t);-1!==n;)e.splice(n,1),n=e.indexOf(t)}var z=function(e){function t(e,n,r){var i,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return o(this,t),i=a(this,u(t).call(this)),E&&p.call(f(i)),i.backend=e,i.store=n,i.services=r,i.languageUtils=r.languageUtils,i.options=s,i.logger=d.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(r,s.backend,s),i}return c(t,e),s(t,[{key:"queueLoad",value:function e(t,n,r,i){var o=this,s=[],a=[],u=[],f=[];return t.forEach((function(e){var t=!0;n.forEach((function(n){var i="".concat(e,"|").concat(n);!r.reload&&o.store.hasResourceBundle(e,n)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?a.indexOf(i)<0&&a.push(i):(o.state[i]=1,t=!1,a.indexOf(i)<0&&a.push(i),s.indexOf(i)<0&&s.push(i),f.indexOf(n)<0&&f.push(n)))})),t||u.push(e)})),(s.length||a.length)&&this.queue.push({pending:a,loaded:{},errors:[],callback:i}),{toLoad:s,pending:a,toLoadLanguages:u,toLoadNamespaces:f}}},{key:"loaded",value:function e(t,n,r){var i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;var e={};this.queue.forEach((function(r){_(r.loaded,[o],s),L(r.pending,t),n&&r.errors.push(n),0!==r.pending.length||r.done||(Object.keys(r.loaded).forEach((function(t){e[t]||(e[t]=[]),r.loaded[t].length&&r.loaded[t].forEach((function(n){e[t].indexOf(n)<0&&e[t].push(n)}))})),r.done=!0,r.errors.length?r.callback(r.errors):r.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,a=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[r](t,n,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,n,r,o+1,2*s,a)}),s):a(e,u)})):a(null,{})}},{key:"prepareLoading",value:function e(t,n){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof n&&(n=[n]);var s=this.queueLoad(t,n,i,o);if(!s.toLoad.length)return s.pending.length||o(),null;s.toLoad.forEach((function(e){r.loadOne(e)}))}},{key:"load",value:function e(t,n,r){this.prepareLoading(t,n,{},r)}},{key:"reload",value:function e(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}},{key:"loadOne",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],s=i[1];this.read(o,s,"read",void 0,void 0,(function(e,i){e&&n.logger.warn("".concat(r,"loading namespace ").concat(s," for language ").concat(o," failed"),e),!e&&i&&n.logger.log("".concat(r,"loaded namespace ").concat(s," for language ").concat(o),i),n.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)?this.logger.warn('did not save key "'.concat(r,'" as the namespace "').concat(n,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=r&&""!==r&&(this.backend&&this.backend.create&&this.backend.create(t,n,r,o,null,i({},a,{isUpdate:s})),t&&t[0]&&this.store.addResource(t[0],n,r,o))}}]),t}(p);function U(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var n={};if("object"===r(t[1])&&(n=t[1]),"string"==typeof t[1]&&(n.defaultValue=t[1]),"string"==typeof t[2]&&(n.tDescription=t[2]),"object"===r(t[2])||"object"===r(t[3])){var i=t[3]||t[2];Object.keys(i).forEach((function(e){n[e]=i[e]}))}return n},interpolation:{escapeValue:!0,format:function e(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function q(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function $(){}var W,H=new(function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(o(this,t),e=a(this,u(t).call(this)),E&&p.call(f(e)),e.options=q(n),e.services={},e.logger=d,e.modules={external:[]},r&&!e.isInitialized&&!n.isClone){if(!e.options.initImmediate)return e.init(n,r),a(e,f(e));setTimeout((function(){e.init(n,r)}),0)}return e}return c(t,e),s(t,[{key:"init",value:function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;function o(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof n&&(r=n,n={}),n.whitelist&&!n.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),n.nonExplicitWhitelist&&!n.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=i({},U(),this.options,q(n)),this.format=this.options.interpolation.format,r||(r=$),!this.options.isClone){this.modules.logger?d.init(o(this.modules.logger),this.options):d.init(null,this.options);var s=new B(this.options);this.store=new A(this.options.resources,this.options);var a=this.services;a.logger=d,a.resourceStore=this.store,a.languageUtils=s,a.pluralResolver=new P(s,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new N(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new z(o(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i1?n-1:0),i=1;i0&&"dev"!==u[0]&&(this.options.lng=u[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var f=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];f.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments),t}}));var l=g(),h=function e(){var n=function e(n,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),r(n,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return n(null,t.t.bind(t));t.changeLanguage(t.options.lng,n)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),l}},{key:"loadResources",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,i=r,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var s=[],a=function e(t){var r;t&&n.services.languageUtils.toResolveHierarchy(t).forEach((function(e){s.indexOf(e)<0&&s.push(e)}))};if(o)a(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return a(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return a(e)})),this.services.backendConnector.load(s,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,n,r){var i=g();return t||(t=this.languages),n||(n=this.options.ns),r||(r=$),this.services.backendConnector.reload(t,n,(function(e){i.resolve(),r(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&C.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,n){var r=this;this.isLanguageChangingTo=t;var i=g();this.emit("languageChanging",t);var o=function e(t,o){o?(r.language=o,r.languages=r.services.languageUtils.toResolveHierarchy(o),r.translator.changeLanguage(o),r.isLanguageChangingTo=void 0,r.emit("languageChanged",o),r.logger.log("languageChanged",o)):r.isLanguageChangingTo=void 0,i.resolve((function(){return r.t.apply(r,arguments)})),n&&n(t,(function(){return r.t.apply(r,arguments)}))},s=function e(t){var n="string"==typeof t?t:r.services.languageUtils.getBestMatchFromCodes(t);n&&(r.language||(r.language=n,r.languages=r.services.languageUtils.toResolveHierarchy(n)),r.translator.language||r.translator.changeLanguage(n),r.services.languageDetector&&r.services.languageDetector.cacheUserLanguage(n)),r.loadResources(n,(function(e){o(e,n)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(s):s(t):s(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,n){var o=this,s=function e(t,n){var s;if("object"!==r(n)){for(var a=arguments.length,u=new Array(a>2?a-2:0),f=2;f1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,s=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var a=function e(t,r){var i=n.services.backendConnector.state["".concat(t,"|").concat(r)];return-1===i||2===i};if(r.precheck){var u=r.precheck(this,a);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!a(i,t)||o&&!a(s,t)))}},{key:"loadNamespaces",value:function e(t,n){var r=this,i=g();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){r.options.ns.indexOf(e)<0&&r.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),n&&n(e)})),i):(n&&n(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,n){var r=g();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){r.resolve(),n&&n(e)})),r):(n&&n(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var n}},{key:"createInstance",value:function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;return new t(n,r)}},{key:"cloneInstance",value:function e(){var n=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,s=i({},this.options,r,{isClone:!0}),a=new t(s),u=["store","services","language"];return u.forEach((function(e){a[e]=n[e]})),a.services=i({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new O(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rr,root:()=>i,ArrayProto:()=>o,ObjProto:()=>s,SymbolProto:()=>a,push:()=>u,slice:()=>f,toString:()=>c,hasOwnProperty:()=>l,supportsArrayBuffer:()=>h,supportsDataView:()=>d,nativeIsArray:()=>p,nativeKeys:()=>g,nativeCreate:()=>b,nativeIsView:()=>m,_isNaN:()=>v,_isFinite:()=>y,hasEnumBug:()=>_,nonEnumerableProps:()=>w,MAX_ARRAY_INDEX:()=>k});var r="1.13.4",i="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},o=Array.prototype,s=Object.prototype,a="undefined"!=typeof Symbol?Symbol.prototype:null,u=o.push,f=o.slice,c=s.toString,l=s.hasOwnProperty,h="undefined"!=typeof ArrayBuffer,d="undefined"!=typeof DataView,p=Array.isArray,g=Object.keys,b=Object.create,m=h&&ArrayBuffer.isView,v=isNaN,y=isFinite,_=!{toString:null}.propertyIsEnumerable("toString"),w=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=Math.pow(2,53)-1},"restArguments.js":function e(t,n,e){function r(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;ir})},"isObject.js":function e(t,n,e){function r(e){var t=typeof e;return"function"===t||"object"===t&&!!e}e.export({default:()=>r})},"isNull.js":function e(t,n,e){function r(e){return null===e}e.export({default:()=>r})},"isUndefined.js":function e(t,n,e){function r(e){return void 0===e}e.export({default:()=>r})},"isBoolean.js":function e(t,n,e){let r;function i(e){return!0===e||!1===e||"[object Boolean]"===r.call(e)}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isElement.js":function e(t,n,e){function r(e){return!(!e||1!==e.nodeType)}e.export({default:()=>r})},"isString.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("String"))},"_tagTester.js":function e(t,n,e){let r;function i(e){var t="[object "+e+"]";return function(e){return r.call(e)===t}}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isNumber.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Number"))},"isDate.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Date"))},"isRegExp.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("RegExp"))},"isError.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Error"))},"isSymbol.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Symbol"))},"isArrayBuffer.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("ArrayBuffer"))},"isDataView.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isArrayBuffer.js",{default(e){o=e}},2),e.link("./_stringTagBug.js",{hasStringTagBug(e){s=e}},3);var a=r("DataView");function u(e){return null!=e&&i(e.getInt8)&&o(e.buffer)}e.exportDefault(s?u:a)},"isFunction.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_setup.js",{root(e){i=e}},1);var o=r("Function"),s=i.document&&i.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof s&&(o=function(e){return"function"==typeof e||!1}),e.exportDefault(o)},"_stringTagBug.js":function e(t,n,e){let r,i;e.export({hasStringTagBug:()=>o,isIE11:()=>s}),e.link("./_setup.js",{supportsDataView(e){r=e}},0),e.link("./_hasObjectTag.js",{default(e){i=e}},1);var o=r&&i(new DataView(new ArrayBuffer(8))),s="undefined"!=typeof Map&&i(new Map)},"_hasObjectTag.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Object"))},"isArray.js":function e(t,n,e){let r,i;e.link("./_setup.js",{nativeIsArray(e){r=e}},0),e.link("./_tagTester.js",{default(e){i=e}},1),e.exportDefault(r||i("Array"))},"isArguments.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1);var o=r("Arguments");!function(){o(arguments)||(o=function(e){return i(e,"callee")})}(),e.exportDefault(o)},"_has.js":function e(t,n,e){let r;function i(e,t){return null!=e&&r.call(e,t)}e.export({default:()=>i}),e.link("./_setup.js",{hasOwnProperty(e){r=e}},0)},"isFinite.js":function e(t,n,e){let r,i;function o(e){return!i(e)&&r(e)&&!isNaN(parseFloat(e))}e.export({default:()=>o}),e.link("./_setup.js",{_isFinite(e){r=e}},0),e.link("./isSymbol.js",{default(e){i=e}},1)},"isNaN.js":function e(t,n,e){let r,i;function o(e){return i(e)&&r(e)}e.export({default:()=>o}),e.link("./_setup.js",{_isNaN(e){r=e}},0),e.link("./isNumber.js",{default(e){i=e}},1)},"isTypedArray.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./_setup.js",{supportsArrayBuffer(e){r=e},nativeIsView(e){i=e},toString(e){o=e}},0),e.link("./isDataView.js",{default(e){s=e}},1),e.link("./constant.js",{default(e){a=e}},2),e.link("./_isBufferLike.js",{default(e){u=e}},3);var f=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function c(e){return i?i(e)&&!s(e):u(e)&&f.test(o.call(e))}e.exportDefault(r?c:a(!1))},"constant.js":function e(t,n,e){function r(e){return function(){return e}}e.export({default:()=>r})},"_isBufferLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getByteLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createSizePropertyCheck.js":function e(t,n,e){let r;function i(e){return function(t){var n=e(t);return"number"==typeof n&&n>=0&&n<=r}}e.export({default:()=>i}),e.link("./_setup.js",{MAX_ARRAY_INDEX(e){r=e}},0)},"_getByteLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("byteLength"))},"_shallowProperty.js":function e(t,n,e){function r(e){return function(t){return null==t?void 0:t[e]}}e.export({default:()=>r})},"isEmpty.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(null==e)return!0;var t=r(e);return"number"==typeof t&&(i(e)||o(e)||s(e))?0===t:0===r(a(e))}e.export({default:()=>u}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3),e.link("./keys.js",{default(e){a=e}},4)},"_getLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("length"))},"keys.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(!r(e))return[];if(i)return i(e);var t=[];for(var n in e)s(e,n)&&t.push(n);return o&&a(e,t),t}e.export({default:()=>u}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeKeys(e){i=e},hasEnumBug(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2),e.link("./_collectNonEnumProps.js",{default(e){a=e}},3)},"_collectNonEnumProps.js":function e(t,n,e){let r,i,o,s;function a(e){for(var t={},n=e.length,r=0;ru}),e.link("./_setup.js",{nonEnumerableProps(e){r=e},ObjProto(e){i=e}},0),e.link("./isFunction.js",{default(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2)},"isMatch.js":function e(t,n,e){let r;function i(e,t){var n=r(t),i=n.length;if(null==e)return!i;for(var o=Object(e),s=0;si}),e.link("./keys.js",{default(e){r=e}},0)},"isEqual.js":function e(t,n,e){let r,i,o,s,a,u,f,c,l,h,d;e.export({default:()=>m}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_setup.js",{toString(e){i=e},SymbolProto(e){o=e}},1),e.link("./_getByteLength.js",{default(e){s=e}},2),e.link("./isTypedArray.js",{default(e){a=e}},3),e.link("./isFunction.js",{default(e){u=e}},4),e.link("./_stringTagBug.js",{hasStringTagBug(e){f=e}},5),e.link("./isDataView.js",{default(e){c=e}},6),e.link("./keys.js",{default(e){l=e}},7),e.link("./_has.js",{default(e){h=e}},8),e.link("./_toBufferView.js",{default(e){d=e}},9);var p="[object DataView]";function g(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return!1;if(e!=e)return t!=t;var i=typeof e;return("function"===i||"object"===i||"object"==typeof t)&&b(e,t,n,r)}function b(e,t,n,m){e instanceof r&&(e=e._wrapped),t instanceof r&&(t=t._wrapped);var v=i.call(e);if(v!==i.call(t))return!1;if(f&&"[object Object]"==v&&c(e)){if(!c(t))return!1;v=p}switch(v){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object Symbol]":return o.valueOf.call(e)===o.valueOf.call(t);case"[object ArrayBuffer]":case p:return b(d(e),d(t),n,m)}var y="[object Array]"===v;if(!y&&a(e)){var _;if(s(e)!==s(t))return!1;if(e.buffer===t.buffer&&e.byteOffset===t.byteOffset)return!0;y=!0}if(!y){if("object"!=typeof e||"object"!=typeof t)return!1;var w=e.constructor,k=t.constructor;if(w!==k&&!(u(w)&&w instanceof w&&u(k)&&k instanceof k)&&"constructor"in e&&"constructor"in t)return!1}m=m||[];for(var j=(n=n||[]).length;j--;)if(n[j]===e)return m[j]===t;if(n.push(e),m.push(t),y){if((j=e.length)!==t.length)return!1;for(;j--;)if(!g(e[j],t[j],n,m))return!1}else{var x=l(e),S;if(j=x.length,l(t).length!==j)return!1;for(;j--;)if(S=x[j],!h(t,S)||!g(e[S],t[S],n,m))return!1}return n.pop(),m.pop(),!0}function m(e,t){return g(e,t)}},"underscore.js":function e(t,n,e){let r;function i(e){return e instanceof i?e:this instanceof i?void(this._wrapped=e):new i(e)}e.export({default:()=>i}),e.link("./_setup.js",{VERSION(e){r=e}},0),i.VERSION=r,i.prototype.value=function(){return this._wrapped},i.prototype.valueOf=i.prototype.toJSON=i.prototype.value,i.prototype.toString=function(){return String(this._wrapped)}},"_toBufferView.js":function e(t,n,e){let r;function i(e){return new Uint8Array(e.buffer||e,e.byteOffset||0,r(e))}e.export({default:()=>i}),e.link("./_getByteLength.js",{default(e){r=e}},0)},"isMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},mapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Map"))},"_methodFingerprint.js":function e(t,n,e){let r,i,o;function s(e){var t=r(e);return function(n){if(null==n)return!1;var s=o(n);if(r(s))return!1;for(var u=0;us,mapMethods:()=>l,weakMapMethods:()=>h,setMethods:()=>d}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./allKeys.js",{default(e){o=e}},2);var a="forEach",u="has",f=["clear","delete"],c=["get","has","set"],l=f.concat(a,c),h=f.concat(c),d=["add"].concat(f,a,"has")},"allKeys.js":function e(t,n,e){let r,i,o;function s(e){if(!r(e))return[];var t=[];for(var n in e)t.push(n);return i&&o(e,t),t}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{hasEnumBug(e){i=e}},1),e.link("./_collectNonEnumProps.js",{default(e){o=e}},2)},"isWeakMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},weakMapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("WeakMap"))},"isSet.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},setMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Set"))},"isWeakSet.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("WeakSet"))},"values.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"pairs.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"invert.js":function e(t,n,e){let r;function i(e){for(var t={},n=r(e),i=0,o=n.length;ii}),e.link("./keys.js",{default(e){r=e}},0)},"functions.js":function e(t,n,e){let r;function i(e){var t=[];for(var n in e)r(e[n])&&t.push(n);return t.sort()}e.export({default:()=>i}),e.link("./isFunction.js",{default(e){r=e}},0)},"extend.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createAssigner.js":function e(t,n,e){function r(e,t){return function(n){var r=arguments.length;if(t&&(n=Object(n)),r<2||null==n)return n;for(var i=1;ir})},"extendOwn.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"defaults.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i,!0))},"create.js":function e(t,n,e){let r,i;function o(e,t){var n=r(e);return t&&i(n,t),n}e.export({default:()=>o}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./extendOwn.js",{default(e){i=e}},1)},"_baseCreate.js":function e(t,n,e){let r,i;function o(){return function(){}}function s(e){if(!r(e))return{};if(i)return i(e);var t=function(){};t.prototype=e;var n=new t;return t.prototype=null,n}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeCreate(e){i=e}},1)},"clone.js":function e(t,n,e){let r,i,o;function s(e){return r(e)?i(e)?e.slice():o({},e):e}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./extend.js",{default(e){o=e}},2)},"tap.js":function e(t,n,e){function r(e,t){return t(e),e}e.export({default:()=>r})},"get.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=i(e,r(t));return o(s)?n:s}e.export({default:()=>s}),e.link("./_toPath.js",{default(e){r=e}},0),e.link("./_deepGet.js",{default(e){i=e}},1),e.link("./isUndefined.js",{default(e){o=e}},2)},"_toPath.js":function e(t,n,e){let r;function i(e){return r.toPath(e)}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./toPath.js")},"toPath.js":function e(t,n,e){let r,i;function o(e){return i(e)?e:[e]}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),r.toPath=o},"_deepGet.js":function e(t,n,e){function r(e,t){for(var n=t.length,r=0;rr})},"has.js":function e(t,n,e){let r,i;function o(e,t){for(var n=(t=i(t)).length,o=0;oo}),e.link("./_has.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"mapObject.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s=o.length,a={},u=0;uo}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"_cb.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r.iteratee!==o?r.iteratee(e,t):i(e,t,n)}e.export({default:()=>s}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),e.link("./iteratee.js",{default(e){o=e}},2)},"_baseIteratee.js":function e(t,n,e){let r,i,o,s,a,u,f;function c(e,t,n){return null==e?r:i(e)?f(e,t,n):o(e)&&!s(e)?a(e):u(e)}e.export({default:()=>c}),e.link("./identity.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isObject.js",{default(e){o=e}},2),e.link("./isArray.js",{default(e){s=e}},3),e.link("./matcher.js",{default(e){a=e}},4),e.link("./property.js",{default(e){u=e}},5),e.link("./_optimizeCb.js",{default(e){f=e}},6)},"identity.js":function e(t,n,e){function r(e){return e}e.export({default:()=>r})},"matcher.js":function e(t,n,e){let r,i;function o(e){return e=r({},e),function(t){return i(t,e)}}e.export({default:()=>o}),e.link("./extendOwn.js",{default(e){r=e}},0),e.link("./isMatch.js",{default(e){i=e}},1)},"property.js":function e(t,n,e){let r,i;function o(e){return e=i(e),function(t){return r(t,e)}}e.export({default:()=>o}),e.link("./_deepGet.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"_optimizeCb.js":function e(t,n,e){function r(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,o){return e.call(t,n,r,i,o)}}return function(){return e.apply(t,arguments)}}e.export({default:()=>r})},"iteratee.js":function e(t,n,e){let r,i;function o(e,t){return i(e,t,1/0)}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),r.iteratee=o},"noop.js":function e(t,n,e){function r(){}e.export({default:()=>r})},"propertyOf.js":function e(t,n,e){let r,i;function o(e){return null==e?r:function(t){return i(e,t)}}e.export({default:()=>o}),e.link("./noop.js",{default(e){r=e}},0),e.link("./get.js",{default(e){i=e}},1)},"times.js":function e(t,n,e){let r;function i(e,t,n){var i=Array(Math.max(0,e));t=r(t,n,1);for(var o=0;oi}),e.link("./_optimizeCb.js",{default(e){r=e}},0)},"random.js":function e(t,n,e){function r(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))}e.export({default:()=>r})},"now.js":function e(t,n,e){e.exportDefault(Date.now||function(){return(new Date).getTime()})},"escape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createEscaper.js":function e(t,n,e){let r;function i(e){var t=function(t){return e[t]},n="(?:"+r(e).join("|")+")",i=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":""+e,i.test(e)?e.replace(o,t):e}}e.export({default:()=>i}),e.link("./keys.js",{default(e){r=e}},0)},"_escapeMap.js":function e(t,n,e){e.exportDefault({"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"})},"unescape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_unescapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_unescapeMap.js":function e(t,n,e){let r,i;e.link("./invert.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"templateSettings.js":function e(t,n,e){let r;e.link("./underscore.js",{default(e){r=e}},0),e.exportDefault(r.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g})},"template.js":function e(t,n,e){let r,i;e.export({default:()=>c}),e.link("./defaults.js",{default(e){r=e}},0),e.link("./underscore.js",{default(e){i=e}},1),e.link("./templateSettings.js");var o=/(.)^/,s={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},a=/\\|'|\r|\n|\u2028|\u2029/g;function u(e){return"\\"+s[e]}var f=/^\s*(\w|\$)+\s*$/;function c(e,t,n){!t&&n&&(t=n),t=r({},t,i.templateSettings);var s=RegExp([(t.escape||o).source,(t.interpolate||o).source,(t.evaluate||o).source].join("|")+"|$","g"),c=0,l="__p+='";e.replace(s,(function(t,n,r,i,o){return l+=e.slice(c,o).replace(a,u),c=o+t.length,n?l+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?l+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(l+="';\n"+i+"\n__p+='"),t})),l+="';\n";var h=t.variable,d;if(h){if(!f.test(h))throw new Error("variable is not a bare identifier: "+h)}else l="with(obj||{}){\n"+l+"}\n",h="obj";l="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+l+"return __p;\n";try{d=new Function(h,"_",l)}catch(g){throw g.source=l,g}var p=function(e){return d.call(this,e,i)};return p.source="function("+h+"){\n"+l+"}",p}},"result.js":function e(t,n,e){let r,i;function o(e,t,n){var o=(t=i(t)).length;if(!o)return r(n)?n.call(e):n;for(var s=0;so}),e.link("./isFunction.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"uniqueId.js":function e(t,n,e){e.export({default:()=>i});var r=0;function i(e){var t=++r+"";return e?e+t:t}},"chain.js":function e(t,n,e){let r;function i(e){var t=r(e);return t._chain=!0,t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"partial.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_executeBound.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2);var s=r((function(e,t){var n=s.placeholder,r=function(){for(var o=0,s=t.length,a=Array(s),u=0;uo}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./isObject.js",{default(e){i=e}},1)},"bind.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_executeBound.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t,n){if(!i(e))throw new TypeError("Bind must be called on a function");var s=r((function(r){return o(e,s,t,this,n.concat(r))}));return s})))},"bindAll.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./bind.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t){var n=(t=i(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=o(e[r],e)}return e})))},"_flatten.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,u){if(u=u||[],t||0===t){if(t<=0)return u.concat(e)}else t=1/0;for(var f=u.length,c=0,l=r(e);c1)a(h,t-1,n,u),f=u.length;else for(var d=0,p=h.length;da}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&us}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isNaN.js",{default(e){o=e}},2)},"lastIndexOf.js":function e(t,n,e){let r,i;e.link("./findLastIndex.js",{default(e){r=e}},0),e.link("./_createIndexFinder.js",{default(e){i=e}},1),e.exportDefault(i(-1,r))},"find.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a=(r(e)?i:o)(e,t,n);if(void 0!==a&&-1!==a)return e[a]}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./findKey.js",{default(e){o=e}},2)},"findWhere.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./find.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"each.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a;if(t=r(t,n),i(e))for(s=0,a=e.length;ss}),e.link("./_optimizeCb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"map.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=Array(a),f=0;fs}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"reduce.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createReduce.js":function e(t,n,e){let r,i,o;function s(e){var t=function(t,n,o,s){var a=!r(t)&&i(t),u=(a||t).length,f=e>0?0:u-1;for(s||(o=t[a?a[f]:f],f+=e);f>=0&&f=3;return t(e,o(n,i,4),r,s)}}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2)},"reduceRight.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"filter.js":function e(t,n,e){let r,i;function o(e,t,n){var o=[];return t=r(t,n),i(e,(function(e,n,r){t(e,n,r)&&o.push(e)})),o}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"reject.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r(e,i(o(t)),n)}e.export({default:()=>s}),e.link("./filter.js",{default(e){r=e}},0),e.link("./negate.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2)},"every.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"some.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"contains.js":function e(t,n,e){let r,i,o;function s(e,t,n,s){return r(e)||(e=i(e)),("number"!=typeof n||s)&&(n=0),o(e,t,n)>=0}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./indexOf.js",{default(e){o=e}},2)},"invoke.js":function e(t,n,e){let r,i,o,s,a;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2),e.link("./_deepGet.js",{default(e){s=e}},3),e.link("./_toPath.js",{default(e){a=e}},4),e.exportDefault(r((function(e,t,n){var r,u;return i(t)?u=t:(t=a(t),r=t.slice(0,-1),t=t[t.length-1]),o(e,(function(e){var i=u;if(!i){if(r&&r.length&&(e=s(e,r)),null==e)return;i=e[t]}return null==i?i:i.apply(e,n)}))})))},"pluck.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./map.js",{default(e){r=e}},0),e.link("./property.js",{default(e){i=e}},1)},"where.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./filter.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"max.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=-1/0,u=-1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la&&(a=f);else t=o(t,n),s(e,(function(e,n,r){((c=t(e,n,r))>u||c===-1/0&&a===-1/0)&&(a=e,u=c)}));return a}e.export({default:()=>a}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"min.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=1/0,u=1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"shuffle.js":function e(t,n,e){let r;function i(e){return r(e,1/0)}e.export({default:()=>i}),e.link("./sample.js",{default(e){r=e}},0)},"sample.js":function e(t,n,e){let r,i,o,s,a;function u(e,t,n){if(null==t||n)return r(e)||(e=i(e)),e[s(e.length-1)];var u=a(e),f=o(u);t=Math.max(Math.min(t,f),0);for(var c=f-1,l=0;lu}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./random.js",{default(e){s=e}},3),e.link("./toArray.js",{default(e){a=e}},4)},"toArray.js":function e(t,n,e){let r,i,o,s,a,u,f;e.export({default:()=>l}),e.link("./isArray.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./_isArrayLike.js",{default(e){s=e}},3),e.link("./map.js",{default(e){a=e}},4),e.link("./identity.js",{default(e){u=e}},5),e.link("./values.js",{default(e){f=e}},6);var c=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function l(e){return e?r(e)?i.call(e):o(e)?e.match(c):s(e)?a(e,u):f(e):[]}},"sortBy.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=0;return t=r(t,n),i(o(e,(function(e,n,r){return{value:e,index:s++,criteria:t(e,n,r)}})).sort((function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||void 0===n)return 1;if(ns}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./pluck.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2)},"groupBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n].push(t):e[n]=[t]})))},"_group.js":function e(t,n,e){let r,i;function o(e,t){return function(n,o,s){var a=t?[[],[]]:{};return o=r(o,s),i(n,(function(t,r){var i=o(t,r,n);e(a,t,i)})),a}}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"indexBy.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n]=t})))},"countBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n]++:e[n]=1})))},"partition.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n?0:1].push(t)}),!0))},"size.js":function e(t,n,e){let r,i;function o(e){return null==e?0:r(e)?e.length:i(e).length}e.export({default:()=>o}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"pick.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2),e.link("./allKeys.js",{default(e){s=e}},3),e.link("./_keyInObj.js",{default(e){a=e}},4),e.link("./_flatten.js",{default(e){u=e}},5),e.exportDefault(r((function(e,t){var n={},r=t[0];if(null==e)return n;i(r)?(t.length>1&&(r=o(r,t[1])),t=s(e)):(r=a,t=u(t,!1,!1),e=Object(e));for(var f=0,c=t.length;fr})},"omit.js":function e(t,n,e){let r,i,o,s,a,u,f;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./negate.js",{default(e){o=e}},2),e.link("./map.js",{default(e){s=e}},3),e.link("./_flatten.js",{default(e){a=e}},4),e.link("./contains.js",{default(e){u=e}},5),e.link("./pick.js",{default(e){f=e}},6),e.exportDefault(r((function(e,t){var n=t[0],r;return i(n)?(n=o(n),t.length>1&&(r=t[1])):(t=s(a(t,!1,!1),String),n=function(e,n){return!u(t,n)}),f(e,n,r)})))},"first.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:r(e,e.length-t)}e.export({default:()=>i}),e.link("./initial.js",{default(e){r=e}},0)},"initial.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"last.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:r(e,Math.max(0,e.length-t))}e.export({default:()=>i}),e.link("./rest.js",{default(e){r=e}},0)},"rest.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,null==t||n?1:t)}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"compact.js":function e(t,n,e){let r;function i(e){return r(e,Boolean)}e.export({default:()=>i}),e.link("./filter.js",{default(e){r=e}},0)},"flatten.js":function e(t,n,e){let r;function i(e,t){return r(e,t,!1)}e.export({default:()=>i}),e.link("./_flatten.js",{default(e){r=e}},0)},"without.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./difference.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t){return i(e,t)})))},"difference.js":function e(t,n,e){let r,i,o,s;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./filter.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3),e.exportDefault(r((function(e,t){return t=i(t,!0,!0),o(e,(function(e){return!s(t,e)}))})))},"uniq.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,a){r(t)||(a=n,n=t,t=!1),null!=n&&(n=i(n,a));for(var u=[],f=[],c=0,l=o(e);ca}),e.link("./isBoolean.js",{default(e){r=e}},0),e.link("./_cb.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3)},"union.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./uniq.js",{default(e){i=e}},1),e.link("./_flatten.js",{default(e){o=e}},2),e.exportDefault(r((function(e){return i(o(e,!0,!0))})))},"intersection.js":function e(t,n,e){let r,i;function o(e){for(var t=[],n=arguments.length,o=0,s=r(e);oo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;ss}),e.link("./max.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.link("./pluck.js",{default(e){o=e}},2)},"zip.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./unzip.js",{default(e){i=e}},1),e.exportDefault(r(i))},"object.js":function e(t,n,e){let r;function i(e,t){for(var n={},i=0,o=r(e);ii}),e.link("./_getLength.js",{default(e){r=e}},0)},"range.js":function e(t,n,e){function r(e,t,n){null==t&&(t=e||0,e=0),n||(n=tr})},"chunk.js":function e(t,n,e){let r;function i(e,t){if(null==t||t<1)return[];for(var n=[],i=0,o=e.length;ii}),e.link("./_setup.js",{slice(e){r=e}},0)},"mixin.js":function e(t,n,e){let r,i,o,s,a;function u(e){return i(o(e),(function(t){var n=r[t]=e[t];r.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),a(this,n.apply(r,e))}})),r}e.export({default:()=>u}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./functions.js",{default(e){o=e}},2),e.link("./_setup.js",{push(e){s=e}},3),e.link("./_chainResult.js",{default(e){a=e}},4)},"_chainResult.js":function e(t,n,e){let r;function i(e,t){return e._chain?r(t).chain():t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"underscore-array-methods.js":function e(t,n,e){let r,i,o,s;e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./_setup.js",{ArrayProto(e){o=e}},2),e.link("./_chainResult.js",{default(e){s=e}},3),i(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=o[e];r.prototype[e]=function(){var n=this._wrapped;return null!=n&&(t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0]),s(this,n)}})),i(["concat","join","slice"],(function(e){var t=o[e];r.prototype[e]=function(){var e=this._wrapped;return null!=e&&(e=t.apply(e,arguments)),s(this,e)}})),e.exportDefault(r)}}}}},cachers:{"package.json":function e(t,n,e){e.exports={name:"@steedos/cachers",version:"2.7.4-beta.1",main:"lib/index.js"}},lib:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getCacherNames=n.clearCacher=n.getCacher=void 0;var r={},i=t("./memory"),o=t("./memory-lru"),s=function(e,t){return r[e]||(e.startsWith("lru.")?r[e]=new o.MemoryLRUCacher(t):r[e]=new i.MemoryCacher),r[e]};n.getCacher=s;var a=function(e){r[e]&&r[e].clear()};n.clearCacher=a;var u=function(){return Object.keys(r)};n.getCacherNames=u},"memory.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryCacher=void 0;var r=t("lodash"),i=function(){function e(){this.cache={}}return e.prototype.get=function(e){return this.cache[e]},e.prototype.delete=function(e){delete this.cache[e]},e.prototype.set=function(e,t){this.cache[e]=t},e.prototype.clear=function(){this.cache={}},e.prototype.keys=function(){return(0,r.keys)(this.cache)},e.prototype.values=function(){return(0,r.values)(this.cache)},e}();n.MemoryCacher=i},"memory-lru.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryLRUCacher=void 0;var r=t("lodash"),i=t("lru-cache"),o={max:5e3,ttl:null,keygen:null,maxParamsLength:null},s=function(){function e(e){this.opts=(0,r.defaultsDeep)(e,o),this.cache=new i({max:this.opts.max,maxAge:this.opts.ttl?1e3*this.opts.ttl:null,updateAgeOnGet:!!this.opts.ttl})}return e.prototype.get=function(e){return this.cache.get(e)},e.prototype.set=function(e,t,n){return this.cache.set(e,t,n)},e.prototype.delete=function(e){return this.cache.delete(e)},e.prototype.clear=function(){return this.cache.clear()},e.prototype.keys=function(){return this.cache.keys()},e.prototype.values=function(){return this.cache.values()},e}();n.MemoryLRUCacher=s}},node_modules:{"lru-cache":{"package.json":function e(t,n,e){e.exports={name:"lru-cache",version:"7.14.1",main:"index.js"}},"index.js":function e(t,n,e){const r="object"==typeof performance&&performance&&"function"==typeof performance.now?performance:Date,i="function"==typeof AbortController,o=i?AbortController:class e{constructor(){this.signal=new u}abort(){this.signal.dispatchEvent("abort")}},s="function"==typeof AbortSignal,a="function"==typeof o.AbortSignal,u=s?AbortSignal:a?o.AbortController:class e{constructor(){this.aborted=!1,this._listeners=[]}dispatchEvent(e){if("abort"===e){this.aborted=!0;const t={type:e,target:this};this.onabort(t),this._listeners.forEach(e=>e(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},f=new Set,c=(e,t)=>{const n=`LRU_CACHE_OPTION_${e}`;p(n)&&g(n,`${e} option`,`options.${t}`,_)},l=(e,t)=>{const n=`LRU_CACHE_METHOD_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} method`,`cache.${t}()`,i)}},h=(e,t)=>{const n=`LRU_CACHE_PROPERTY_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} property`,`cache.${t}`,i)}},d=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!f.has(e),g=(e,t,n,r)=>{f.add(e);const i=`The ${t} is deprecated. Please use ${n} instead.`;d(i,"DeprecationWarning",e,r)},b=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),m=e=>b(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=m(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class _{constructor(e={}){const{max:t=0,ttl:n,ttlResolution:r=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:s,allowStale:a,dispose:u,disposeAfter:l,noDisposeOnSet:h,noUpdateTTL:g,maxSize:v=0,maxEntrySize:w=0,sizeCalculation:k,fetchMethod:j,fetchContext:x,noDeleteOnFetchRejection:S,noDeleteOnStaleGet:D}=e,{length:E,maxAge:A,stale:C}=e instanceof _?{}:e;if(0!==t&&!b(t))throw new TypeError("max option must be a nonnegative integer");const M=t?m(t):Array;if(!M)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=w||this.maxSize,this.sizeCalculation=k||E,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=j||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=x,!this.fetchMethod&&void 0!==x)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new M(t),this.prev=new M(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof l?(this.disposeAfter=l,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!h,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!S,0!==this.maxEntrySize){if(0!==this.maxSize&&!b(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!b(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!a||!!C,this.noDeleteOnStaleGet=!!D,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!s,this.ttlResolution=b(r)||0===r?r:1,this.ttlAutopurge=!!i,this.ttl=n||A||0,this.ttl){if(!b(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){f.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";d(t,"UnboundedCacheWarning",e,_)}}C&&c("stale","allowStale"),A&&c("maxAge","ttl"),E&&c("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,n=r.now())=>{if(this.starts[e]=0!==t?n:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const n=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);n.unref&&n.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?r.now():0};let e=0;const t=()=>{const t=r.now();if(this.ttlResolution>0){e=t;const n=setTimeout(()=>e=0,this.ttlResolution);n.unref&&n.unref()}return t};this.getRemainingTTL=n=>{const r=this.keyMap.get(n);return void 0===r?0:0===this.ttls[r]||0===this.starts[r]?1/0:this.starts[r]+this.ttls[r]-(e||t())},this.isStale=n=>0!==this.ttls[n]&&0!==this.starts[n]&&(e||t())-this.starts[n]>this.ttls[n]}updateItemAge(e){}setItemTTL(e,t,n){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,n,r)=>{if(this.isBackgroundFetch(t))return 0;if(!b(n)){if(!r)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof r)throw new TypeError("sizeCalculation must be a function");if(n=r(t,e),!b(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return n},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,n,r){if(n||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const n of this.indexes())if(e(this.valList[n],this.keyList[n],this))return this.get(this.keyList[n],t)}forEach(e,t=this){for(const n of this.indexes())e.call(t,this.valList[n],this.keyList[n],this)}rforEach(e,t=this){for(const n of this.rindexes())e.call(t,this.valList[n],this.keyList[n],this)}get prune(){return l("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const n=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,s={value:o};if(this.ttls){s.ttl=this.ttls[t];const e=r.now()-this.starts[t];s.start=Math.floor(Date.now()-e)}this.sizes&&(s.size=this.sizes[t]),e.unshift([n,s])}return e}load(e){this.clear();for(const[t,n]of e){if(n.start){const e=Date.now()-n.start;n.start=r.now()-e}this.set(t,n.value,n)}}dispose(e,t,n){}set(e,t,{ttl:n=this.ttl,start:r,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:a=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,s),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),a=!1;else{const n=this.valList[u];t!==n&&(this.isBackgroundFetch(n)?n.__abortController.abort():i||(this.dispose(n,e,"set"),this.disposeAfter&&this.disposed.push([n,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===n||0!==this.ttl||this.ttls||this.initializeTTLTracking(),a||this.setItemTTL(u,n,r),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,n=this.keyList[t],r=this.valList[t];return this.isBackgroundFetch(r)?r.__abortController.abort():(this.dispose(r,n,"evict"),this.disposeAfter&&this.disposed.push([r,n,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(n),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const n=this.keyMap.get(e);return void 0!==n&&!this.isStale(n)&&(t&&this.updateItemAge(n),!0)}peek(e,{allowStale:t=this.allowStale}={}){const n=this.keyMap.get(e);if(void 0!==n&&(t||!this.isStale(n))){const e=this.valList[n];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,n,r){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const s=new o,a={signal:s.signal,options:n,context:r},u=t=>(s.signal.aborted||this.set(e,t,a.options),t),f=r=>{if(this.valList[t]===l){const r=!n.noDeleteOnFetchRejection||void 0===l.__staleWhileFetching;r?this.delete(e):this.valList[t]=l.__staleWhileFetching}if(l.__returned===l)throw r},c=t=>t(this.fetchMethod(e,i,a)),l=new Promise(c).then(u,f);return l.__abortController=s,l.__staleWhileFetching=i,l.__returned=null,void 0===t?(this.set(e,l,a.options),t=this.keyMap.get(e)):this.valList[t]=l,l}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:s=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,fetchContext:c=this.fetchContext,forceRefresh:l=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r});const h={allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r,ttl:i,noDisposeOnSet:o,size:s,sizeCalculation:a,noUpdateTTL:u,noDeleteOnFetchRejection:f};let d=this.keyMap.get(e);if(void 0===d){const t=this.backgroundFetch(e,d,h,c);return t.__returned=t}{const r=this.valList[d];if(this.isBackgroundFetch(r))return t&&void 0!==r.__staleWhileFetching?r.__staleWhileFetching:r.__returned=r;if(!l&&!this.isStale(d))return this.moveToTail(d),n&&this.updateItemAge(d),r;const i=this.backgroundFetch(e,d,h,c);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],s=this.isBackgroundFetch(o);if(this.isStale(i))return s?t?o.__staleWhileFetching:void 0:(r||this.delete(e),t?o:void 0);if(s)return;return this.moveToTail(i),n&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return l("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const n=this.keyMap.get(e);if(void 0!==n)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(n);const t=this.valList[n];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[n]=null,this.valList[n]=null,n===this.tail?this.tail=this.prev[n]:n===this.head?this.head=this.next[n]:(this.next[this.prev[n]]=this.next[n],this.prev[this.next[n]]=this.prev[n]),this.size--,this.free.push(n)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const n=this.keyList[e];this.dispose(t,n,"delete"),this.disposeAfter&&this.disposed.push([t,n,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return l("reset","clear"),this.clear}get length(){return h("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=_}}}},"form-builder":{"package.json":function e(t,n,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":[]}}},tslib:{"package.json":function e(t,n,e){e.exports={name:"tslib",version:"2.3.1",module:"tslib.es6.js",main:"tslib.js"}},"tslib.es6.js":function e(t,n,e){e.export({__extends:()=>i,__assign:()=>o,__rest:()=>s,__decorate:()=>a,__param:()=>u,__metadata:()=>f,__awaiter:()=>c,__generator:()=>l,__createBinding:()=>h,__exportStar:()=>d,__values:()=>p,__read:()=>g,__spread:()=>b,__spreadArrays:()=>m,__spreadArray:()=>v,__await:()=>y,__asyncGenerator:()=>_,__asyncDelegator:()=>w,__asyncValues:()=>k,__makeTemplateObject:()=>j,__importStar:()=>S,__importDefault:()=>D,__classPrivateFieldGet:()=>E,__classPrivateFieldSet:()=>A}); +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}e.fn.emulateTransitionEnd=function(t){var n=!1,r=this,i;return e(this).one("bsTransitionEnd",(function(){n=!0})),setTimeout((function(){n||e(r).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};function r(t){return this.each((function(){var r=e(this),i=r.data("bs.alert");i||r.data("bs.alert",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.TRANSITION_DURATION=150,n.prototype.close=function(t){var r=e(this),i=r.attr("data-target");i||(i=(i=r.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function s(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=r.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",s).emulateTransitionEnd(n.TRANSITION_DURATION):s())};var i=e.fn.alert;e.fn.alert=r,e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.isLoading=!1};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.button"),o="object"==typeof n&&n;i||r.data("bs.button",i=new t(this,o)),"toggle"==n?i.toggle():n&&i.setState(n)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var n="disabled",r=this.$element,i=r.is("input")?"val":"html",o=r.data();t+="Text",null==o.resetText&&r.data("resetText",r[i]()),setTimeout(e.proxy((function(){r[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n).prop(n,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n).prop(n,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=n,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var r=e(t.target).closest(".btn");n.call(r,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.carousel"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n),s="string"==typeof n?n:o.slide;i||r.data("bs.carousel",i=new t(this,o)),"number"==typeof n?i.to(n):s?i[s]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t),r;if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(n,r){var i=this.$element.find(".item.active"),o=r||this.getItemForDirection(n,i),s=this.interval,a="next"==n?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var f=o[0],c=e.Event("slide.bs.carousel",{relatedTarget:f,direction:a});if(this.$element.trigger(c),!c.isDefaultPrevented()){if(this.sliding=!0,s&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=e(this.$indicators.children()[this.getItemIndex(o)]);l&&l.addClass("active")}var h=e.Event("slid.bs.carousel",{relatedTarget:f,direction:a});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(n),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(a),o.addClass(a),i.one("bsTransitionEnd",(function(){o.removeClass([n,a].join(" ")).addClass("active"),i.removeClass(["active",a].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(h)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(h)),s&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=n,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var i=function(t){var r=e(this),i=r.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=r.attr("data-target")||i,s=e(document).find(o);if(s.hasClass("carousel")){var a=e.extend({},s.data(),r.data()),u=r.attr("data-slide-to");u&&(a.interval=!1),n.call(s,a),u&&s.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);n.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(n,r){this.$element=e(n),this.options=e.extend({},t.DEFAULTS,r),this.$trigger=e('[data-toggle="collapse"][href="#'+n.id+'"],[data-toggle="collapse"][data-target="#'+n.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(r)}function r(n){return this.each((function(){var r=e(this),i=r.data("bs.collapse"),o=e.extend({},t.DEFAULTS,r.data(),"object"==typeof n&&n);!i&&o.toggle&&/show|hide/.test(n)&&(o.toggle=!1),i||r.data("bs.collapse",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var n,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(n=i.data("bs.collapse"))&&n.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(r.call(i,"hide"),n||i.data("bs.collapse",null));var s=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[s](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[s](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return a.call(this);var u=e.camelCase(["scroll",s].join("-"));this.$element.one("bsTransitionEnd",e.proxy(a,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[s](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var n=e.Event("hide.bs.collapse");if(this.$element.trigger(n),!n.isDefaultPrevented()){var r=this.dimension();this.$element[r](this.$element[r]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[r](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,r){var i=e(r);this.addAriaAndCollapsedClass(n(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var i=e.fn.collapse;e.fn.collapse=r,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=n(i),s,a=o.data("bs.collapse")?"toggle":i.data();r.call(o,a)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r="#"!==n?e(document).find(n):null;return r&&r.length?r:t.parent()}function o(r){r&&3===r.which||(e(t).remove(),e(n).each((function(){var t=e(this),n=i(t),o={relatedTarget:this};n.hasClass("open")&&(r&&"click"==r.type&&/input|textarea/i.test(r.target.tagName)&&e.contains(n[0],r.target)||(n.trigger(r=e.Event("hide.bs.dropdown",o)),r.isDefaultPrevented()||(t.attr("aria-expanded","false"),n.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function s(t){return this.each((function(){var n=e(this),i=n.data("bs.dropdown");i||n.data("bs.dropdown",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.prototype.toggle=function(t){var n=e(this);if(!n.is(".disabled, :disabled")){var r=i(n),s=r.hasClass("open");if(o(),!s){"ontouchstart"in document.documentElement&&!r.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var a={relatedTarget:this};if(r.trigger(t=e.Event("show.bs.dropdown",a)),t.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),r.toggleClass("open").trigger(e.Event("shown.bs.dropdown",a))}return!1}},r.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var r=e(this);if(t.preventDefault(),t.stopPropagation(),!r.is(".disabled, :disabled")){var o=i(r),s=o.hasClass("open");if(!s&&27!=t.which||s&&27==t.which)return 27==t.which&&o.find(n).trigger("focus"),r.trigger("click");var a=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+a);if(u.length){var f=u.index(t.target);38==t.which&&f>0&&f--,40==t.which&&fdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},f.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var s=i[o];if("click"==s)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",u="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},f.prototype.getDefaults=function(){return f.DEFAULTS},f.prototype.getOptions=function(n){var r=this.$element.data();for(var i in r)r.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete r[i];return(n=e.extend({},this.getDefaults(),r,n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.sanitize&&(n.template=u(n.template,n.whiteList,n.sanitizeFn)),n},f.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,(function(e,r){n[e]!=r&&(t[e]=r)})),t},f.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState)n.hoverState="in";else{if(clearTimeout(n.timeout),n.hoverState="in",!n.options.delay||!n.options.delay.show)return n.show();n.timeout=setTimeout((function(){"in"==n.hoverState&&n.show()}),n.options.delay.show)}},f.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},f.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),!n.isInStateTrue()){if(clearTimeout(n.timeout),n.hoverState="out",!n.options.delay||!n.options.delay.hide)return n.hide();n.timeout=setTimeout((function(){"out"==n.hoverState&&n.hide()}),n.options.delay.hide)}},f.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var n=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!n)return;var r=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,u=a.test(s);u&&(s=s.replace(a,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var c=this.getPosition(),l=i[0].offsetWidth,h=i[0].offsetHeight;if(u){var d=s,p=this.getPosition(this.$viewport);s="bottom"==s&&c.bottom+h>p.bottom?"top":"top"==s&&c.top-hp.width?"left":"left"==s&&c.left-ls.top+s.height&&(i.top=s.top+s.height-u)}else{var f=t.left-o,c=t.left+o+n;fs.right&&(i.left=s.left+s.width-c)}return i},f.prototype.getTitle=function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)},f.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},f.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},f.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},f.prototype.enable=function(){this.enabled=!0},f.prototype.disable=function(){this.enabled=!1},f.prototype.toggleEnabled=function(){this.enabled=!this.enabled},f.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},f.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},f.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var l=e.fn.tooltip;e.fn.tooltip=c,e.fn.tooltip.Constructor=f,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=l,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function n(n){return this.each((function(){var r=e(this),i=r.data("bs.popover"),o="object"==typeof n&&n;!i&&/destroy|hide/.test(n)||(i||r.data("bs.popover",i=new t(this,o)),"string"==typeof n&&i[n]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();if(this.options.html){var r=typeof n;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===r&&(n=this.sanitizeHtml(n))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===r?"html":"append"](n)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(n);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var r=e.fn.popover;e.fn.popover=n,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=r,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(n).is(document.body)?e(window):e(n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each((function(){var r=e(this),i=r.data("bs.scrollspy"),o="object"==typeof n&&n;i||r.data("bs.scrollspy",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[n]().top+r,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),n=this.options.offset+t-this.$scrollElement.height(),r=this.offsets,i=this.targets,o=this.activeTarget,s;if(this.scrollHeight!=t&&this.refresh(),e>=n)return o!=(s=i[i.length-1])&&this.activate(s);if(o&&e=r[s]&&(void 0===r[s+1]||e .active"),s=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!r.find("> .fade").length);function a(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),n.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(n[0].offsetWidth,n.addClass("in")):n.removeClass("fade"),n.parent(".dropdown-menu").length&&n.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&s?o.one("bsTransitionEnd",a).emulateTransitionEnd(t.TRANSITION_DURATION):a(),o.removeClass("in")};var r=e.fn.tab;e.fn.tab=n,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var i=function(t){t.preventDefault(),n.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(n,r){this.options=e.extend({},t.DEFAULTS,r);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(n),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function n(n){return this.each((function(){var r=e(this),i=r.data("bs.affix"),o="object"==typeof n&&n;i||r.data("bs.affix",i=new t(this,o)),"string"==typeof n&&i[n]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,n,r){var i=this.$target.scrollTop(),o=this.$element.offset(),s=this.$target.height();if(null!=n&&"top"==this.affixed)return i=e-r&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),n=this.$element.offset();return this.pinnedOffset=n.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var n=this.$element.height(),r=this.options.offset,i=r.top,o=r.bottom,s=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(o=i=r),"function"==typeof i&&(i=r.top(this.$element)),"function"==typeof o&&(o=r.bottom(this.$element));var a=this.getState(s,n,i,o);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var u="affix"+(a?"-"+a:""),f=e.Event(u+".bs.affix");if(this.$element.trigger(f),f.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:s-n-o})}};var r=e.fn.affix;e.fn.affix=n,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),r=t.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),n.call(t,r)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,n,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,n,e,r,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),s=t("path"),a=t("detect-libc");Math.random();var u=s.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+a.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(c){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(c.stack||c.message||c),new Error("Missing binary. See message above.")}f(e.exports)}function f(e){try{var t=process.binding("async_wrap"),n;if(t.asyncIdStackSize instanceof Function)n=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");l=t.constants.kStackLength,n=function(){return t.async_hook_fields[l]}}var r=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,s;if(!r||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,s=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var a=t.async_id_fields||t.async_uid_fields;function u(){for(var e=n(),t=new Array(e);e>0;--e){var i=a[o];t[e-1]={asyncId:i,triggerId:a[s]},r(i)}return t}function f(e){for(var t=0;t0)i.changeLanguage(e,r);else if(0!=a[u]){a[u]=0;var f=new XMLHttpRequest;f.overrideMimeType("application/json"),f.open("GET",u,!1),f.send(null),200===f.status?a[u]=1:a[u]=-1,n.addResourceBundle(e,s,JSON.parse(f.response)||{}),i.changeLanguage(e,r)}};n.changeLanguage=p;var g=function(e,t,n){return i.format(e,t,n)};n.format=g;var b=function(){return i.languages};n.getLanguages=b;var m=function(e,t){return i.loadLanguages(e,t)};n.loadLanguages=m;var v=function(e,t){return i.loadNamespaces(e,t)};n.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};n.on=y;var _=function(e,t){return i.off(e,t)};n.off=_,r.__exportStar(t("./i18n/i18n"),n),r.__exportStar(t("./i18n/i18n.app"),n),r.__exportStar(t("./translations"),n)},i18n:{"i18n.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.fallbackKeys=n.getObjectI18nTemplate=n.translationI18nObjects=n.addObjectsI18n=n.translationI18nObject=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="_",a="base",u="core",f="translation",c=function(e,t){var n={lng:t,ns:f};if((0,r.exists)(e,n))return(0,r._t)(e,n)},l=function(e){return"".concat(e,"__object")},h=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},d=function(e,t){var n=h(e,t);return"".concat(n).concat("_","inlineHelpText")},p=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(n)},g=function(e,t,n){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(n)},b=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},m=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,n){var r=l(t);return c(r,e)||n||""},_=function(e,t,n,r,i){var o=h(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=_(e,a,n,r,i))}return s||r||""},w=function(e,t,n,r,i){var o=d(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=w(e,a,n,r,i))}return s||r||""},k=function(e,t,n,r){var i=p(t,n);return c(i,e)||r||""},j=function(e,t,n,r,i,o){var s=g(t,n,r),a=c(s,e);if(!a){var u=v(o);u&&"base"!=t&&"core"!=t&&(a=j(e,u,n,r,i,o))}return a||i||""},x=function(e,t,n,r,i){var o=b(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=x(e,a,n,r,i))}return s||r||""},S=function(e,t,n,r,i){var o=m(t,n),s=c(o,e);if(!s){var a=v(i);a&&"base"!=t&&"core"!=t&&(s=S(e,a,n,r,i))}return s||r||""},D=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},E=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(D(e))}))):n.push(D(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},A=function(e,t,n){n.label=y(e,t,n.label),i.each(n.fields,(function(r,o){if(r.label=_(e,t,o,r.label,n.datasource),r.inlineHelpText&&(r.inlineHelpText=w(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(r.group=k(e,t,r.group,r.group)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var a=j(e,t,o,r.value,r.label,n.datasource);s.push(i.extend({},r,{label:a}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=x(e,t,i,r.label,n.datasource)})),i.each(n.list_views,(function(r,i){r.label=S(e,t,i,r.label,n.datasource)}))};n.translationI18nObject=A;var C=function(e){i.each(e,(function(e){(0,r.addResourceBundle)(e.lng,f,e.data,!0,!0)}))};n.addObjectsI18n=C;var M=function(e,t){i.each(t,(function(t,r){(0,n.translationI18nObject)(e,r,t)}))};n.translationI18nObjects=M;var O=function(e,t,n){var r=o(n);E(r);var s={};return s[l(t)]=y(e,t,r.label),i.each(r.fields,(function(n,o){s[h(t,o)]=_(e,t,o,n.label),n.inlineHelpText&&(s[d(t,o)]=w(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(s[p(t,n.group)]=k(e,t,n.group,n.group)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[g(t,o,n.value)]=j(e,t,o,n.value,n.label))}))})),i.each(r.actions,(function(n,r){s[b(t,r)]=x(e,t,r,n.label)})),i.each(r.list_views,(function(n,r){s[m(t,r)]=S(e,t,r,n.label)})),s};n.getObjectI18nTemplate=O,n.fallbackKeys={getObjectLabelKey:l,getObjectFieldLabelKey:h,getObjectFieldInlineHelpTextLabelKey:d,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:g,getObjectActionLabelKey:b,getObjectListviewLabelKey:m}},"i18n.app.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.appFallbackKeys=n.getAppI18nTemplate=n.translationI18nApps=n.translationI18nMenus=void 0;var r=t("../index"),i=t("underscore"),o=t("clone"),s="translation",a="_",u=function(e,t){var n={lng:t,ns:s};if((0,r.exists)(e,n))return(0,r._t)(e,n)},f=function(e){return"app".concat("_").concat(e).concat("_","name")},c=function(e){return"app".concat("_").concat(e).concat("_","description")},l=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(n)},h=function(e){return"menu".concat("_").concat(e)},d=function(e){return"tab".concat("_").concat(e)},p=function(e,t,n){var r=f(t);return u(r,e)||n||""},g=function(e,t,n){var r=c(t);return u(r,e)||n||""},b=function(e,t,n){var r=h(t);return u(r,e)||n||""},m=function(e,t,r){r.label=p(e,t,r.label||r.name),r.description=g(e,t,r.description),(0,n.translationI18nMenus)(e,r.admin_menus)},v=function(e,t){i.each(t,(function(t){var n=b(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,n){m(e,n,t)}))};n.translationI18nApps=y;var _=function(e,t,n){var r=o(n),s={};return s[f(t)]=p(e,t,r.label||r.name),s[c(t)]=g(e,t,r.description),i.each(r.admin_menus,(function(t){s[h(t._id)]=b(e,t._id,t.label||t.name)})),s};n.getAppI18nTemplate=_,n.appFallbackKeys={getAppLabelKey:f,getAppDescriptionKey:c,getAppGroupKey:l,getMenuLabelKey:h,getTabKey:d}}},translations:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.SteedosTranslationPrefixKeys=n.convertObject=void 0;var r=t("tslib"),i=t("underscore");r.__exportStar(t("./objectTranslation"),n),r.__exportStar(t("./translation"),n),r.__exportStar(t("./templates/objectTranslation"),n),r.__exportStar(t("./templates/translation"),n);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},s=function(e){i.forEach(e.fields,(function(e,t){var n=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return n.push(o(e))}))):n.push(o(e))})),e.options=n}catch(r){console.error("convertFieldsOptions error: ",e.options,r)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?n.push(o(e)):n.push(e)})),e.options=n}catch(r){console.error("Creator.convertFieldsOptions",e.options,r)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return n.push({label:e,value:t})})),e.options=n)}))},a;n.convertObject=s,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(a=n.SteedosTranslationPrefixKeys||(n.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,n,e,r){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addObjectsTranslation=n.getObjectTranslationTemplate=n.translationObjects=n.translationObject=n.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),s=t("../index"),a=t("./index"),u=t("../i18n/i18n"),f=t("lodash"),c=t("crypto"),l,h=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function d(e){var t;return c.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(d(JSON.stringify(t)))},g=t("clone"),b=".",m="base",v="core",y="translation",_="object",w="field",k="listview",j="action",x=function(e,t){var n={lng:t,ns:y,keySeparator:!1};if((0,s.exists)(e,n))return(0,s._t)(e,n)},S=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},D=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},E=function(e){var t;return[D(),e].join(".")},A=function(e){var t;return[D("object"),e,"label"].join(".")},C=function(e){var t;return[D("object"),e,"description"].join(".")},M=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"label"].join(".")},O=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"help"].join(".")},T=function(e,t){var n;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"description"].join(".")},B=function(e,t){var n=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),r;return[D("field"),e,"group",n].join(".")},I=function(e,t,n){var r;return t&&(t=t.replace(/\./g,"_")),[D("field"),e,t,"options",n].join(".")},R=function(e,t){var n;return[D("action"),e,t].join(".")},F=function(e,t){var n;return[D("listview"),e,t].join(".")},P=function(e,t,n){var r,i=[A(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),x(i,e)||n||""};n.translationObjectLabel=P;var N=function(e,t,n){var r=C(t);return x(r,e)||n||""},L=function(e,t,n,r,i,o){var s,a=[M(t,n)],f=u.fallbackKeys.getObjectFieldLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=L(e,l,n,r,i))}return c||r||""},z=function(e,t,n,r,i,o){var s,a=[O(t,n)],f=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=z(e,l,n,r,i))}return c||r||""},U=function(e,t,n,r,i,o){var s=T(t,n),a,u=x([s],e);if(1!=o&&!u){var f=S(i);f&&"base"!=t&&"core"!=t&&(u=U(e,f,n,r,i))}return u||r||""},q=function(e,t,n,r,i,o){var s,a=[B(t,n)],f=u.fallbackKeys.getObjectFieldGroupKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=q(e,l,n,r,i))}return c||r||""},$=function(e,t,n,r,i,o,s){var a,f=[I(t,n,r)],c=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,n,r);c&&f.push(c);var l=x(f,e);if(1!=s&&!l){var h=S(o);h&&"base"!=t&&"core"!=t&&(l=$(e,h,n,r,i,o))}return l||i||""},W=function(e,t,n,r,i,o){var s,a=[R(t,n)],f=u.fallbackKeys.getObjectActionLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=W(e,l,n,r,i))}return c||r||""},H=function(e,t,n,r,i,o){var s,a=[F(t,n)],f=u.fallbackKeys.getObjectListviewLabelKey(t,n);f&&a.push(f);var c=x(a,e);if(1!=o&&!c){var l=S(i);l&&"base"!=t&&"core"!=t&&(c=H(e,l,n,r,i))}return c||r||""},Y=function(e,t,r,o,s){void 0===s&&(s=!1);var u=p(e,r),c=h.get(u);if(c)return Object.assign(r,(0,f.cloneDeep)(c));o&&(0,a.convertObject)(r),r.label=(0,n.translationObjectLabel)(e,t,r.label),r.description=N(e,t,r.description),i.each(r.fields,(function(n,o){if(n.label=L(e,t,o,n.label,r.datasource,s),n.inlineHelpText=z(e,t,o,n.inlineHelpText,r.datasource,s),n.description=U(e,t,o,n.description,r.datasource,s),n.group&&(n.group=q(e,t,n.group,n.group,r.datasource,s)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var u=$(e,t,o,n.value,n.label,r.datasource,s);a.push(i.extend({},n,{label:u}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=W(e,t,i,n.label,r.datasource,s)})),i.each(r.list_views,(function(n,i){n.label=H(e,t,i,n.label,r.datasource,s)})),h.set(u,(0,f.cloneDeep)(r))};n.translationObject=Y;var V=function(e,t){i.each(t,(function(t,r){(0,n.translationObject)(e,r,t)}))};n.translationObjects=V;var K=function(e,t,r){var o=g(r);(0,a.convertObject)(o);var s={};return s[A(t)]=(0,n.translationObjectLabel)(e,t,o.label),s[C(t)]=N(e,t,o.description),i.each(o.fields,(function(n,r){s[M(t,r)]=L(e,t,r,n.label),n.inlineHelpText&&(s[O(t,r)]=z(e,t,r,n.inlineHelpText,o.datasource)),n.description&&(s[T(t,r)]=U(e,t,r,n.description,o.datasource)),n.group&&(s[B(t,n.group)]=q(e,t,n.group,n.group,o.datasource)),n.options&&i.each(n.options,(function(n){i.has(n,"value")&&(s[I(t,r,n.value)]=$(e,t,r,n.value,n.label))}))})),i.each(o.actions,(function(n,r){s[R(t,r)]=W(e,t,r,n.label)})),i.each(o.list_views,(function(n,r){s[F(t,r)]=H(e,t,r,n.label)})),s};function G(e,t){var n=g(e);(0,a.convertObject)(n);var r={},o=n.name;return o||console.error("Error: Invalid objectTranslation:"+t),r[A(o)]=n.label,r[C(o)]=n.description,i.each(n.fields,(function(e,t){r[M(o,t)]=e.label,e.help&&(r[O(o,t)]=e.help),e.description&&(r[T(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(r[I(o,t,e.value)]=e.label)}))})),i.each(n.groups,(function(e,t){r[B(o,t)]=e})),i.each(n.actions,(function(e,t){r[R(o,t)]=e.label})),i.each(n.listviews,(function(e,t){r[F(o,t)]=e.label})),i.each(n.CustomLabels,(function(e,t){r[E(t)]=e})),r}n.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,s.addResourceBundle)(e.lng,y,t,!0,!0)}))};n.addObjectsTranslation=X},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.addTranslations=n.convertTranslation=n.convertTranslationData=n.getAppTranslationTemplate=n.translationApps=n.translationMenus=n.translationApp=n.translationTabLabel=n.translationTabGroup=void 0;var r=t("../index"),i=t("underscore"),o=t("./"),s=t("../i18n/i18n.app"),a=t("clone"),u="translation",f=".",c="app",l="menu",h="tab",d=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[d(),e].join(".")},g=function(e,t){var n={lng:t,ns:u,keySeparator:!1};if((0,r.exists)(e,n))return(0,r._t)(e,n)},b=function(e){var t;return[d("app"),e,"name"].join(".")},m=function(e){var t;return[d("app"),e,"description"].join(".")},v=function(e,t){var n,r;return[d("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[d("menu"),"menu_".concat(e)].join(".")},_=function(e){var t;return[d("tab"),e].join(".")},w=function(e,t,n){var r,i=[b(t)],o=s.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),g(i,e)||n||""},k=function(e,t,n){var r,i=[m(t)],o=s.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),g(i,e)||n||""},j=function(e,t,n,r){var i,o=[v(t,n)],a=s.appFallbackKeys.getAppGroupKey(t,n);return a&&o.push(a),g(o,e)||r||""};n.translationTabGroup=j;var x=function(e,t,n){var r,i=[y(t)],o=s.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),g(i,e)||n||""},S=function(e,t,n){var r,i=[_(t)],o=s.appFallbackKeys.getTabKey(t);return o&&i.push(o),g(i,e)||n||""};n.translationTabLabel=S;var D=function(e,t,r){r.label=w(e,t,r.label||r.name),r.description=k(e,t,r.description),i.each(r.tab_groups,(function(i,o){r.tab_groups[o].id=i.id||i.group_name,r.tab_groups[o].group_name=(0,n.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,n.translationMenus)(e,r.admin_menus)};n.translationApp=D;var E=function(e,t){i.each(t,(function(t){var n=x(e,t._id,t.label||t.name);t.label=n,t.name=n}))};n.translationMenus=E;var A=function(e,t){i.each(t,(function(t,r){(0,n.translationApp)(e,r,t)}))};n.translationApps=A;var C=function(e,t,n){var r=a(n),o={};return o[b(t)]=w(e,t,r.label||r.name),o[m(t)]=k(e,t,r.description),i.each(r.admin_menus,(function(t){o[y(t._id)]=x(e,t._id,t.label||t.name)})),o};n.getAppTranslationTemplate=C;var M=function(e,t,n){i.isArray(n)?i.each(n,(function(e){M(e,"",e)})):n&&i.each(i.keys(n),(function(r){var o=t?"".concat(t,".").concat(r):r,s=n[r];"object"==typeof s?i.isArray(s)?i.each(s,(function(e){M(e,o,s)})):M(e,o,s):e[o]=s}))};function O(e){for(var t in e)"object"==typeof e[t]&&M(e,t,e[t]);return e}n.convertTranslationData=O;var T=function(e){var t=a(e),n={};return i.each(t.CustomApplications,(function(e,t){n[b(t)]=e.name,n[m(t)]=e.description,i.each(e.groups,(function(e,r){n[v(t,r)]=e}))})),i.each(t.CustomTabs,(function(e,t){n[_(t)]=e})),i.each(t.CustomLabels,(function(e,t){var r;if("simpleschema"!=t&&i.isObject(e)){var o=O(((r={})[t]=e,r));i.each(o,(function(e,t){i.isObject(e)||(n[p(t)]=e)}))}else n[p(t)]=e})),n};n.convertTranslation=T;var B=function(e){i.each(e,(function(e){var t=(0,n.convertTranslation)(e.data);(0,r.addResourceBundle)(e.lng,u,t,!0,!0)}))};n.addTranslations=B},templates:{"objectTranslation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getObjectMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]="help"===e?t.inlineHelpText||"":t[e]||""})),n}function a(e){return s(["label","description"],e)}function u(e){switch(e.type){case"select":return s(["label","help","options","description"],e);default:return s(["label","help","description"],e)}}function f(e){return s(["label"],e)}function c(e){return s(["label"],e)}function l(e){var t={};return r.each(e,(function(e,n){t[n]=u(e)})),t}function h(e){var t={};return r.each(e,(function(e,n){t[n]=c(e)})),t}function d(e){var t={};return r.each(e,(function(e,n){t[n]=f(e)})),t}function p(e,t){var n={};return r.each(e,(function(e,r){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");n[i]=t[r].group}})),n}var g=function(e,t,n,s){void 0===s&&(s=!1);var u=o(n);1!=s&&(0,i.translationObject)(e,t,u,!0,s);var f=Object.assign({},a(u));f=Object.assign({},f,{fields:l(u.fields)});var c=p(n.fields,u.fields);r.isEmpty(c)||(f=Object.assign({},f,{groups:c}));var g=d(u.list_views);r.isEmpty(g)||(f=Object.assign({},f,{listviews:g}));var b=h(u.actions);return r.isEmpty(b)||(f=Object.assign({},f,{actions:b})),Object.assign({name:t},f)};n.getObjectMetadataTranslationTemplate=g},"translation.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getAppMetadataTranslationTemplate=void 0;var r=t("underscore"),i=t("../index"),o=t("clone");function s(e,t){var n={};return r.each(e,(function(e){n[e]=t[e]||""})),n}function a(e){var t={groups:{}};return e?(r.each(e,(function(e){var n=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[n]=e.group_name})),t):{}}var u=function(e){return Object.assign({},s(["name","description"],e),a(e.tab_groups))},f=function(e){var t={};return r.each(e,(function(e,n){t[n]=n})),t},c=function(e){var t={};return r.each(e,(function(e){var n=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[n]=e})),t},l=function(e,t,n){var r,s=o(n);(0,i.translationApp)(e,t,s);var a={},l;return s.tab_items?a=f(s.tab_items):s.tabs&&(a=c(s.tabs)),Object.assign({},{CustomApplications:(r={},r[t]=u(s),r)},{CustomTabs:a})};n.getAppMetadataTranslationTemplate=l}}}},node_modules:{i18next:{"package.json":function e(t,n,e){e.exports={name:"i18next",version:"19.9.2",module:"./dist/esm/i18next.js",main:"./dist/cjs/i18next.js"}},dist:{esm:{"i18next.js":function e(t,n,e){let r,i,o,s,a,u,f,c;e.link("@babel/runtime/helpers/esm/typeof",{default(e){r=e}},0),e.link("@babel/runtime/helpers/esm/objectSpread",{default(e){i=e}},1),e.link("@babel/runtime/helpers/esm/classCallCheck",{default(e){o=e}},2),e.link("@babel/runtime/helpers/esm/createClass",{default(e){s=e}},3),e.link("@babel/runtime/helpers/esm/possibleConstructorReturn",{default(e){a=e}},4),e.link("@babel/runtime/helpers/esm/getPrototypeOf",{default(e){u=e}},5),e.link("@babel/runtime/helpers/esm/assertThisInitialized",{default(e){f=e}},6),e.link("@babel/runtime/helpers/esm/inherits",{default(e){c=e}},7);var l={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,n){console&&console[t]&&console[t].apply(console,n)}},h,d=new(function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.init(t,n)}return s(e,[{key:"init",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||l,this.options=n,this.debug=n.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,n=new Array(t),r=0;r1?n-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var s=r(o.shift());!e[s]&&n&&(e[s]=new n),e=Object.prototype.hasOwnProperty.call(e,s)?e[s]:{}}return i()?{}:{obj:e,k:r(o.shift())}}function y(e,t,n){var r=v(e,t,Object),i,o;r.obj[r.k]=n}function _(e,t,n,r){var i=v(e,t,Object),o=i.obj,s=i.k;o[s]=o[s]||[],r&&(o[s]=o[s].concat(n)),r||o[s].push(n)}function w(e,t){var n=v(e,t),r=n.obj,i=n.k;if(r)return r[i]}function k(e,t,n){var r=w(e,n);return void 0!==r?r:w(t,n)}function j(e,t,n){for(var r in t)"__proto__"!==r&&"constructor"!==r&&(r in e?"string"==typeof e[r]||e[r]instanceof String||"string"==typeof t[r]||t[r]instanceof String?n&&(e[r]=t[r]):j(e[r],t[r],n):e[r]=t[r]);return e}function x(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var S={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function D(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return S[e]})):e}var E="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,A=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),n.data=e||{},n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n}return c(t,e),s(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,s=[t,n];return r&&"string"!=typeof r&&(s=s.concat(r)),r&&"string"==typeof r&&(s=s.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(s=t.split(".")),w(this.data,s)}},{key:"addResource",value:function e(t,n,r,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},s=this.options.keySeparator;void 0===s&&(s=".");var a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(i=n,n=(a=t.split("."))[1]),this.addNamespaces(n),y(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}},{key:"addResources",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in r)"string"!=typeof r[o]&&"[object Array]"!==Object.prototype.toString.apply(r[o])||this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}},{key:"addResourceBundle",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},u=[t,n];t.indexOf(".")>-1&&(o=r,r=n,n=(u=t.split("."))[1]),this.addNamespaces(n);var f=w(this.data,u)||{};o?j(f,r,s):f=i({},f,r),y(this.data,u,f),a.silent||this.emit("added",t,n,r)}},{key:"removeResourceBundle",value:function e(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}},{key:"hasResourceBundle",value:function e(t,n){return void 0!==this.getResource(t,n)}},{key:"getResourceBundle",value:function e(t,n){return n||(n=this.options.defaultNS),"v1"===this.options.compatibilityAPI?i({},{},this.getResource(t,n)):this.getResource(t,n)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(p),C={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,n,r,i,o){var s=this;return t.forEach((function(e){s.processors[e]&&(n=s.processors[e].process(n,r,i,o))})),n}},M={},O=function(e){function t(e){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(this,t),n=a(this,u(t).call(this)),E&&p.call(f(n)),m(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,f(n)),n.options=r,void 0===n.options.keySeparator&&(n.options.keySeparator="."),n.logger=d.create("translator"),n}return c(t,e),s(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},r=this.resolve(t,n);return r&&void 0!==r.res}},{key:"extractFromKey",value:function e(t,n){var r=void 0!==n.nsSeparator?n.nsSeparator:this.options.nsSeparator;void 0===r&&(r=":");var i=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,o=n.ns||this.options.defaultNS;if(r&&t.indexOf(r)>-1){var s=t.match(this.interpolator.nestingRegexp);if(s&&s.length>0)return{key:t,namespaces:o};var a=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(a[0])>-1)&&(o=a.shift()),t=a.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(n,o,s){var a=this;if("object"!==r(o)&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),null==n)return"";Array.isArray(n)||(n=[String(n)]);var u=void 0!==o.keySeparator?o.keySeparator:this.options.keySeparator,f=this.extractFromKey(n[n.length-1],o),c=f.key,l=f.namespaces,h=l[l.length-1],d=o.lng||this.language,p=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(d&&"cimode"===d.toLowerCase()){if(p){var g=o.nsSeparator||this.options.nsSeparator;return h+g+c}return c}var b=this.resolve(n,o),m=b&&b.res,v=b&&b.usedKey||c,y=b&&b.exactUsedKey||c,_=Object.prototype.toString.apply(m),w=["[object Number]","[object Function]","[object RegExp]"],k=void 0!==o.joinArrays?o.joinArrays:this.options.joinArrays,j=!this.i18nFormat||this.i18nFormat.handleAsObject,x="string"!=typeof m&&"boolean"!=typeof m&&"number"!=typeof m;if(j&&m&&x&&w.indexOf(_)<0&&("string"!=typeof k||"[object Array]"!==_)){if(!o.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,m,o):"key '".concat(c," (").concat(this.language,")' returned an object instead of string.");if(u){var S="[object Array]"===_,D=S?[]:{},E=S?y:v;for(var A in m)if(Object.prototype.hasOwnProperty.call(m,A)){var C="".concat(E).concat(u).concat(A);D[A]=this.translate(C,i({},o,{joinArrays:!1,ns:l})),D[A]===C&&(D[A]=m[A])}m=D}}else if(j&&"string"==typeof k&&"[object Array]"===_)(m=m.join(k))&&(m=this.extendTranslation(m,n,o,s));else{var M=!1,O=!1,T=void 0!==o.count&&"string"!=typeof o.count,B=t.hasDefaultValue(o),I=T?this.pluralResolver.getSuffix(d,o.count):"",R=o["defaultValue".concat(I)]||o.defaultValue;!this.isValidLookup(m)&&B&&(M=!0,m=R),this.isValidLookup(m)||(O=!0,m=c);var F=B&&R!==m&&this.options.updateMissing;if(O||M||F){if(this.logger.log(F?"updateKey":"missingKey",d,h,c,F?R:m),u){var P=this.resolve(c,i({},o,{keySeparator:!1}));P&&P.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var N=[],L=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if("fallback"===this.options.saveMissingTo&&L&&L[0])for(var z=0;z1&&void 0!==arguments[1]?arguments[1]:{},i,o,s,a,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!n.isValidLookup(i)){var t=n.extractFromKey(e,r),f=t.key;o=f;var c=t.namespaces;n.options.fallbackNS&&(c=c.concat(n.options.fallbackNS));var l=void 0!==r.count&&"string"!=typeof r.count,h=void 0!==r.context&&"string"==typeof r.context&&""!==r.context,d=r.lngs?r.lngs:n.languageUtils.toResolveHierarchy(r.lng||n.language,r.fallbackLng);c.forEach((function(e){n.isValidLookup(i)||(u=e,!M["".concat(d[0],"-").concat(e)]&&n.utils&&n.utils.hasLoadedNamespace&&!n.utils.hasLoadedNamespace(u)&&(M["".concat(d[0],"-").concat(e)]=!0,n.logger.warn('key "'.concat(o,'" for languages "').concat(d.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),d.forEach((function(t){if(!n.isValidLookup(i)){a=t;var o=f,u=[o],c,d;if(n.i18nFormat&&n.i18nFormat.addLookupKeys)n.i18nFormat.addLookupKeys(u,f,t,e,r);else l&&(c=n.pluralResolver.getSuffix(t,r.count)),l&&h&&u.push(o+c),h&&u.push(o+="".concat(n.options.contextSeparator).concat(r.context)),l&&u.push(o+=c);for(;d=u.pop();)n.isValidLookup(i)||(s=d,i=n.getResource(t,e,d,r))}})))}))}})),{res:i,usedKey:o,exactUsedKey:s,usedLng:a,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}}],[{key:"hasDefaultValue",value:function e(t){var n="defaultValue";for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&void 0!==t[r])return!0;return!1}}]),t}(p);function T(e){return e.charAt(0).toUpperCase()+e.slice(1)}var B=function(){function e(t){o(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=d.create("languageUtils")}return s(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var n=t.split("-");return 2===n.length?null:(n.pop(),"x"===n[n.length-1].toLowerCase()?null:this.formatLanguageCode(n.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var n=t.split("-");return this.formatLanguageCode(n[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var n=["hans","hant","latn","cyrl","cans","mong","arab"],r=t.split("-");return this.options.lowerCaseLng?r=r.map((function(e){return e.toLowerCase()})):2===r.length?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase()))):3===r.length&&(r[0]=r[0].toLowerCase(),2===r[1].length&&(r[1]=r[1].toUpperCase()),"sgn"!==r[0]&&2===r[2].length&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=T(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=T(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var n=this,r;return t?(t.forEach((function(e){if(!r){var t=n.formatLanguageCode(e);n.options.supportedLngs&&!n.isSupportedCode(t)||(r=t)}})),!r&&this.options.supportedLngs&&t.forEach((function(e){if(!r){var t=n.getLanguagePartFromCode(e);if(n.isSupportedCode(t))return r=t;r=n.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r):null}},{key:"getFallbackCodes",value:function e(t,n){if(!t)return[];if("function"==typeof t&&(t=t(n)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!n)return t.default||[];var r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}},{key:"toResolveHierarchy",value:function e(t,n){var r=this,i=this.getFallbackCodes(n||this.options.fallbackLng||[],t),o=[],s=function e(t){t&&(r.isSupportedCode(t)?o.push(t):r.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&s(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&s(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&s(this.getLanguagePartFromCode(t))):"string"==typeof t&&s(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&s(r.formatLanguageCode(e))})),o}}]),e}(),I=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],R={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function F(){var e={};return I.forEach((function(t){t.lngs.forEach((function(n){e[n]={numbers:t.nr,plurals:R[t.fc]}}))})),e}var P=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,e),this.languageUtils=t,this.options=n,this.logger=d.create("pluralResolver"),this.rules=F()}return s(e,[{key:"addRule",value:function e(t,n){this.rules[t]=n}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var n=this.getRule(t);return n&&n.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,n){return this.getSuffixes(t).map((function(e){return n+e}))}},{key:"getSuffixes",value:function e(t){var n=this,r=this.getRule(t);return r?r.numbers.map((function(e){return n.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,n){var r=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(n):i.plurals(Math.abs(n)),s=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===s?s="plural":1===s&&(s=""));var a=function e(){return r.options.prepend&&s.toString()?r.options.prepend+s.toString():s.toString()};return"v1"===this.options.compatibilityJSON?1===s?"":"number"==typeof s?"_plural_".concat(s.toString()):a():"v2"===this.options.compatibilityJSON?a():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?a():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),N=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o(this,e),this.logger=d.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return s(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var n=t.interpolation;this.escape=void 0!==n.escape?n.escape:D,this.escapeValue=void 0===n.escapeValue||n.escapeValue,this.useRawValueToEscape=void 0!==n.useRawValueToEscape&&n.useRawValueToEscape,this.prefix=n.prefix?x(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?x(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?x(n.nestingPrefix):n.nestingPrefixEscaped||x("$t("),this.nestingSuffix=n.nestingSuffix?x(n.nestingSuffix):n.nestingSuffixEscaped||x(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=void 0!==n.alwaysFormat&&n.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var n="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(n,"g");var r="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(r,"g")}},{key:"interpolate",value:function e(t,n,r,i){var o=this,s,a,u,f=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function c(e){return e.replace(/\$/g,"$$$$")}var l=function e(t){if(t.indexOf(o.formatSeparator)<0){var s=k(n,f,t);return o.alwaysFormat?o.format(s,void 0,r):s}var a=t.split(o.formatSeparator),u=a.shift().trim(),c=a.join(o.formatSeparator).trim();return o.format(k(n,f,u),c,r,i)};this.resetRegExp();var h=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,d=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return c(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?c(o.escape(t)):c(t)}}].forEach((function(e){for(u=0;s=e.regex.exec(t);){if(void 0===(a=l(s[1].trim())))if("function"==typeof h){var n=h(t,s,i);a="string"==typeof n?n:""}else{if(d){a=s[0];continue}o.logger.warn("missed to pass in variable ".concat(s[1]," for interpolating ").concat(t)),a=""}else"string"==typeof a||o.useRawValueToEscape||(a=b(a));if(t=t.replace(s[0],e.safeValue(a)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,n){var r=this,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s,a,u=i({},o);function f(e,t){var n=this.nestingOptionsSeparator;if(e.indexOf(n)<0)return e;var r=e.split(new RegExp("".concat(n,"[ ]*{"))),o="{".concat(r[1]);e=r[0],o=(o=this.interpolate(o,u)).replace(/'/g,'"');try{u=JSON.parse(o),t&&(u=i({},t,u))}catch(s){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),s),"".concat(e).concat(n).concat(o)}return delete u.defaultValue,e}for(u.applyPostProcessor=!1,delete u.defaultValue;s=this.nestingRegexp.exec(t);){var c=[],l=!1;if(s[0].includes(this.formatSeparator)&&!/{.*}/.test(s[1])){var h=s[1].split(this.formatSeparator).map((function(e){return e.trim()}));s[1]=h.shift(),c=h,l=!0}if((a=n(f.call(this,s[1].trim(),u),u))&&s[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=b(a)),a||(this.logger.warn("missed to resolve ".concat(s[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return r.format(e,t,o.lng,o)}),a.trim())),t=t.replace(s[0],a),this.regexp.lastIndex=0}return t}}]),e}();function L(e,t){for(var n=e.indexOf(t);-1!==n;)e.splice(n,1),n=e.indexOf(t)}var z=function(e){function t(e,n,r){var i,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return o(this,t),i=a(this,u(t).call(this)),E&&p.call(f(i)),i.backend=e,i.store=n,i.services=r,i.languageUtils=r.languageUtils,i.options=s,i.logger=d.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(r,s.backend,s),i}return c(t,e),s(t,[{key:"queueLoad",value:function e(t,n,r,i){var o=this,s=[],a=[],u=[],f=[];return t.forEach((function(e){var t=!0;n.forEach((function(n){var i="".concat(e,"|").concat(n);!r.reload&&o.store.hasResourceBundle(e,n)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?a.indexOf(i)<0&&a.push(i):(o.state[i]=1,t=!1,a.indexOf(i)<0&&a.push(i),s.indexOf(i)<0&&s.push(i),f.indexOf(n)<0&&f.push(n)))})),t||u.push(e)})),(s.length||a.length)&&this.queue.push({pending:a,loaded:{},errors:[],callback:i}),{toLoad:s,pending:a,toLoadLanguages:u,toLoadNamespaces:f}}},{key:"loaded",value:function e(t,n,r){var i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;var e={};this.queue.forEach((function(r){_(r.loaded,[o],s),L(r.pending,t),n&&r.errors.push(n),0!==r.pending.length||r.done||(Object.keys(r.loaded).forEach((function(t){e[t]||(e[t]=[]),r.loaded[t].length&&r.loaded[t].forEach((function(n){e[t].indexOf(n)<0&&e[t].push(n)}))})),r.done=!0,r.errors.length?r.callback(r.errors):r.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,a=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[r](t,n,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,n,r,o+1,2*s,a)}),s):a(e,u)})):a(null,{})}},{key:"prepareLoading",value:function e(t,n){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof n&&(n=[n]);var s=this.queueLoad(t,n,i,o);if(!s.toLoad.length)return s.pending.length||o(),null;s.toLoad.forEach((function(e){r.loadOne(e)}))}},{key:"load",value:function e(t,n,r){this.prepareLoading(t,n,{},r)}},{key:"reload",value:function e(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}},{key:"loadOne",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],s=i[1];this.read(o,s,"read",void 0,void 0,(function(e,i){e&&n.logger.warn("".concat(r,"loading namespace ").concat(s," for language ").concat(o," failed"),e),!e&&i&&n.logger.log("".concat(r,"loaded namespace ").concat(s," for language ").concat(o),i),n.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,n,r,o,s){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)?this.logger.warn('did not save key "'.concat(r,'" as the namespace "').concat(n,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=r&&""!==r&&(this.backend&&this.backend.create&&this.backend.create(t,n,r,o,null,i({},a,{isUpdate:s})),t&&t[0]&&this.store.addResource(t[0],n,r,o))}}]),t}(p);function U(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var n={};if("object"===r(t[1])&&(n=t[1]),"string"==typeof t[1]&&(n.defaultValue=t[1]),"string"==typeof t[2]&&(n.tDescription=t[2]),"object"===r(t[2])||"object"===r(t[3])){var i=t[3]||t[2];Object.keys(i).forEach((function(e){n[e]=i[e]}))}return n},interpolation:{escapeValue:!0,format:function e(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function q(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function $(){}var W,H=new(function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(o(this,t),e=a(this,u(t).call(this)),E&&p.call(f(e)),e.options=q(n),e.services={},e.logger=d,e.modules={external:[]},r&&!e.isInitialized&&!n.isClone){if(!e.options.initImmediate)return e.init(n,r),a(e,f(e));setTimeout((function(){e.init(n,r)}),0)}return e}return c(t,e),s(t,[{key:"init",value:function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;function o(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof n&&(r=n,n={}),n.whitelist&&!n.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),n.nonExplicitWhitelist&&!n.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=i({},U(),this.options,q(n)),this.format=this.options.interpolation.format,r||(r=$),!this.options.isClone){this.modules.logger?d.init(o(this.modules.logger),this.options):d.init(null,this.options);var s=new B(this.options);this.store=new A(this.options.resources,this.options);var a=this.services;a.logger=d,a.resourceStore=this.store,a.languageUtils=s,a.pluralResolver=new P(s,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new N(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new z(o(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i1?n-1:0),i=1;i0&&"dev"!==u[0]&&(this.options.lng=u[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var f=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];f.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var n;return(n=t.store)[e].apply(n,arguments),t}}));var l=g(),h=function e(){var n=function e(n,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),r(n,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return n(null,t.t.bind(t));t.changeLanguage(t.options.lng,n)};return this.options.resources||!this.options.initImmediate?h():setTimeout(h,0),l}},{key:"loadResources",value:function e(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,i=r,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var s=[],a=function e(t){var r;t&&n.services.languageUtils.toResolveHierarchy(t).forEach((function(e){s.indexOf(e)<0&&s.push(e)}))};if(o)a(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return a(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return a(e)})),this.services.backendConnector.load(s,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,n,r){var i=g();return t||(t=this.languages),n||(n=this.options.ns),r||(r=$),this.services.backendConnector.reload(t,n,(function(e){i.resolve(),r(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&C.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,n){var r=this;this.isLanguageChangingTo=t;var i=g();this.emit("languageChanging",t);var o=function e(t,o){o?(r.language=o,r.languages=r.services.languageUtils.toResolveHierarchy(o),r.translator.changeLanguage(o),r.isLanguageChangingTo=void 0,r.emit("languageChanged",o),r.logger.log("languageChanged",o)):r.isLanguageChangingTo=void 0,i.resolve((function(){return r.t.apply(r,arguments)})),n&&n(t,(function(){return r.t.apply(r,arguments)}))},s=function e(t){var n="string"==typeof t?t:r.services.languageUtils.getBestMatchFromCodes(t);n&&(r.language||(r.language=n,r.languages=r.services.languageUtils.toResolveHierarchy(n)),r.translator.language||r.translator.changeLanguage(n),r.services.languageDetector&&r.services.languageDetector.cacheUserLanguage(n)),r.loadResources(n,(function(e){o(e,n)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(s):s(t):s(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,n){var o=this,s=function e(t,n){var s;if("object"!==r(n)){for(var a=arguments.length,u=new Array(a>2?a-2:0),f=2;f1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,s=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var a=function e(t,r){var i=n.services.backendConnector.state["".concat(t,"|").concat(r)];return-1===i||2===i};if(r.precheck){var u=r.precheck(this,a);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!a(i,t)||o&&!a(s,t)))}},{key:"loadNamespaces",value:function e(t,n){var r=this,i=g();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){r.options.ns.indexOf(e)<0&&r.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),n&&n(e)})),i):(n&&n(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,n){var r=g();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){r.resolve(),n&&n(e)})),r):(n&&n(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var n}},{key:"createInstance",value:function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;return new t(n,r)}},{key:"cloneInstance",value:function e(){var n=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$,s=i({},this.options,r,{isClone:!0}),a=new t(s),u=["store","services","language"];return u.forEach((function(e){a[e]=n[e]})),a.services=i({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new O(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;rr,root:()=>i,ArrayProto:()=>o,ObjProto:()=>s,SymbolProto:()=>a,push:()=>u,slice:()=>f,toString:()=>c,hasOwnProperty:()=>l,supportsArrayBuffer:()=>h,supportsDataView:()=>d,nativeIsArray:()=>p,nativeKeys:()=>g,nativeCreate:()=>b,nativeIsView:()=>m,_isNaN:()=>v,_isFinite:()=>y,hasEnumBug:()=>_,nonEnumerableProps:()=>w,MAX_ARRAY_INDEX:()=>k});var r="1.13.4",i="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},o=Array.prototype,s=Object.prototype,a="undefined"!=typeof Symbol?Symbol.prototype:null,u=o.push,f=o.slice,c=s.toString,l=s.hasOwnProperty,h="undefined"!=typeof ArrayBuffer,d="undefined"!=typeof DataView,p=Array.isArray,g=Object.keys,b=Object.create,m=h&&ArrayBuffer.isView,v=isNaN,y=isFinite,_=!{toString:null}.propertyIsEnumerable("toString"),w=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],k=Math.pow(2,53)-1},"restArguments.js":function e(t,n,e){function r(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;ir})},"isObject.js":function e(t,n,e){function r(e){var t=typeof e;return"function"===t||"object"===t&&!!e}e.export({default:()=>r})},"isNull.js":function e(t,n,e){function r(e){return null===e}e.export({default:()=>r})},"isUndefined.js":function e(t,n,e){function r(e){return void 0===e}e.export({default:()=>r})},"isBoolean.js":function e(t,n,e){let r;function i(e){return!0===e||!1===e||"[object Boolean]"===r.call(e)}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isElement.js":function e(t,n,e){function r(e){return!(!e||1!==e.nodeType)}e.export({default:()=>r})},"isString.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("String"))},"_tagTester.js":function e(t,n,e){let r;function i(e){var t="[object "+e+"]";return function(e){return r.call(e)===t}}e.export({default:()=>i}),e.link("./_setup.js",{toString(e){r=e}},0)},"isNumber.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Number"))},"isDate.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Date"))},"isRegExp.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("RegExp"))},"isError.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Error"))},"isSymbol.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Symbol"))},"isArrayBuffer.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("ArrayBuffer"))},"isDataView.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isArrayBuffer.js",{default(e){o=e}},2),e.link("./_stringTagBug.js",{hasStringTagBug(e){s=e}},3);var a=r("DataView");function u(e){return null!=e&&i(e.getInt8)&&o(e.buffer)}e.exportDefault(s?u:a)},"isFunction.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_setup.js",{root(e){i=e}},1);var o=r("Function"),s=i.document&&i.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof s&&(o=function(e){return"function"==typeof e||!1}),e.exportDefault(o)},"_stringTagBug.js":function e(t,n,e){let r,i;e.export({hasStringTagBug:()=>o,isIE11:()=>s}),e.link("./_setup.js",{supportsDataView(e){r=e}},0),e.link("./_hasObjectTag.js",{default(e){i=e}},1);var o=r&&i(new DataView(new ArrayBuffer(8))),s="undefined"!=typeof Map&&i(new Map)},"_hasObjectTag.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("Object"))},"isArray.js":function e(t,n,e){let r,i;e.link("./_setup.js",{nativeIsArray(e){r=e}},0),e.link("./_tagTester.js",{default(e){i=e}},1),e.exportDefault(r||i("Array"))},"isArguments.js":function e(t,n,e){let r,i;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1);var o=r("Arguments");!function(){o(arguments)||(o=function(e){return i(e,"callee")})}(),e.exportDefault(o)},"_has.js":function e(t,n,e){let r;function i(e,t){return null!=e&&r.call(e,t)}e.export({default:()=>i}),e.link("./_setup.js",{hasOwnProperty(e){r=e}},0)},"isFinite.js":function e(t,n,e){let r,i;function o(e){return!i(e)&&r(e)&&!isNaN(parseFloat(e))}e.export({default:()=>o}),e.link("./_setup.js",{_isFinite(e){r=e}},0),e.link("./isSymbol.js",{default(e){i=e}},1)},"isNaN.js":function e(t,n,e){let r,i;function o(e){return i(e)&&r(e)}e.export({default:()=>o}),e.link("./_setup.js",{_isNaN(e){r=e}},0),e.link("./isNumber.js",{default(e){i=e}},1)},"isTypedArray.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./_setup.js",{supportsArrayBuffer(e){r=e},nativeIsView(e){i=e},toString(e){o=e}},0),e.link("./isDataView.js",{default(e){s=e}},1),e.link("./constant.js",{default(e){a=e}},2),e.link("./_isBufferLike.js",{default(e){u=e}},3);var f=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function c(e){return i?i(e)&&!s(e):u(e)&&f.test(o.call(e))}e.exportDefault(r?c:a(!1))},"constant.js":function e(t,n,e){function r(e){return function(){return e}}e.export({default:()=>r})},"_isBufferLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getByteLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createSizePropertyCheck.js":function e(t,n,e){let r;function i(e){return function(t){var n=e(t);return"number"==typeof n&&n>=0&&n<=r}}e.export({default:()=>i}),e.link("./_setup.js",{MAX_ARRAY_INDEX(e){r=e}},0)},"_getByteLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("byteLength"))},"_shallowProperty.js":function e(t,n,e){function r(e){return function(t){return null==t?void 0:t[e]}}e.export({default:()=>r})},"isEmpty.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(null==e)return!0;var t=r(e);return"number"==typeof t&&(i(e)||o(e)||s(e))?0===t:0===r(a(e))}e.export({default:()=>u}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3),e.link("./keys.js",{default(e){a=e}},4)},"_getLength.js":function e(t,n,e){let r;e.link("./_shallowProperty.js",{default(e){r=e}},0),e.exportDefault(r("length"))},"keys.js":function e(t,n,e){let r,i,o,s,a;function u(e){if(!r(e))return[];if(i)return i(e);var t=[];for(var n in e)s(e,n)&&t.push(n);return o&&a(e,t),t}e.export({default:()=>u}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeKeys(e){i=e},hasEnumBug(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2),e.link("./_collectNonEnumProps.js",{default(e){a=e}},3)},"_collectNonEnumProps.js":function e(t,n,e){let r,i,o,s;function a(e){for(var t={},n=e.length,r=0;ru}),e.link("./_setup.js",{nonEnumerableProps(e){r=e},ObjProto(e){i=e}},0),e.link("./isFunction.js",{default(e){o=e}},1),e.link("./_has.js",{default(e){s=e}},2)},"isMatch.js":function e(t,n,e){let r;function i(e,t){var n=r(t),i=n.length;if(null==e)return!i;for(var o=Object(e),s=0;si}),e.link("./keys.js",{default(e){r=e}},0)},"isEqual.js":function e(t,n,e){let r,i,o,s,a,u,f,c,l,h,d;e.export({default:()=>m}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_setup.js",{toString(e){i=e},SymbolProto(e){o=e}},1),e.link("./_getByteLength.js",{default(e){s=e}},2),e.link("./isTypedArray.js",{default(e){a=e}},3),e.link("./isFunction.js",{default(e){u=e}},4),e.link("./_stringTagBug.js",{hasStringTagBug(e){f=e}},5),e.link("./isDataView.js",{default(e){c=e}},6),e.link("./keys.js",{default(e){l=e}},7),e.link("./_has.js",{default(e){h=e}},8),e.link("./_toBufferView.js",{default(e){d=e}},9);var p="[object DataView]";function g(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return!1;if(e!=e)return t!=t;var i=typeof e;return("function"===i||"object"===i||"object"==typeof t)&&b(e,t,n,r)}function b(e,t,n,m){e instanceof r&&(e=e._wrapped),t instanceof r&&(t=t._wrapped);var v=i.call(e);if(v!==i.call(t))return!1;if(f&&"[object Object]"==v&&c(e)){if(!c(t))return!1;v=p}switch(v){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object Symbol]":return o.valueOf.call(e)===o.valueOf.call(t);case"[object ArrayBuffer]":case p:return b(d(e),d(t),n,m)}var y="[object Array]"===v;if(!y&&a(e)){var _;if(s(e)!==s(t))return!1;if(e.buffer===t.buffer&&e.byteOffset===t.byteOffset)return!0;y=!0}if(!y){if("object"!=typeof e||"object"!=typeof t)return!1;var w=e.constructor,k=t.constructor;if(w!==k&&!(u(w)&&w instanceof w&&u(k)&&k instanceof k)&&"constructor"in e&&"constructor"in t)return!1}m=m||[];for(var j=(n=n||[]).length;j--;)if(n[j]===e)return m[j]===t;if(n.push(e),m.push(t),y){if((j=e.length)!==t.length)return!1;for(;j--;)if(!g(e[j],t[j],n,m))return!1}else{var x=l(e),S;if(j=x.length,l(t).length!==j)return!1;for(;j--;)if(S=x[j],!h(t,S)||!g(e[S],t[S],n,m))return!1}return n.pop(),m.pop(),!0}function m(e,t){return g(e,t)}},"underscore.js":function e(t,n,e){let r;function i(e){return e instanceof i?e:this instanceof i?void(this._wrapped=e):new i(e)}e.export({default:()=>i}),e.link("./_setup.js",{VERSION(e){r=e}},0),i.VERSION=r,i.prototype.value=function(){return this._wrapped},i.prototype.valueOf=i.prototype.toJSON=i.prototype.value,i.prototype.toString=function(){return String(this._wrapped)}},"_toBufferView.js":function e(t,n,e){let r;function i(e){return new Uint8Array(e.buffer||e,e.byteOffset||0,r(e))}e.export({default:()=>i}),e.link("./_getByteLength.js",{default(e){r=e}},0)},"isMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},mapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Map"))},"_methodFingerprint.js":function e(t,n,e){let r,i,o;function s(e){var t=r(e);return function(n){if(null==n)return!1;var s=o(n);if(r(s))return!1;for(var u=0;us,mapMethods:()=>l,weakMapMethods:()=>h,setMethods:()=>d}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./allKeys.js",{default(e){o=e}},2);var a="forEach",u="has",f=["clear","delete"],c=["get","has","set"],l=f.concat(a,c),h=f.concat(c),d=["add"].concat(f,a,"has")},"allKeys.js":function e(t,n,e){let r,i,o;function s(e){if(!r(e))return[];var t=[];for(var n in e)t.push(n);return i&&o(e,t),t}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{hasEnumBug(e){i=e}},1),e.link("./_collectNonEnumProps.js",{default(e){o=e}},2)},"isWeakMap.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},weakMapMethods(e){s=e}},2),e.exportDefault(i?o(s):r("WeakMap"))},"isSet.js":function e(t,n,e){let r,i,o,s;e.link("./_tagTester.js",{default(e){r=e}},0),e.link("./_stringTagBug.js",{isIE11(e){i=e}},1),e.link("./_methodFingerprint.js",{ie11fingerprint(e){o=e},setMethods(e){s=e}},2),e.exportDefault(i?o(s):r("Set"))},"isWeakSet.js":function e(t,n,e){let r;e.link("./_tagTester.js",{default(e){r=e}},0),e.exportDefault(r("WeakSet"))},"values.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"pairs.js":function e(t,n,e){let r;function i(e){for(var t=r(e),n=t.length,i=Array(n),o=0;oi}),e.link("./keys.js",{default(e){r=e}},0)},"invert.js":function e(t,n,e){let r;function i(e){for(var t={},n=r(e),i=0,o=n.length;ii}),e.link("./keys.js",{default(e){r=e}},0)},"functions.js":function e(t,n,e){let r;function i(e){var t=[];for(var n in e)r(e[n])&&t.push(n);return t.sort()}e.export({default:()=>i}),e.link("./isFunction.js",{default(e){r=e}},0)},"extend.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createAssigner.js":function e(t,n,e){function r(e,t){return function(n){var r=arguments.length;if(t&&(n=Object(n)),r<2||null==n)return n;for(var i=1;ir})},"extendOwn.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.exportDefault(r(i))},"defaults.js":function e(t,n,e){let r,i;e.link("./_createAssigner.js",{default(e){r=e}},0),e.link("./allKeys.js",{default(e){i=e}},1),e.exportDefault(r(i,!0))},"create.js":function e(t,n,e){let r,i;function o(e,t){var n=r(e);return t&&i(n,t),n}e.export({default:()=>o}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./extendOwn.js",{default(e){i=e}},1)},"_baseCreate.js":function e(t,n,e){let r,i;function o(){return function(){}}function s(e){if(!r(e))return{};if(i)return i(e);var t=function(){};t.prototype=e;var n=new t;return t.prototype=null,n}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./_setup.js",{nativeCreate(e){i=e}},1)},"clone.js":function e(t,n,e){let r,i,o;function s(e){return r(e)?i(e)?e.slice():o({},e):e}e.export({default:()=>s}),e.link("./isObject.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),e.link("./extend.js",{default(e){o=e}},2)},"tap.js":function e(t,n,e){function r(e,t){return t(e),e}e.export({default:()=>r})},"get.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=i(e,r(t));return o(s)?n:s}e.export({default:()=>s}),e.link("./_toPath.js",{default(e){r=e}},0),e.link("./_deepGet.js",{default(e){i=e}},1),e.link("./isUndefined.js",{default(e){o=e}},2)},"_toPath.js":function e(t,n,e){let r;function i(e){return r.toPath(e)}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./toPath.js")},"toPath.js":function e(t,n,e){let r,i;function o(e){return i(e)?e:[e]}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./isArray.js",{default(e){i=e}},1),r.toPath=o},"_deepGet.js":function e(t,n,e){function r(e,t){for(var n=t.length,r=0;rr})},"has.js":function e(t,n,e){let r,i;function o(e,t){for(var n=(t=i(t)).length,o=0;oo}),e.link("./_has.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"mapObject.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s=o.length,a={},u=0;uo}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"_cb.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r.iteratee!==o?r.iteratee(e,t):i(e,t,n)}e.export({default:()=>s}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),e.link("./iteratee.js",{default(e){o=e}},2)},"_baseIteratee.js":function e(t,n,e){let r,i,o,s,a,u,f;function c(e,t,n){return null==e?r:i(e)?f(e,t,n):o(e)&&!s(e)?a(e):u(e)}e.export({default:()=>c}),e.link("./identity.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isObject.js",{default(e){o=e}},2),e.link("./isArray.js",{default(e){s=e}},3),e.link("./matcher.js",{default(e){a=e}},4),e.link("./property.js",{default(e){u=e}},5),e.link("./_optimizeCb.js",{default(e){f=e}},6)},"identity.js":function e(t,n,e){function r(e){return e}e.export({default:()=>r})},"matcher.js":function e(t,n,e){let r,i;function o(e){return e=r({},e),function(t){return i(t,e)}}e.export({default:()=>o}),e.link("./extendOwn.js",{default(e){r=e}},0),e.link("./isMatch.js",{default(e){i=e}},1)},"property.js":function e(t,n,e){let r,i;function o(e){return e=i(e),function(t){return r(t,e)}}e.export({default:()=>o}),e.link("./_deepGet.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"_optimizeCb.js":function e(t,n,e){function r(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,o){return e.call(t,n,r,i,o)}}return function(){return e.apply(t,arguments)}}e.export({default:()=>r})},"iteratee.js":function e(t,n,e){let r,i;function o(e,t){return i(e,t,1/0)}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),r.iteratee=o},"noop.js":function e(t,n,e){function r(){}e.export({default:()=>r})},"propertyOf.js":function e(t,n,e){let r,i;function o(e){return null==e?r:function(t){return i(e,t)}}e.export({default:()=>o}),e.link("./noop.js",{default(e){r=e}},0),e.link("./get.js",{default(e){i=e}},1)},"times.js":function e(t,n,e){let r;function i(e,t,n){var i=Array(Math.max(0,e));t=r(t,n,1);for(var o=0;oi}),e.link("./_optimizeCb.js",{default(e){r=e}},0)},"random.js":function e(t,n,e){function r(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))}e.export({default:()=>r})},"now.js":function e(t,n,e){e.exportDefault(Date.now||function(){return(new Date).getTime()})},"escape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_createEscaper.js":function e(t,n,e){let r;function i(e){var t=function(t){return e[t]},n="(?:"+r(e).join("|")+")",i=RegExp(n),o=RegExp(n,"g");return function(e){return e=null==e?"":""+e,i.test(e)?e.replace(o,t):e}}e.export({default:()=>i}),e.link("./keys.js",{default(e){r=e}},0)},"_escapeMap.js":function e(t,n,e){e.exportDefault({"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"})},"unescape.js":function e(t,n,e){let r,i;e.link("./_createEscaper.js",{default(e){r=e}},0),e.link("./_unescapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"_unescapeMap.js":function e(t,n,e){let r,i;e.link("./invert.js",{default(e){r=e}},0),e.link("./_escapeMap.js",{default(e){i=e}},1),e.exportDefault(r(i))},"templateSettings.js":function e(t,n,e){let r;e.link("./underscore.js",{default(e){r=e}},0),e.exportDefault(r.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g})},"template.js":function e(t,n,e){let r,i;e.export({default:()=>c}),e.link("./defaults.js",{default(e){r=e}},0),e.link("./underscore.js",{default(e){i=e}},1),e.link("./templateSettings.js");var o=/(.)^/,s={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},a=/\\|'|\r|\n|\u2028|\u2029/g;function u(e){return"\\"+s[e]}var f=/^\s*(\w|\$)+\s*$/;function c(e,t,n){!t&&n&&(t=n),t=r({},t,i.templateSettings);var s=RegExp([(t.escape||o).source,(t.interpolate||o).source,(t.evaluate||o).source].join("|")+"|$","g"),c=0,l="__p+='";e.replace(s,(function(t,n,r,i,o){return l+=e.slice(c,o).replace(a,u),c=o+t.length,n?l+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?l+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(l+="';\n"+i+"\n__p+='"),t})),l+="';\n";var h=t.variable,d;if(h){if(!f.test(h))throw new Error("variable is not a bare identifier: "+h)}else l="with(obj||{}){\n"+l+"}\n",h="obj";l="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+l+"return __p;\n";try{d=new Function(h,"_",l)}catch(g){throw g.source=l,g}var p=function(e){return d.call(this,e,i)};return p.source="function("+h+"){\n"+l+"}",p}},"result.js":function e(t,n,e){let r,i;function o(e,t,n){var o=(t=i(t)).length;if(!o)return r(n)?n.call(e):n;for(var s=0;so}),e.link("./isFunction.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"uniqueId.js":function e(t,n,e){e.export({default:()=>i});var r=0;function i(e){var t=++r+"";return e?e+t:t}},"chain.js":function e(t,n,e){let r;function i(e){var t=r(e);return t._chain=!0,t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"partial.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_executeBound.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2);var s=r((function(e,t){var n=s.placeholder,r=function(){for(var o=0,s=t.length,a=Array(s),u=0;uo}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./isObject.js",{default(e){i=e}},1)},"bind.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_executeBound.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t,n){if(!i(e))throw new TypeError("Bind must be called on a function");var s=r((function(r){return o(e,s,t,this,n.concat(r))}));return s})))},"bindAll.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./bind.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t){var n=(t=i(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=o(e[r],e)}return e})))},"_flatten.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,u){if(u=u||[],t||0===t){if(t<=0)return u.concat(e)}else t=1/0;for(var f=u.length,c=0,l=r(e);c1)a(h,t-1,n,u),f=u.length;else for(var d=0,p=h.length;da}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&us}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isNaN.js",{default(e){o=e}},2)},"lastIndexOf.js":function e(t,n,e){let r,i;e.link("./findLastIndex.js",{default(e){r=e}},0),e.link("./_createIndexFinder.js",{default(e){i=e}},1),e.exportDefault(i(-1,r))},"find.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a=(r(e)?i:o)(e,t,n);if(void 0!==a&&-1!==a)return e[a]}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./findKey.js",{default(e){o=e}},2)},"findWhere.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./find.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"each.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s,a;if(t=r(t,n),i(e))for(s=0,a=e.length;ss}),e.link("./_optimizeCb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"map.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=Array(a),f=0;fs}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"reduce.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createReduce.js":function e(t,n,e){let r,i,o;function s(e){var t=function(t,n,o,s){var a=!r(t)&&i(t),u=(a||t).length,f=e>0?0:u-1;for(s||(o=t[a?a[f]:f],f+=e);f>=0&&f=3;return t(e,o(n,i,4),r,s)}}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2)},"reduceRight.js":function e(t,n,e){let r;e.link("./_createReduce.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"filter.js":function e(t,n,e){let r,i;function o(e,t,n){var o=[];return t=r(t,n),i(e,(function(e,n,r){t(e,n,r)&&o.push(e)})),o}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"reject.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r(e,i(o(t)),n)}e.export({default:()=>s}),e.link("./filter.js",{default(e){r=e}},0),e.link("./negate.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2)},"every.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"some.js":function e(t,n,e){let r,i,o;function s(e,t,n){t=r(t,n);for(var s=!i(e)&&o(e),a=(s||e).length,u=0;us}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./keys.js",{default(e){o=e}},2)},"contains.js":function e(t,n,e){let r,i,o;function s(e,t,n,s){return r(e)||(e=i(e)),("number"!=typeof n||s)&&(n=0),o(e,t,n)>=0}e.export({default:()=>s}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./indexOf.js",{default(e){o=e}},2)},"invoke.js":function e(t,n,e){let r,i,o,s,a;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2),e.link("./_deepGet.js",{default(e){s=e}},3),e.link("./_toPath.js",{default(e){a=e}},4),e.exportDefault(r((function(e,t,n){var r,u;return i(t)?u=t:(t=a(t),r=t.slice(0,-1),t=t[t.length-1]),o(e,(function(e){var i=u;if(!i){if(r&&r.length&&(e=s(e,r)),null==e)return;i=e[t]}return null==i?i:i.apply(e,n)}))})))},"pluck.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./map.js",{default(e){r=e}},0),e.link("./property.js",{default(e){i=e}},1)},"where.js":function e(t,n,e){let r,i;function o(e,t){return r(e,i(t))}e.export({default:()=>o}),e.link("./filter.js",{default(e){r=e}},0),e.link("./matcher.js",{default(e){i=e}},1)},"max.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=-1/0,u=-1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la&&(a=f);else t=o(t,n),s(e,(function(e,n,r){((c=t(e,n,r))>u||c===-1/0&&a===-1/0)&&(a=e,u=c)}));return a}e.export({default:()=>a}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"min.js":function e(t,n,e){let r,i,o,s;function a(e,t,n){var a=1/0,u=1/0,f,c;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var l=0,h=(e=r(e)?e:i(e)).length;la}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_cb.js",{default(e){o=e}},2),e.link("./each.js",{default(e){s=e}},3)},"shuffle.js":function e(t,n,e){let r;function i(e){return r(e,1/0)}e.export({default:()=>i}),e.link("./sample.js",{default(e){r=e}},0)},"sample.js":function e(t,n,e){let r,i,o,s,a;function u(e,t,n){if(null==t||n)return r(e)||(e=i(e)),e[s(e.length-1)];var u=a(e),f=o(u);t=Math.max(Math.min(t,f),0);for(var c=f-1,l=0;lu}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./values.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./random.js",{default(e){s=e}},3),e.link("./toArray.js",{default(e){a=e}},4)},"toArray.js":function e(t,n,e){let r,i,o,s,a,u,f;e.export({default:()=>l}),e.link("./isArray.js",{default(e){r=e}},0),e.link("./_setup.js",{slice(e){i=e}},1),e.link("./isString.js",{default(e){o=e}},2),e.link("./_isArrayLike.js",{default(e){s=e}},3),e.link("./map.js",{default(e){a=e}},4),e.link("./identity.js",{default(e){u=e}},5),e.link("./values.js",{default(e){f=e}},6);var c=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function l(e){return e?r(e)?i.call(e):o(e)?e.match(c):s(e)?a(e,u):f(e):[]}},"sortBy.js":function e(t,n,e){let r,i,o;function s(e,t,n){var s=0;return t=r(t,n),i(o(e,(function(e,n,r){return{value:e,index:s++,criteria:t(e,n,r)}})).sort((function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||void 0===n)return 1;if(ns}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./pluck.js",{default(e){i=e}},1),e.link("./map.js",{default(e){o=e}},2)},"groupBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n].push(t):e[n]=[t]})))},"_group.js":function e(t,n,e){let r,i;function o(e,t){return function(n,o,s){var a=t?[[],[]]:{};return o=r(o,s),i(n,(function(t,r){var i=o(t,r,n);e(a,t,i)})),a}}e.export({default:()=>o}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1)},"indexBy.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n]=t})))},"countBy.js":function e(t,n,e){let r,i;e.link("./_group.js",{default(e){r=e}},0),e.link("./_has.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t,n){i(e,n)?e[n]++:e[n]=1})))},"partition.js":function e(t,n,e){let r;e.link("./_group.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){e[n?0:1].push(t)}),!0))},"size.js":function e(t,n,e){let r,i;function o(e){return null==e?0:r(e)?e.length:i(e).length}e.export({default:()=>o}),e.link("./_isArrayLike.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"pick.js":function e(t,n,e){let r,i,o,s,a,u;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_optimizeCb.js",{default(e){o=e}},2),e.link("./allKeys.js",{default(e){s=e}},3),e.link("./_keyInObj.js",{default(e){a=e}},4),e.link("./_flatten.js",{default(e){u=e}},5),e.exportDefault(r((function(e,t){var n={},r=t[0];if(null==e)return n;i(r)?(t.length>1&&(r=o(r,t[1])),t=s(e)):(r=a,t=u(t,!1,!1),e=Object(e));for(var f=0,c=t.length;fr})},"omit.js":function e(t,n,e){let r,i,o,s,a,u,f;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./negate.js",{default(e){o=e}},2),e.link("./map.js",{default(e){s=e}},3),e.link("./_flatten.js",{default(e){a=e}},4),e.link("./contains.js",{default(e){u=e}},5),e.link("./pick.js",{default(e){f=e}},6),e.exportDefault(r((function(e,t){var n=t[0],r;return i(n)?(n=o(n),t.length>1&&(r=t[1])):(t=s(a(t,!1,!1),String),n=function(e,n){return!u(t,n)}),f(e,n,r)})))},"first.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:r(e,e.length-t)}e.export({default:()=>i}),e.link("./initial.js",{default(e){r=e}},0)},"initial.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"last.js":function e(t,n,e){let r;function i(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:r(e,Math.max(0,e.length-t))}e.export({default:()=>i}),e.link("./rest.js",{default(e){r=e}},0)},"rest.js":function e(t,n,e){let r;function i(e,t,n){return r.call(e,null==t||n?1:t)}e.export({default:()=>i}),e.link("./_setup.js",{slice(e){r=e}},0)},"compact.js":function e(t,n,e){let r;function i(e){return r(e,Boolean)}e.export({default:()=>i}),e.link("./filter.js",{default(e){r=e}},0)},"flatten.js":function e(t,n,e){let r;function i(e,t){return r(e,t,!1)}e.export({default:()=>i}),e.link("./_flatten.js",{default(e){r=e}},0)},"without.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./difference.js",{default(e){i=e}},1),e.exportDefault(r((function(e,t){return i(e,t)})))},"difference.js":function e(t,n,e){let r,i,o,s;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./filter.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3),e.exportDefault(r((function(e,t){return t=i(t,!0,!0),o(e,(function(e){return!s(t,e)}))})))},"uniq.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,a){r(t)||(a=n,n=t,t=!1),null!=n&&(n=i(n,a));for(var u=[],f=[],c=0,l=o(e);ca}),e.link("./isBoolean.js",{default(e){r=e}},0),e.link("./_cb.js",{default(e){i=e}},1),e.link("./_getLength.js",{default(e){o=e}},2),e.link("./contains.js",{default(e){s=e}},3)},"union.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./uniq.js",{default(e){i=e}},1),e.link("./_flatten.js",{default(e){o=e}},2),e.exportDefault(r((function(e){return i(o(e,!0,!0))})))},"intersection.js":function e(t,n,e){let r,i;function o(e){for(var t=[],n=arguments.length,o=0,s=r(e);oo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;ss}),e.link("./max.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.link("./pluck.js",{default(e){o=e}},2)},"zip.js":function e(t,n,e){let r,i;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./unzip.js",{default(e){i=e}},1),e.exportDefault(r(i))},"object.js":function e(t,n,e){let r;function i(e,t){for(var n={},i=0,o=r(e);ii}),e.link("./_getLength.js",{default(e){r=e}},0)},"range.js":function e(t,n,e){function r(e,t,n){null==t&&(t=e||0,e=0),n||(n=tr})},"chunk.js":function e(t,n,e){let r;function i(e,t){if(null==t||t<1)return[];for(var n=[],i=0,o=e.length;ii}),e.link("./_setup.js",{slice(e){r=e}},0)},"mixin.js":function e(t,n,e){let r,i,o,s,a;function u(e){return i(o(e),(function(t){var n=r[t]=e[t];r.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),a(this,n.apply(r,e))}})),r}e.export({default:()=>u}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./functions.js",{default(e){o=e}},2),e.link("./_setup.js",{push(e){s=e}},3),e.link("./_chainResult.js",{default(e){a=e}},4)},"_chainResult.js":function e(t,n,e){let r;function i(e,t){return e._chain?r(t).chain():t}e.export({default:()=>i}),e.link("./underscore.js",{default(e){r=e}},0)},"underscore-array-methods.js":function e(t,n,e){let r,i,o,s;e.link("./underscore.js",{default(e){r=e}},0),e.link("./each.js",{default(e){i=e}},1),e.link("./_setup.js",{ArrayProto(e){o=e}},2),e.link("./_chainResult.js",{default(e){s=e}},3),i(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=o[e];r.prototype[e]=function(){var n=this._wrapped;return null!=n&&(t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0]),s(this,n)}})),i(["concat","join","slice"],(function(e){var t=o[e];r.prototype[e]=function(){var e=this._wrapped;return null!=e&&(e=t.apply(e,arguments)),s(this,e)}})),e.exportDefault(r)}}}}},cachers:{"package.json":function e(t,n,e){e.exports={name:"@steedos/cachers",version:"2.7.4-beta.2",main:"lib/index.js"}},lib:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getCacherNames=n.clearCacher=n.getCacher=void 0;var r={},i=t("./memory"),o=t("./memory-lru"),s=function(e,t){return r[e]||(e.startsWith("lru.")?r[e]=new o.MemoryLRUCacher(t):r[e]=new i.MemoryCacher),r[e]};n.getCacher=s;var a=function(e){r[e]&&r[e].clear()};n.clearCacher=a;var u=function(){return Object.keys(r)};n.getCacherNames=u},"memory.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryCacher=void 0;var r=t("lodash"),i=function(){function e(){this.cache={}}return e.prototype.get=function(e){return this.cache[e]},e.prototype.delete=function(e){delete this.cache[e]},e.prototype.set=function(e,t){this.cache[e]=t},e.prototype.clear=function(){this.cache={}},e.prototype.keys=function(){return(0,r.keys)(this.cache)},e.prototype.values=function(){return(0,r.values)(this.cache)},e}();n.MemoryCacher=i},"memory-lru.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MemoryLRUCacher=void 0;var r=t("lodash"),i=t("lru-cache"),o={max:5e3,ttl:null,keygen:null,maxParamsLength:null},s=function(){function e(e){this.opts=(0,r.defaultsDeep)(e,o),this.cache=new i({max:this.opts.max,maxAge:this.opts.ttl?1e3*this.opts.ttl:null,updateAgeOnGet:!!this.opts.ttl})}return e.prototype.get=function(e){return this.cache.get(e)},e.prototype.set=function(e,t,n){return this.cache.set(e,t,n)},e.prototype.delete=function(e){return this.cache.delete(e)},e.prototype.clear=function(){return this.cache.clear()},e.prototype.keys=function(){return this.cache.keys()},e.prototype.values=function(){return this.cache.values()},e}();n.MemoryLRUCacher=s}},node_modules:{"lru-cache":{"package.json":function e(t,n,e){e.exports={name:"lru-cache",version:"7.14.1",main:"index.js"}},"index.js":function e(t,n,e){const r="object"==typeof performance&&performance&&"function"==typeof performance.now?performance:Date,i="function"==typeof AbortController,o=i?AbortController:class e{constructor(){this.signal=new u}abort(){this.signal.dispatchEvent("abort")}},s="function"==typeof AbortSignal,a="function"==typeof o.AbortSignal,u=s?AbortSignal:a?o.AbortController:class e{constructor(){this.aborted=!1,this._listeners=[]}dispatchEvent(e){if("abort"===e){this.aborted=!0;const t={type:e,target:this};this.onabort(t),this._listeners.forEach(e=>e(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},f=new Set,c=(e,t)=>{const n=`LRU_CACHE_OPTION_${e}`;p(n)&&g(n,`${e} option`,`options.${t}`,_)},l=(e,t)=>{const n=`LRU_CACHE_METHOD_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} method`,`cache.${t}()`,i)}},h=(e,t)=>{const n=`LRU_CACHE_PROPERTY_${e}`;if(p(n)){const{prototype:r}=_,{get:i}=Object.getOwnPropertyDescriptor(r,e);g(n,`${e} property`,`cache.${t}`,i)}},d=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!f.has(e),g=(e,t,n,r)=>{f.add(e);const i=`The ${t} is deprecated. Please use ${n} instead.`;d(i,"DeprecationWarning",e,r)},b=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),m=e=>b(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=m(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class _{constructor(e={}){const{max:t=0,ttl:n,ttlResolution:r=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:s,allowStale:a,dispose:u,disposeAfter:l,noDisposeOnSet:h,noUpdateTTL:g,maxSize:v=0,maxEntrySize:w=0,sizeCalculation:k,fetchMethod:j,fetchContext:x,noDeleteOnFetchRejection:S,noDeleteOnStaleGet:D}=e,{length:E,maxAge:A,stale:C}=e instanceof _?{}:e;if(0!==t&&!b(t))throw new TypeError("max option must be a nonnegative integer");const M=t?m(t):Array;if(!M)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=w||this.maxSize,this.sizeCalculation=k||E,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=j||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=x,!this.fetchMethod&&void 0!==x)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new M(t),this.prev=new M(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof l?(this.disposeAfter=l,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!h,this.noUpdateTTL=!!g,this.noDeleteOnFetchRejection=!!S,0!==this.maxEntrySize){if(0!==this.maxSize&&!b(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!b(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!a||!!C,this.noDeleteOnStaleGet=!!D,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!s,this.ttlResolution=b(r)||0===r?r:1,this.ttlAutopurge=!!i,this.ttl=n||A||0,this.ttl){if(!b(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){f.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";d(t,"UnboundedCacheWarning",e,_)}}C&&c("stale","allowStale"),A&&c("maxAge","ttl"),E&&c("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,n=r.now())=>{if(this.starts[e]=0!==t?n:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const n=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);n.unref&&n.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?r.now():0};let e=0;const t=()=>{const t=r.now();if(this.ttlResolution>0){e=t;const n=setTimeout(()=>e=0,this.ttlResolution);n.unref&&n.unref()}return t};this.getRemainingTTL=n=>{const r=this.keyMap.get(n);return void 0===r?0:0===this.ttls[r]||0===this.starts[r]?1/0:this.starts[r]+this.ttls[r]-(e||t())},this.isStale=n=>0!==this.ttls[n]&&0!==this.starts[n]&&(e||t())-this.starts[n]>this.ttls[n]}updateItemAge(e){}setItemTTL(e,t,n){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,n,r)=>{if(this.isBackgroundFetch(t))return 0;if(!b(n)){if(!r)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof r)throw new TypeError("sizeCalculation must be a function");if(n=r(t,e),!b(n))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return n},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,n,r){if(n||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const n of this.indexes())if(e(this.valList[n],this.keyList[n],this))return this.get(this.keyList[n],t)}forEach(e,t=this){for(const n of this.indexes())e.call(t,this.valList[n],this.keyList[n],this)}rforEach(e,t=this){for(const n of this.rindexes())e.call(t,this.valList[n],this.keyList[n],this)}get prune(){return l("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const n=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,s={value:o};if(this.ttls){s.ttl=this.ttls[t];const e=r.now()-this.starts[t];s.start=Math.floor(Date.now()-e)}this.sizes&&(s.size=this.sizes[t]),e.unshift([n,s])}return e}load(e){this.clear();for(const[t,n]of e){if(n.start){const e=Date.now()-n.start;n.start=r.now()-e}this.set(t,n.value,n)}}dispose(e,t,n){}set(e,t,{ttl:n=this.ttl,start:r,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:a=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,s),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),a=!1;else{const n=this.valList[u];t!==n&&(this.isBackgroundFetch(n)?n.__abortController.abort():i||(this.dispose(n,e,"set"),this.disposeAfter&&this.disposed.push([n,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===n||0!==this.ttl||this.ttls||this.initializeTTLTracking(),a||this.setItemTTL(u,n,r),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,n=this.keyList[t],r=this.valList[t];return this.isBackgroundFetch(r)?r.__abortController.abort():(this.dispose(r,n,"evict"),this.disposeAfter&&this.disposed.push([r,n,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(n),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const n=this.keyMap.get(e);return void 0!==n&&!this.isStale(n)&&(t&&this.updateItemAge(n),!0)}peek(e,{allowStale:t=this.allowStale}={}){const n=this.keyMap.get(e);if(void 0!==n&&(t||!this.isStale(n))){const e=this.valList[n];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,n,r){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const s=new o,a={signal:s.signal,options:n,context:r},u=t=>(s.signal.aborted||this.set(e,t,a.options),t),f=r=>{if(this.valList[t]===l){const r=!n.noDeleteOnFetchRejection||void 0===l.__staleWhileFetching;r?this.delete(e):this.valList[t]=l.__staleWhileFetching}if(l.__returned===l)throw r},c=t=>t(this.fetchMethod(e,i,a)),l=new Promise(c).then(u,f);return l.__abortController=s,l.__staleWhileFetching=i,l.__returned=null,void 0===t?(this.set(e,l,a.options),t=this.keyMap.get(e)):this.valList[t]=l,l}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:s=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,fetchContext:c=this.fetchContext,forceRefresh:l=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r});const h={allowStale:t,updateAgeOnGet:n,noDeleteOnStaleGet:r,ttl:i,noDisposeOnSet:o,size:s,sizeCalculation:a,noUpdateTTL:u,noDeleteOnFetchRejection:f};let d=this.keyMap.get(e);if(void 0===d){const t=this.backgroundFetch(e,d,h,c);return t.__returned=t}{const r=this.valList[d];if(this.isBackgroundFetch(r))return t&&void 0!==r.__staleWhileFetching?r.__staleWhileFetching:r.__returned=r;if(!l&&!this.isStale(d))return this.moveToTail(d),n&&this.updateItemAge(d),r;const i=this.backgroundFetch(e,d,h,c);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:n=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],s=this.isBackgroundFetch(o);if(this.isStale(i))return s?t?o.__staleWhileFetching:void 0:(r||this.delete(e),t?o:void 0);if(s)return;return this.moveToTail(i),n&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return l("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const n=this.keyMap.get(e);if(void 0!==n)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(n);const t=this.valList[n];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[n]=null,this.valList[n]=null,n===this.tail?this.tail=this.prev[n]:n===this.head?this.head=this.next[n]:(this.next[this.prev[n]]=this.next[n],this.prev[this.next[n]]=this.prev[n]),this.size--,this.free.push(n)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const n=this.keyList[e];this.dispose(t,n,"delete"),this.disposeAfter&&this.disposed.push([t,n,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return l("reset","clear"),this.clear}get length(){return h("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=_}}}},"form-builder":{"package.json":function e(t,n,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":[]}}},tslib:{"package.json":function e(t,n,e){e.exports={name:"tslib",version:"2.3.1",module:"tslib.es6.js",main:"tslib.js"}},"tslib.es6.js":function e(t,n,e){e.export({__extends:()=>i,__assign:()=>o,__rest:()=>s,__decorate:()=>a,__param:()=>u,__metadata:()=>f,__awaiter:()=>c,__generator:()=>l,__createBinding:()=>h,__exportStar:()=>d,__values:()=>p,__read:()=>g,__spread:()=>b,__spreadArrays:()=>m,__spreadArray:()=>v,__await:()=>y,__asyncGenerator:()=>_,__asyncDelegator:()=>w,__asyncValues:()=>k,__makeTemplateObject:()=>j,__importStar:()=>S,__importDefault:()=>D,__classPrivateFieldGet:()=>E,__classPrivateFieldSet:()=>A}); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -249,7 +249,7 @@ Package._define("mobile-experience"); !function(){var a=Package["ddp-client"].DDP;Package._define("ddp",{DDP:a})}(); -Package._define("ddp-server"); +!function(){var e,a,d;Package._define("ddp-server")}(); !function(){var e=Package.meteor.Meteor,t=Package.meteor.global,o=Package.meteor.meteorEnv,n=Package.minimongo.LocalCollection,r=Package.minimongo.Minimongo,i=Package.check.check,c=Package.check.Match,s=Package.ejson.EJSON,l=Package["ddp-client"].DDP,a=Package.modules.meteorInstall,d=Package.promise.Promise,f,u;a({node_modules:{meteor:{"allow-deny":{"allow-deny.js":function t(){const o=Object.prototype.hasOwnProperty,r=(f={CollectionPrototype:{}}).CollectionPrototype;r.allow=function(e){h(this,"allow",e)},r.deny=function(e){h(this,"deny",e)},r._defineMutationMethods=function(t){const n=this;if(t=t||{},n._restricted=!1,n._insecure=void 0,n._validators={insert:{allow:[],deny:[]},update:{allow:[],deny:[]},remove:{allow:[],deny:[]},upsert:{allow:[],deny:[]},fetch:[],fetchAllFields:!1},n._name&&(n._prefix="/"+n._name+"/",n._connection&&(n._connection===e.server||e.isClient))){const r={};["insert","update","remove"].forEach(s=>{const l=n._prefix+s;if(t.useExisting){const t=e.isClient?"_methodHandlers":"method_handlers";if(n._connection[t]&&"function"==typeof n._connection[t][l])return}r[l]=function(){i(arguments,[c.Any]);const t=Array.from(arguments);try{let r=null;if("insert"!==s||o.call(t[0],"_id")||(r=n._makeNewID()),this.isSimulation)return null!==r&&(t[0]._id=r),n._collection[s].apply(n._collection,t);if("insert"!==s&&_(t[0],s),n._restricted){if(0===n._validators[s].allow.length)throw new e.Error(403,"Access denied. No allow validators set on restricted collection for method '"+s+"'.");const o="_validated"+s.charAt(0).toUpperCase()+s.slice(1);return t.unshift(this.userId),"insert"===s&&t.push(r),n[o].apply(n,t)}if(n._isInsecure())return null!==r&&(t[0]._id=r),n._collection[s].apply(n._collection,t);throw new e.Error(403,"Access denied")}catch(r){throw"MongoError"===r.name||"MinimongoError"===r.name?new e.Error(409,r.toString()):r}}}),n._connection.methods(r)}},r._updateFetch=function(e){const t=this;if(!t._validators.fetchAllFields)if(e){const o=Object.create(null),n=e=>e&&e.forEach(e=>o[e]=1);n(t._validators.fetch),n(e),t._validators.fetch=Object.keys(o)}else t._validators.fetchAllFields=!0,t._validators.fetch=null},r._isInsecure=function(){const e=this;return void 0===this._insecure?!!Package.insecure:this._insecure},r._validatedInsert=function(t,o,n){const r=this;if(this._validators.insert.deny.some(e=>e(t,u(e,o,n))))throw new e.Error(403,"Access denied");if(this._validators.insert.allow.every(e=>!e(t,u(e,o,n))))throw new e.Error(403,"Access denied");null!==n&&(o._id=n),this._collection.insert.call(this._collection,o)},r._validatedUpdate=function(t,r,c,s){const l=this;if(i(c,Object),s=Object.assign(Object.create(null),s),!n._selectorIsIdPerhapsAsObject(r))throw new Error("validated update should be of a single ID");if(s.upsert)throw new e.Error(403,"Access denied. Upserts not allowed in a restricted collection.");const f="Access denied. In a restricted collection you can only update documents, not replace them. Use a Mongo update operator, such as '$set'.",u=Object.keys(c),h={};if(0===u.length)throw new e.Error(403,f);u.forEach(t=>{const n=c[t];if("$"!==t.charAt(0))throw new e.Error(403,f);if(!o.call(a,t))throw new e.Error(403,"Access denied. Operator "+t+" not allowed in a restricted collection.");Object.keys(n).forEach(e=>{-1!==e.indexOf(".")&&(e=e.substring(0,e.indexOf("."))),h[e]=!0})});const _=Object.keys(h),m={transform:null};l._validators.fetchAllFields||(m.fields={},l._validators.fetch.forEach(e=>{m.fields[e]=1}));const w=l._collection.findOne(r,m);if(!w)return 0;if(l._validators.update.deny.some(e=>{const o=d(e,w);return e(t,o,_,c)}))throw new e.Error(403,"Access denied");if(l._validators.update.allow.every(e=>{const o=d(e,w);return!e(t,o,_,c)}))throw new e.Error(403,"Access denied");return s._forbidReplace=!0,l._collection.update.call(l._collection,r,c,s)};const a={$inc:1,$set:1,$unset:1,$addToSet:1,$pop:1,$pullAll:1,$pull:1,$pushAll:1,$push:1,$bit:1};function d(e,t){return e.transform?e.transform(t):t}function u(e,t,o){let n=t;return e.transform&&(n=s.clone(t),null!==o&&(n._id=o),n=e.transform(n)),n}function h(e,t,r){const i=/^(?:insert|update|remove|fetch|transform)$/;if(Object.keys(r).forEach(e=>{if(!i.test(e))throw new Error(t+": Invalid key: "+e)}),e._restricted=!0,["insert","update","remove"].forEach(i=>{if(o.call(r,i)){if(!(r[i]instanceof Function))throw new Error(t+": Value for `"+i+"` must be a function");void 0===r.transform?r[i].transform=e._transform:r[i].transform=n.wrapTransform(r.transform),e._validators[i][t].push(r[i])}}),r.update||r.remove||r.fetch){if(r.fetch&&!(r.fetch instanceof Array))throw new Error(t+": Value for `fetch` must be an array");e._updateFetch(r.fetch)}}function _(t,o){if(!n._selectorIsIdPerhapsAsObject(t))throw new e.Error(403,"Not permitted. Untrusted code may only "+o+" documents by ID.")}function m(){var e;const t=(l._CurrentMethodInvocation||l._CurrentInvocation).get();return t&&t.isSimulation}r._validatedRemove=function(t,o){const n=this,r={transform:null};n._validators.fetchAllFields||(r.fields={},n._validators.fetch.forEach(e=>{r.fields[e]=1}));const i=n._collection.findOne(o,r);if(!i)return 0;if(n._validators.remove.deny.some(e=>e(t,d(e,i))))throw new e.Error(403,"Access denied");if(n._validators.remove.allow.every(e=>!e(t,d(e,i))))throw new e.Error(403,"Access denied");return n._collection.remove.call(n._collection,o)},r._callMutatorMethod=function t(o,n,r){!e.isClient||r||m()||(r=function(t){t&&e._debug(o+" failed: "+(t.reason||t.stack))});const i="update"===o||"remove"===o;i&&!m()&&_(n[0],o);const c=this._prefix+o;return this._connection.apply(c,n,{returnStubValue:!0},r)}}}}}},{extensions:[".js",".json"]})("/node_modules/meteor/allow-deny/allow-deny.js"),Package._define("allow-deny",{AllowDeny:f})}(); diff --git a/server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json b/server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json similarity index 99% rename from server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json rename to server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json index f421ff5a81..32cdd99b94 100644 --- a/server/bundle/programs/web.browser/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json +++ b/server/bundle/programs/web.browser/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json @@ -3,8 +3,8 @@ "name": "standard-minifier-js", "version": "2.6.0" }, - "totalMinifiedBytes": 4306712, - "totalMinifiedGzipBytes": 1085048, + "totalMinifiedBytes": 4306737, + "totalMinifiedGzipBytes": 1085046, "minifiedBytesByPackage": { "packages/meteor.js": 9504, "packages/coffeescript.js": 32, @@ -1584,7 +1584,7 @@ } ], "packages/ddp.js": 78, - "packages/ddp-server.js": 30, + "packages/ddp-server.js": 55, "packages/allow-deny.js": [ 5767, { diff --git a/server/bundle/programs/web.browser/program.json b/server/bundle/programs/web.browser/program.json index ebba1ab57a..8dc087892f 100644 --- a/server/bundle/programs/web.browser/program.json +++ b/server/bundle/programs/web.browser/program.json @@ -2,24 +2,24 @@ "format": "web-program-pre1", "manifest": [ { - "path": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js", + "path": "7d27de16d6eab9175efa4d52871e8cc6588f4811.js", "where": "client", "type": "js", "cacheable": true, - "url": "/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.js?meteor_js_resource=true", - "size": 4306712, - "hash": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9", - "sri": "8V1LAdKwQ3YDuCf6NLWIc8ANTjyPPal4eMgPcDSh7DgxhEPYKlU6Ng1mUyFf41upRtf3cWipGUF8Bks86cK3Xg==" + "url": "/7d27de16d6eab9175efa4d52871e8cc6588f4811.js?meteor_js_resource=true", + "size": 4306737, + "hash": "7d27de16d6eab9175efa4d52871e8cc6588f4811", + "sri": "mQJ9d8Y1Rd2yLC9UkYFqc8DKdWTK+EbdVcXzlUriN9g92KUMPH+VnggxIBgtYFspWYpGlxV7xGxOIieDJ5ACcg==" }, { - "path": "79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json", + "path": "7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json", "where": "client", "type": "json", "cacheable": true, - "url": "/79fb74cf3ad35589f4166b0c4d9fd0aa7ffa21a9.stats.json?meteor_js_resource=true", + "url": "/7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json?meteor_js_resource=true", "size": 92684, - "hash": "84b3c49ed8cbcc47c24972dbe109f0a26e1c615f", - "sri": "9TD3noiNc7n1kIu/MLlA5a+iI7Zw7X3uqMMLIepNxhm2titxz91fBgCPj5bpXr60mvkrz+5WmQd7JBkRh5M8PQ==" + "hash": "09ae6c73b3f27edc9130f5c46771c9c45954f508", + "sri": "zVvOLAKlxGGT0HM1ez3LJh6n8LNY7HTZ23MTiXz0eUEOUNiG6OYB/AID6bCJaDNjWU9eKCk3WsYO5YL6W6Tiaw==" }, { "path": "dynamic/node_modules/@steedos/form-builder/dist/form-builder.min.js", diff --git a/server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.js b/server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js similarity index 99% rename from server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.js rename to server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js index a0f7c67d9c..85735847d9 100644 --- a/server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.js +++ b/server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js @@ -68,7 +68,7 @@ object-assign * Copyright 2011-2019 Twitter, Inc. * Licensed under the MIT license */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var r in t)if(void 0!==e.style[r])return{end:t[r]};return!1}e.fn.emulateTransitionEnd=function(t){var r=!1,n=this,i;return e(this).one("bsTransitionEnd",(function(){r=!0})),setTimeout((function(){r||e(n).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',r=function(r){e(r).on("click",t,this.close)};function n(t){return this.each((function(){var n=e(this),i=n.data("bs.alert");i||n.data("bs.alert",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.TRANSITION_DURATION=150,r.prototype.close=function(t){var n=e(this),i=n.attr("data-target");i||(i=(i=n.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function a(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=n.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",a).emulateTransitionEnd(r.TRANSITION_DURATION):a())};var i=e.fn.alert;e.fn.alert=n,e.fn.alert.Constructor=r,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,r.prototype.close)}(jQuery),function(e){"use strict";var t=function(r,n){this.$element=e(r),this.options=e.extend({},t.DEFAULTS,n),this.isLoading=!1};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.button"),o="object"==typeof r&&r;i||n.data("bs.button",i=new t(this,o)),"toggle"==r?i.toggle():r&&i.setState(r)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var r="disabled",n=this.$element,i=n.is("input")?"val":"html",o=n.data();t+="Text",null==o.resetText&&n.data("resetText",n[i]()),setTimeout(e.proxy((function(){n[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,n.addClass(r).attr(r,r).prop(r,!0)):this.isLoading&&(this.isLoading=!1,n.removeClass(r).removeAttr(r).prop(r,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var r=this.$element.find("input");"radio"==r.prop("type")?(r.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==r.prop("type")&&(r.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),r.prop("checked",this.$element.hasClass("active")),e&&r.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=r,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn");r.call(n,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),n.is("input,button")?n.trigger("focus"):n.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,r){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=r,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.carousel"),o=e.extend({},t.DEFAULTS,n.data(),"object"==typeof r&&r),a="string"==typeof r?r:o.slide;i||n.data("bs.carousel",i=new t(this,o)),"number"==typeof r?i.to(r):a?i[a]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var r=this.getItemIndex(t),n;if(("prev"==e&&0===r||"next"==e&&r==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(r+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,r=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):r==e?this.pause().cycle():this.slide(e>r?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(r,n){var i=this.$element.find(".item.active"),o=n||this.getItemForDirection(r,i),a=this.interval,s="next"==r?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var c=o[0],l=e.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var f=e(this.$indicators.children()[this.getItemIndex(o)]);f&&f.addClass("active")}var d=e.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(r),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one("bsTransitionEnd",(function(){o.removeClass([r,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(d)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(d)),a&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=r,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this};var i=function(t){var n=e(this),i=n.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=n.attr("data-target")||i,a=e(document).find(o);if(a.hasClass("carousel")){var s=e.extend({},a.data(),n.data()),u=n.attr("data-slide-to");u&&(s.interval=!1),r.call(a,s),u&&a.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);r.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(r,n){this.$element=e(r),this.options=e.extend({},t.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+r.id+'"],[data-toggle="collapse"][data-target="#'+r.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function r(t){var r,n=t.attr("data-target")||(r=t.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(n)}function n(r){return this.each((function(){var n=e(this),i=n.data("bs.collapse"),o=e.extend({},t.DEFAULTS,n.data(),"object"==typeof r&&r);!i&&o.toggle&&/show|hide/.test(r)&&(o.toggle=!1),i||n.data("bs.collapse",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var r,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(r=i.data("bs.collapse"))&&r.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(n.call(i,"hide"),r||i.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return s.call(this);var u=e.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",e.proxy(s,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[a](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var r=e.Event("hide.bs.collapse");if(this.$element.trigger(r),!r.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[n](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,n){var i=e(n);this.addAriaAndCollapsedClass(r(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var r=e.hasClass("in");e.attr("aria-expanded",r),t.toggleClass("collapsed",!r).attr("aria-expanded",r)};var i=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=r(i),a,s=o.data("bs.collapse")?"toggle":i.data();n.call(o,s)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",r='[data-toggle="dropdown"]',n=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var r=t.attr("data-target");r||(r=(r=t.attr("href"))&&/#[A-Za-z]/.test(r)&&r.replace(/.*(?=#[^\s]*$)/,""));var n="#"!==r?e(document).find(r):null;return n&&n.length?n:t.parent()}function o(n){n&&3===n.which||(e(t).remove(),e(r).each((function(){var t=e(this),r=i(t),o={relatedTarget:this};r.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(r[0],n.target)||(r.trigger(n=e.Event("hide.bs.dropdown",o)),n.isDefaultPrevented()||(t.attr("aria-expanded","false"),r.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function a(t){return this.each((function(){var r=e(this),i=r.data("bs.dropdown");i||r.data("bs.dropdown",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.prototype.toggle=function(t){var r=e(this);if(!r.is(".disabled, :disabled")){var n=i(r),a=n.hasClass("open");if(o(),!a){"ontouchstart"in document.documentElement&&!n.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var s={relatedTarget:this};if(n.trigger(t=e.Event("show.bs.dropdown",s)),t.isDefaultPrevented())return;r.trigger("focus").attr("aria-expanded","true"),n.toggleClass("open").trigger(e.Event("shown.bs.dropdown",s))}return!1}},n.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var n=e(this);if(t.preventDefault(),t.stopPropagation(),!n.is(".disabled, :disabled")){var o=i(n),a=o.hasClass("open");if(!a&&27!=t.which||a&&27==t.which)return 27==t.which&&o.find(r).trigger("focus"),n.trigger("click");var s=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+s);if(u.length){var c=u.index(t.target);38==t.which&&c>0&&c--,40==t.which&&cdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},c.prototype.init=function(t,r,n){if(this.enabled=!0,this.type=t,this.$element=e(r),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var a=i[o];if("click"==a)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=a){var s="hover"==a?"mouseenter":"focusin",u="hover"==a?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(r){var n=this.$element.data();for(var i in n)n.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete n[i];return(r=e.extend({},this.getDefaults(),n,r)).delay&&"number"==typeof r.delay&&(r.delay={show:r.delay,hide:r.delay}),r.sanitize&&(r.template=u(r.template,r.whiteList,r.sanitizeFn)),r},c.prototype.getDelegateOptions=function(){var t={},r=this.getDefaults();return this._options&&e.each(this._options,(function(e,n){r[e]!=n&&(t[e]=n)})),t},c.prototype.enter=function(t){var r=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(r||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r)),t instanceof e.Event&&(r.inState["focusin"==t.type?"focus":"hover"]=!0),r.tip().hasClass("in")||"in"==r.hoverState)r.hoverState="in";else{if(clearTimeout(r.timeout),r.hoverState="in",!r.options.delay||!r.options.delay.show)return r.show();r.timeout=setTimeout((function(){"in"==r.hoverState&&r.show()}),r.options.delay.show)}},c.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},c.prototype.leave=function(t){var r=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(r||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r)),t instanceof e.Event&&(r.inState["focusout"==t.type?"focus":"hover"]=!1),!r.isInStateTrue()){if(clearTimeout(r.timeout),r.hoverState="out",!r.options.delay||!r.options.delay.hide)return r.hide();r.timeout=setTimeout((function(){"out"==r.hoverState&&r.hide()}),r.options.delay.hide)}},c.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var r=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!r)return;var n=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,s=/\s?auto?\s?/i,u=s.test(a);u&&(a=a.replace(s,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),f=i[0].offsetWidth,d=i[0].offsetHeight;if(u){var h=a,p=this.getPosition(this.$viewport);a="bottom"==a&&l.bottom+d>p.bottom?"top":"top"==a&&l.top-dp.width?"left":"left"==a&&l.left-fa.top+a.height&&(i.top=a.top+a.height-u)}else{var c=t.left-o,l=t.left+o+r;ca.right&&(i.left=a.left+a.width-l)}return i},c.prototype.getTitle=function(){var e,t=this.$element,r=this.options;return e=t.attr("data-original-title")||("function"==typeof r.title?r.title.call(t[0]):r.title)},c.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(t){var r=this;t&&((r=e(t.currentTarget).data("bs."+this.type))||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r))),t?(r.inState.click=!r.inState.click,r.isInStateTrue()?r.enter(r):r.leave(r)):r.tip().hasClass("in")?r.leave(r):r.enter(r)},c.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},c.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var f=e.fn.tooltip;e.fn.tooltip=l,e.fn.tooltip.Constructor=c,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=f,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function r(r){return this.each((function(){var n=e(this),i=n.data("bs.popover"),o="object"==typeof r&&r;!i&&/destroy|hide/.test(r)||(i||n.data("bs.popover",i=new t(this,o)),"string"==typeof r&&i[r]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),r=this.getContent();if(this.options.html){var n=typeof r;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===n&&(r=this.sanitizeHtml(r))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===n?"html":"append"](r)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(r);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=e.fn.popover;e.fn.popover=r,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(jQuery),function(e){"use strict";function t(r,n){this.$body=e(document.body),this.$scrollElement=e(r).is(document.body)?e(window):e(r),this.options=e.extend({},t.DEFAULTS,n),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function r(r){return this.each((function(){var n=e(this),i=n.data("bs.scrollspy"),o="object"==typeof r&&r;i||n.data("bs.scrollspy",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,r="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(r="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[r]().top+n,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),r=this.options.offset+t-this.$scrollElement.height(),n=this.offsets,i=this.targets,o=this.activeTarget,a;if(this.scrollHeight!=t&&this.refresh(),e>=r)return o!=(a=i[i.length-1])&&this.activate(a);if(o&&e=n[a]&&(void 0===n[a+1]||e .active"),a=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!n.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),r.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(r[0].offsetWidth,r.addClass("in")):r.removeClass("fade"),r.parent(".dropdown-menu").length&&r.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&a?o.one("bsTransitionEnd",s).emulateTransitionEnd(t.TRANSITION_DURATION):s(),o.removeClass("in")};var n=e.fn.tab;e.fn.tab=r,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this};var i=function(t){t.preventDefault(),r.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(r,n){this.options=e.extend({},t.DEFAULTS,n);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(r),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.affix"),o="object"==typeof r&&r;i||n.data("bs.affix",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,r,n){var i=this.$target.scrollTop(),o=this.$element.offset(),a=this.$target.height();if(null!=r&&"top"==this.affixed)return i=e-n&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),r=this.$element.offset();return this.pinnedOffset=r.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var r=this.$element.height(),n=this.options.offset,i=n.top,o=n.bottom,a=Math.max(e(document).height(),e(document.body).height());"object"!=typeof n&&(o=i=n),"function"==typeof i&&(i=n.top(this.$element)),"function"==typeof o&&(o=n.bottom(this.$element));var s=this.getState(a,r,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var u="affix"+(s?"-"+s:""),c=e.Event(u+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:a-r-o})}};var n=e.fn.affix;e.fn.affix=r,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),n=t.data();n.offset=n.offset||{},null!=n.offsetBottom&&(n.offset.bottom=n.offsetBottom),null!=n.offsetTop&&(n.offset.top=n.offsetTop),r.call(t,n)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,r,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,r,e,n,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),a=t("path"),s=t("detect-libc");Math.random();var u=a.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+s.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(l){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(l.stack||l.message||l),new Error("Missing binary. See message above.")}c(e.exports)}function c(e){try{var t=process.binding("async_wrap"),r;if(t.asyncIdStackSize instanceof Function)r=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");f=t.constants.kStackLength,r=function(){return t.async_hook_fields[f]}}var n=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,a;if(!n||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,a=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var s=t.async_id_fields||t.async_uid_fields;function u(){for(var e=r(),t=new Array(e);e>0;--e){var i=s[o];t[e-1]={asyncId:i,triggerId:s[a]},n(i)}return t}function c(e){for(var t=0;t0)i.changeLanguage(e,n);else if(0!=s[u]){s[u]=0;var c=new XMLHttpRequest;c.overrideMimeType("application/json"),c.open("GET",u,!1),c.send(null),200===c.status?s[u]=1:s[u]=-1,r.addResourceBundle(e,a,JSON.parse(c.response)||{}),i.changeLanguage(e,n)}};r.changeLanguage=p;var b=function(e,t,r){return i.format(e,t,r)};r.format=b;var m=function(){return i.languages};r.getLanguages=m;var g=function(e,t){return i.loadLanguages(e,t)};r.loadLanguages=g;var v=function(e,t){return i.loadNamespaces(e,t)};r.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};r.on=y;var w=function(e,t){return i.off(e,t)};r.off=w,n.__exportStar(t("./i18n/i18n"),r),n.__exportStar(t("./i18n/i18n.app"),r),n.__exportStar(t("./translations"),r)},i18n:{"i18n.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.fallbackKeys=r.getObjectI18nTemplate=r.translationI18nObjects=r.addObjectsI18n=r.translationI18nObject=void 0;var n=t("../index"),i=t("underscore"),o=t("clone"),a="_",s="base",u="core",c="translation",l=function(e,t){var r={lng:t,ns:c};if((0,n.exists)(e,r))return(0,n._t)(e,r)},f=function(e){return"".concat(e,"__object")},d=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},h=function(e,t){var r=d(e,t);return"".concat(r).concat("_","inlineHelpText")},p=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(r)},b=function(e,t,r){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(r)},m=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},g=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,r){var n=f(t);return l(n,e)||r||""},w=function(e,t,r,n,i){var o=d(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=w(e,s,r,n,i))}return a||n||""},_=function(e,t,r,n,i){var o=h(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=_(e,s,r,n,i))}return a||n||""},x=function(e,t,r,n){var i=p(t,r);return l(i,e)||n||""},k=function(e,t,r,n,i,o){var a=b(t,r,n),s=l(a,e);if(!s){var u=v(o);u&&"base"!=t&&"core"!=t&&(s=k(e,u,r,n,i,o))}return s||i||""},S=function(e,t,r,n,i){var o=m(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=S(e,s,r,n,i))}return a||n||""},j=function(e,t,r,n,i){var o=g(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=j(e,s,r,n,i))}return a||n||""},A=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},D=function(e){i.forEach(e.fields,(function(e,t){var r=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return r.push(A(e))}))):r.push(A(e))})),e.options=r}catch(n){console.error("convertFieldsOptions error: ",e.options,n)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return r.push({label:e,value:t})})),e.options=r)}))},E=function(e,t,r){r.label=y(e,t,r.label),i.each(r.fields,(function(n,o){if(n.label=w(e,t,o,n.label,r.datasource),n.inlineHelpText&&(n.inlineHelpText=_(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(n.group=x(e,t,n.group,n.group)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var s=k(e,t,o,n.value,n.label,r.datasource);a.push(i.extend({},n,{label:s}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=S(e,t,i,n.label,r.datasource)})),i.each(r.list_views,(function(n,i){n.label=j(e,t,i,n.label,r.datasource)}))};r.translationI18nObject=E;var O=function(e){i.each(e,(function(e){(0,n.addResourceBundle)(e.lng,c,e.data,!0,!0)}))};r.addObjectsI18n=O;var C=function(e,t){i.each(t,(function(t,n){(0,r.translationI18nObject)(e,n,t)}))};r.translationI18nObjects=C;var T=function(e,t,r){var n=o(r);D(n);var a={};return a[f(t)]=y(e,t,n.label),i.each(n.fields,(function(r,o){a[d(t,o)]=w(e,t,o,r.label),r.inlineHelpText&&(a[h(t,o)]=_(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(a[p(t,r.group)]=x(e,t,r.group,r.group)),r.options&&i.each(r.options,(function(r){i.has(r,"value")&&(a[b(t,o,r.value)]=k(e,t,o,r.value,r.label))}))})),i.each(n.actions,(function(r,n){a[m(t,n)]=S(e,t,n,r.label)})),i.each(n.list_views,(function(r,n){a[g(t,n)]=j(e,t,n,r.label)})),a};r.getObjectI18nTemplate=T,r.fallbackKeys={getObjectLabelKey:f,getObjectFieldLabelKey:d,getObjectFieldInlineHelpTextLabelKey:h,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:b,getObjectActionLabelKey:m,getObjectListviewLabelKey:g}},"i18n.app.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.appFallbackKeys=r.getAppI18nTemplate=r.translationI18nApps=r.translationI18nMenus=void 0;var n=t("../index"),i=t("underscore"),o=t("clone"),a="translation",s="_",u=function(e,t){var r={lng:t,ns:a};if((0,n.exists)(e,r))return(0,n._t)(e,r)},c=function(e){return"app".concat("_").concat(e).concat("_","name")},l=function(e){return"app".concat("_").concat(e).concat("_","description")},f=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(r)},d=function(e){return"menu".concat("_").concat(e)},h=function(e){return"tab".concat("_").concat(e)},p=function(e,t,r){var n=c(t);return u(n,e)||r||""},b=function(e,t,r){var n=l(t);return u(n,e)||r||""},m=function(e,t,r){var n=d(t);return u(n,e)||r||""},g=function(e,t,n){n.label=p(e,t,n.label||n.name),n.description=b(e,t,n.description),(0,r.translationI18nMenus)(e,n.admin_menus)},v=function(e,t){i.each(t,(function(t){var r=m(e,t._id,t.label||t.name);t.label=r,t.name=r}))};r.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,r){g(e,r,t)}))};r.translationI18nApps=y;var w=function(e,t,r){var n=o(r),a={};return a[c(t)]=p(e,t,n.label||n.name),a[l(t)]=b(e,t,n.description),i.each(n.admin_menus,(function(t){a[d(t._id)]=m(e,t._id,t.label||t.name)})),a};r.getAppI18nTemplate=w,r.appFallbackKeys={getAppLabelKey:c,getAppDescriptionKey:l,getAppGroupKey:f,getMenuLabelKey:d,getTabKey:h}}},translations:{"index.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SteedosTranslationPrefixKeys=r.convertObject=void 0;var n=t("tslib"),i=t("underscore");n.__exportStar(t("./objectTranslation"),r),n.__exportStar(t("./translation"),r),n.__exportStar(t("./templates/objectTranslation"),r),n.__exportStar(t("./templates/translation"),r);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},a=function(e){i.forEach(e.fields,(function(e,t){var r=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return r.push(o(e))}))):r.push(o(e))})),e.options=r}catch(n){console.error("convertFieldsOptions error: ",e.options,n)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?r.push(o(e)):r.push(e)})),e.options=r}catch(n){console.error("Creator.convertFieldsOptions",e.options,n)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return r.push({label:e,value:t})})),e.options=r)}))},s;r.convertObject=a,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(s=r.SteedosTranslationPrefixKeys||(r.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,r,e,n){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.addObjectsTranslation=r.getObjectTranslationTemplate=r.translationObjects=r.translationObject=r.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),a=t("../index"),s=t("./index"),u=t("../i18n/i18n"),c=t("lodash"),l=t("crypto"),f,d=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function h(e){var t;return l.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(h(JSON.stringify(t)))},b=t("clone"),m=".",g="base",v="core",y="translation",w="object",_="field",x="listview",k="action",S=function(e,t){var r={lng:t,ns:y,keySeparator:!1};if((0,a.exists)(e,r))return(0,a._t)(e,r)},j=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},A=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},D=function(e){var t;return[A(),e].join(".")},E=function(e){var t;return[A("object"),e,"label"].join(".")},O=function(e){var t;return[A("object"),e,"description"].join(".")},C=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"label"].join(".")},T=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"help"].join(".")},M=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"description"].join(".")},B=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),n;return[A("field"),e,"group",r].join(".")},I=function(e,t,r){var n;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"options",r].join(".")},R=function(e,t){var r;return[A("action"),e,t].join(".")},N=function(e,t){var r;return[A("listview"),e,t].join(".")},F=function(e,t,r){var n,i=[E(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),S(i,e)||r||""};r.translationObjectLabel=F;var L=function(e,t,r){var n=O(t);return S(n,e)||r||""},P=function(e,t,r,n,i,o){var a,s=[C(t,r)],c=u.fallbackKeys.getObjectFieldLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=P(e,f,r,n,i))}return l||n||""},q=function(e,t,r,n,i,o){var a,s=[T(t,r)],c=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=q(e,f,r,n,i))}return l||n||""},z=function(e,t,r,n,i,o){var a=M(t,r),s,u=S([a],e);if(1!=o&&!u){var c=j(i);c&&"base"!=t&&"core"!=t&&(u=z(e,c,r,n,i))}return u||n||""},U=function(e,t,r,n,i,o){var a,s=[B(t,r)],c=u.fallbackKeys.getObjectFieldGroupKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=U(e,f,r,n,i))}return l||n||""},$=function(e,t,r,n,i,o,a){var s,c=[I(t,r,n)],l=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,r,n);l&&c.push(l);var f=S(c,e);if(1!=a&&!f){var d=j(o);d&&"base"!=t&&"core"!=t&&(f=$(e,d,r,n,i,o))}return f||i||""},H=function(e,t,r,n,i,o){var a,s=[R(t,r)],c=u.fallbackKeys.getObjectActionLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=H(e,f,r,n,i))}return l||n||""},W=function(e,t,r,n,i,o){var a,s=[N(t,r)],c=u.fallbackKeys.getObjectListviewLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=W(e,f,r,n,i))}return l||n||""},Y=function(e,t,n,o,a){void 0===a&&(a=!1);var u=p(e,n),l=d.get(u);if(l)return Object.assign(n,(0,c.cloneDeep)(l));o&&(0,s.convertObject)(n),n.label=(0,r.translationObjectLabel)(e,t,n.label),n.description=L(e,t,n.description),i.each(n.fields,(function(r,o){if(r.label=P(e,t,o,r.label,n.datasource,a),r.inlineHelpText=q(e,t,o,r.inlineHelpText,n.datasource,a),r.description=z(e,t,o,r.description,n.datasource,a),r.group&&(r.group=U(e,t,r.group,r.group,n.datasource,a)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var u=$(e,t,o,r.value,r.label,n.datasource,a);s.push(i.extend({},r,{label:u}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=H(e,t,i,r.label,n.datasource,a)})),i.each(n.list_views,(function(r,i){r.label=W(e,t,i,r.label,n.datasource,a)})),d.set(u,(0,c.cloneDeep)(n))};r.translationObject=Y;var V=function(e,t){i.each(t,(function(t,n){(0,r.translationObject)(e,n,t)}))};r.translationObjects=V;var K=function(e,t,n){var o=b(n);(0,s.convertObject)(o);var a={};return a[E(t)]=(0,r.translationObjectLabel)(e,t,o.label),a[O(t)]=L(e,t,o.description),i.each(o.fields,(function(r,n){a[C(t,n)]=P(e,t,n,r.label),r.inlineHelpText&&(a[T(t,n)]=q(e,t,n,r.inlineHelpText,o.datasource)),r.description&&(a[M(t,n)]=z(e,t,n,r.description,o.datasource)),r.group&&(a[B(t,r.group)]=U(e,t,r.group,r.group,o.datasource)),r.options&&i.each(r.options,(function(r){i.has(r,"value")&&(a[I(t,n,r.value)]=$(e,t,n,r.value,r.label))}))})),i.each(o.actions,(function(r,n){a[R(t,n)]=H(e,t,n,r.label)})),i.each(o.list_views,(function(r,n){a[N(t,n)]=W(e,t,n,r.label)})),a};function G(e,t){var r=b(e);(0,s.convertObject)(r);var n={},o=r.name;return o||console.error("Error: Invalid objectTranslation:"+t),n[E(o)]=r.label,n[O(o)]=r.description,i.each(r.fields,(function(e,t){n[C(o,t)]=e.label,e.help&&(n[T(o,t)]=e.help),e.description&&(n[M(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(n[I(o,t,e.value)]=e.label)}))})),i.each(r.groups,(function(e,t){n[B(o,t)]=e})),i.each(r.actions,(function(e,t){n[R(o,t)]=e.label})),i.each(r.listviews,(function(e,t){n[N(o,t)]=e.label})),i.each(r.CustomLabels,(function(e,t){n[D(t)]=e})),n}r.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,a.addResourceBundle)(e.lng,y,t,!0,!0)}))};r.addObjectsTranslation=X},"translation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.addTranslations=r.convertTranslation=r.convertTranslationData=r.getAppTranslationTemplate=r.translationApps=r.translationMenus=r.translationApp=r.translationTabLabel=r.translationTabGroup=void 0;var n=t("../index"),i=t("underscore"),o=t("./"),a=t("../i18n/i18n.app"),s=t("clone"),u="translation",c=".",l="app",f="menu",d="tab",h=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[h(),e].join(".")},b=function(e,t){var r={lng:t,ns:u,keySeparator:!1};if((0,n.exists)(e,r))return(0,n._t)(e,r)},m=function(e){var t;return[h("app"),e,"name"].join(".")},g=function(e){var t;return[h("app"),e,"description"].join(".")},v=function(e,t){var r,n;return[h("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[h("menu"),"menu_".concat(e)].join(".")},w=function(e){var t;return[h("tab"),e].join(".")},_=function(e,t,r){var n,i=[m(t)],o=a.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),b(i,e)||r||""},x=function(e,t,r){var n,i=[g(t)],o=a.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),b(i,e)||r||""},k=function(e,t,r,n){var i,o=[v(t,r)],s=a.appFallbackKeys.getAppGroupKey(t,r);return s&&o.push(s),b(o,e)||n||""};r.translationTabGroup=k;var S=function(e,t,r){var n,i=[y(t)],o=a.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),b(i,e)||r||""},j=function(e,t,r){var n,i=[w(t)],o=a.appFallbackKeys.getTabKey(t);return o&&i.push(o),b(i,e)||r||""};r.translationTabLabel=j;var A=function(e,t,n){n.label=_(e,t,n.label||n.name),n.description=x(e,t,n.description),i.each(n.tab_groups,(function(i,o){n.tab_groups[o].id=i.id||i.group_name,n.tab_groups[o].group_name=(0,r.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,r.translationMenus)(e,n.admin_menus)};r.translationApp=A;var D=function(e,t){i.each(t,(function(t){var r=S(e,t._id,t.label||t.name);t.label=r,t.name=r}))};r.translationMenus=D;var E=function(e,t){i.each(t,(function(t,n){(0,r.translationApp)(e,n,t)}))};r.translationApps=E;var O=function(e,t,r){var n=s(r),o={};return o[m(t)]=_(e,t,n.label||n.name),o[g(t)]=x(e,t,n.description),i.each(n.admin_menus,(function(t){o[y(t._id)]=S(e,t._id,t.label||t.name)})),o};r.getAppTranslationTemplate=O;var C=function(e,t,r){i.isArray(r)?i.each(r,(function(e){C(e,"",e)})):r&&i.each(i.keys(r),(function(n){var o=t?"".concat(t,".").concat(n):n,a=r[n];"object"==typeof a?i.isArray(a)?i.each(a,(function(e){C(e,o,a)})):C(e,o,a):e[o]=a}))};function T(e){for(var t in e)"object"==typeof e[t]&&C(e,t,e[t]);return e}r.convertTranslationData=T;var M=function(e){var t=s(e),r={};return i.each(t.CustomApplications,(function(e,t){r[m(t)]=e.name,r[g(t)]=e.description,i.each(e.groups,(function(e,n){r[v(t,n)]=e}))})),i.each(t.CustomTabs,(function(e,t){r[w(t)]=e})),i.each(t.CustomLabels,(function(e,t){var n;if("simpleschema"!=t&&i.isObject(e)){var o=T(((n={})[t]=e,n));i.each(o,(function(e,t){i.isObject(e)||(r[p(t)]=e)}))}else r[p(t)]=e})),r};r.convertTranslation=M;var B=function(e){i.each(e,(function(e){var t=(0,r.convertTranslation)(e.data);(0,n.addResourceBundle)(e.lng,u,t,!0,!0)}))};r.addTranslations=B},templates:{"objectTranslation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getObjectMetadataTranslationTemplate=void 0;var n=t("underscore"),i=t("../index"),o=t("clone");function a(e,t){var r={};return n.each(e,(function(e){r[e]="help"===e?t.inlineHelpText||"":t[e]||""})),r}function s(e){return a(["label","description"],e)}function u(e){switch(e.type){case"select":return a(["label","help","options","description"],e);default:return a(["label","help","description"],e)}}function c(e){return a(["label"],e)}function l(e){return a(["label"],e)}function f(e){var t={};return n.each(e,(function(e,r){t[r]=u(e)})),t}function d(e){var t={};return n.each(e,(function(e,r){t[r]=l(e)})),t}function h(e){var t={};return n.each(e,(function(e,r){t[r]=c(e)})),t}function p(e,t){var r={};return n.each(e,(function(e,n){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");r[i]=t[n].group}})),r}var b=function(e,t,r,a){void 0===a&&(a=!1);var u=o(r);1!=a&&(0,i.translationObject)(e,t,u,!0,a);var c=Object.assign({},s(u));c=Object.assign({},c,{fields:f(u.fields)});var l=p(r.fields,u.fields);n.isEmpty(l)||(c=Object.assign({},c,{groups:l}));var b=h(u.list_views);n.isEmpty(b)||(c=Object.assign({},c,{listviews:b}));var m=d(u.actions);return n.isEmpty(m)||(c=Object.assign({},c,{actions:m})),Object.assign({name:t},c)};r.getObjectMetadataTranslationTemplate=b},"translation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getAppMetadataTranslationTemplate=void 0;var n=t("underscore"),i=t("../index"),o=t("clone");function a(e,t){var r={};return n.each(e,(function(e){r[e]=t[e]||""})),r}function s(e){var t={groups:{}};return e?(n.each(e,(function(e){var r=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[r]=e.group_name})),t):{}}var u=function(e){return Object.assign({},a(["name","description"],e),s(e.tab_groups))},c=function(e){var t={};return n.each(e,(function(e,r){t[r]=r})),t},l=function(e){var t={};return n.each(e,(function(e){var r=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[r]=e})),t},f=function(e,t,r){var n,a=o(r);(0,i.translationApp)(e,t,a);var s={},f;return a.tab_items?s=c(a.tab_items):a.tabs&&(s=l(a.tabs)),Object.assign({},{CustomApplications:(n={},n[t]=u(a),n)},{CustomTabs:s})};r.getAppMetadataTranslationTemplate=f}}}},node_modules:{i18next:{"package.json":function e(t,r,e){e.exports={name:"i18next",version:"19.9.2",main:"./dist/cjs/i18next.js",module:"./dist/esm/i18next.js"}},dist:{cjs:{"i18next.js":function e(t,r,e){"use strict";var n=t("@babel/runtime/helpers/typeof"),i=t("@babel/runtime/helpers/objectSpread"),o=t("@babel/runtime/helpers/classCallCheck"),a=t("@babel/runtime/helpers/createClass"),s=t("@babel/runtime/helpers/possibleConstructorReturn"),u=t("@babel/runtime/helpers/getPrototypeOf"),c=t("@babel/runtime/helpers/assertThisInitialized"),l=t("@babel/runtime/helpers/inherits");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=f(n),h=f(i),p=f(o),b=f(a),m=f(s),g=f(u),v=f(c),y=f(l),w={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,r){console&&console[t]&&console[t].apply(console,r)}},_,x=new(function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};p.default(this,e),this.init(t,r)}return b.default(e,[{key:"init",value:function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=r.prefix||"i18next:",this.logger=t||w,this.options=r,this.debug=r.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,r=new Array(t),n=0;n1?r-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var a=n(o.shift());!e[a]&&r&&(e[a]=new r),e=Object.prototype.hasOwnProperty.call(e,a)?e[a]:{}}return i()?{}:{obj:e,k:n(o.shift())}}function E(e,t,r){var n=D(e,t,Object),i,o;n.obj[n.k]=r}function O(e,t,r,n){var i=D(e,t,Object),o=i.obj,a=i.k;o[a]=o[a]||[],n&&(o[a]=o[a].concat(r)),n||o[a].push(r)}function C(e,t){var r=D(e,t),n=r.obj,i=r.k;if(n)return n[i]}function T(e,t,r){var n=C(e,r);return void 0!==n?n:C(t,r)}function M(e,t,r){for(var n in t)"__proto__"!==n&&"constructor"!==n&&(n in e?"string"==typeof e[n]||e[n]instanceof String||"string"==typeof t[n]||t[n]instanceof String?r&&(e[n]=t[n]):M(e[n],t[n],r):e[n]=t[n]);return e}function B(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var I={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function R(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return I[e]})):e}var N="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,F=function(e){function t(e){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return p.default(this,t),r=m.default(this,g.default(t).call(this)),N&&k.call(v.default(r)),r.data=e||{},r.options=n,void 0===r.options.keySeparator&&(r.options.keySeparator="."),r}return y.default(t,e),b.default(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var r=this.options.ns.indexOf(t);r>-1&&this.options.ns.splice(r,1)}},{key:"getResource",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,a=[t,r];return n&&"string"!=typeof n&&(a=a.concat(n)),n&&"string"==typeof n&&(a=a.concat(o?n.split(o):n)),t.indexOf(".")>-1&&(a=t.split(".")),C(this.data,a)}},{key:"addResource",value:function e(t,r,n,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},a=this.options.keySeparator;void 0===a&&(a=".");var s=[t,r];n&&(s=s.concat(a?n.split(a):n)),t.indexOf(".")>-1&&(i=r,r=(s=t.split("."))[1]),this.addNamespaces(r),E(this.data,s,i),o.silent||this.emit("added",t,r,n,i)}},{key:"addResources",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in n)"string"!=typeof n[o]&&"[object Array]"!==Object.prototype.toString.apply(n[o])||this.addResource(t,r,o,n[o],{silent:!0});i.silent||this.emit("added",t,r,n)}},{key:"addResourceBundle",value:function e(t,r,n,i,o){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},s=[t,r];t.indexOf(".")>-1&&(i=n,n=r,r=(s=t.split("."))[1]),this.addNamespaces(r);var u=C(this.data,s)||{};i?M(u,n,o):u=h.default({},u,n),E(this.data,s,u),a.silent||this.emit("added",t,r,n)}},{key:"removeResourceBundle",value:function e(t,r){this.hasResourceBundle(t,r)&&delete this.data[t][r],this.removeNamespaces(r),this.emit("removed",t,r)}},{key:"hasResourceBundle",value:function e(t,r){return void 0!==this.getResource(t,r)}},{key:"getResourceBundle",value:function e(t,r){return r||(r=this.options.defaultNS),"v1"===this.options.compatibilityAPI?h.default({},{},this.getResource(t,r)):this.getResource(t,r)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(k),L={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,r,n,i,o){var a=this;return t.forEach((function(e){a.processors[e]&&(r=a.processors[e].process(r,n,i,o))})),r}},P={},q=function(e){function t(e){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return p.default(this,t),r=m.default(this,g.default(t).call(this)),N&&k.call(v.default(r)),A(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,v.default(r)),r.options=n,void 0===r.options.keySeparator&&(r.options.keySeparator="."),r.logger=x.create("translator"),r}return y.default(t,e),b.default(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},n=this.resolve(t,r);return n&&void 0!==n.res}},{key:"extractFromKey",value:function e(t,r){var n=void 0!==r.nsSeparator?r.nsSeparator:this.options.nsSeparator;void 0===n&&(n=":");var i=void 0!==r.keySeparator?r.keySeparator:this.options.keySeparator,o=r.ns||this.options.defaultNS;if(n&&t.indexOf(n)>-1){var a=t.match(this.interpolator.nestingRegexp);if(a&&a.length>0)return{key:t,namespaces:o};var s=t.split(n);(n!==i||n===i&&this.options.ns.indexOf(s[0])>-1)&&(o=s.shift()),t=s.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(r,n,i){var o=this;if("object"!==d.default(n)&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),n||(n={}),null==r)return"";Array.isArray(r)||(r=[String(r)]);var a=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,s=this.extractFromKey(r[r.length-1],n),u=s.key,c=s.namespaces,l=c[c.length-1],f=n.lng||this.language,p=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f&&"cimode"===f.toLowerCase()){if(p){var b=n.nsSeparator||this.options.nsSeparator;return l+b+u}return u}var m=this.resolve(r,n),g=m&&m.res,v=m&&m.usedKey||u,y=m&&m.exactUsedKey||u,w=Object.prototype.toString.apply(g),_=["[object Number]","[object Function]","[object RegExp]"],x=void 0!==n.joinArrays?n.joinArrays:this.options.joinArrays,k=!this.i18nFormat||this.i18nFormat.handleAsObject,S="string"!=typeof g&&"boolean"!=typeof g&&"number"!=typeof g;if(k&&g&&S&&_.indexOf(w)<0&&("string"!=typeof x||"[object Array]"!==w)){if(!n.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,g,n):"key '".concat(u," (").concat(this.language,")' returned an object instead of string.");if(a){var j="[object Array]"===w,A=j?[]:{},D=j?y:v;for(var E in g)if(Object.prototype.hasOwnProperty.call(g,E)){var O="".concat(D).concat(a).concat(E);A[E]=this.translate(O,h.default({},n,{joinArrays:!1,ns:c})),A[E]===O&&(A[E]=g[E])}g=A}}else if(k&&"string"==typeof x&&"[object Array]"===w)(g=g.join(x))&&(g=this.extendTranslation(g,r,n,i));else{var C=!1,T=!1,M=void 0!==n.count&&"string"!=typeof n.count,B=t.hasDefaultValue(n),I=M?this.pluralResolver.getSuffix(f,n.count):"",R=n["defaultValue".concat(I)]||n.defaultValue;!this.isValidLookup(g)&&B&&(C=!0,g=R),this.isValidLookup(g)||(T=!0,g=u);var N=B&&R!==g&&this.options.updateMissing;if(T||C||N){if(this.logger.log(N?"updateKey":"missingKey",f,l,u,N?R:g),a){var F=this.resolve(u,h.default({},n,{keySeparator:!1}));F&&F.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var L=[],P=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if("fallback"===this.options.saveMissingTo&&P&&P[0])for(var q=0;q1&&void 0!==arguments[1]?arguments[1]:{},i,o,a,s,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!r.isValidLookup(i)){var t=r.extractFromKey(e,n),c=t.key;o=c;var l=t.namespaces;r.options.fallbackNS&&(l=l.concat(r.options.fallbackNS));var f=void 0!==n.count&&"string"!=typeof n.count,d=void 0!==n.context&&"string"==typeof n.context&&""!==n.context,h=n.lngs?n.lngs:r.languageUtils.toResolveHierarchy(n.lng||r.language,n.fallbackLng);l.forEach((function(e){r.isValidLookup(i)||(u=e,!P["".concat(h[0],"-").concat(e)]&&r.utils&&r.utils.hasLoadedNamespace&&!r.utils.hasLoadedNamespace(u)&&(P["".concat(h[0],"-").concat(e)]=!0,r.logger.warn('key "'.concat(o,'" for languages "').concat(h.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),h.forEach((function(t){if(!r.isValidLookup(i)){s=t;var o=c,u=[o],l,h;if(r.i18nFormat&&r.i18nFormat.addLookupKeys)r.i18nFormat.addLookupKeys(u,c,t,e,n);else f&&(l=r.pluralResolver.getSuffix(t,n.count)),f&&d&&u.push(o+l),d&&u.push(o+="".concat(r.options.contextSeparator).concat(n.context)),f&&u.push(o+=l);for(;h=u.pop();)r.isValidLookup(i)||(a=h,i=r.getResource(t,e,h,n))}})))}))}})),{res:i,usedKey:o,exactUsedKey:a,usedLng:s,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,r,n,i):this.resourceStore.getResource(t,r,n,i)}}],[{key:"hasDefaultValue",value:function e(t){var r="defaultValue";for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&r===n.substring(0,r.length)&&void 0!==t[n])return!0;return!1}}]),t}(k);function z(e){return e.charAt(0).toUpperCase()+e.slice(1)}var U=function(){function e(t){p.default(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=x.create("languageUtils")}return b.default(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var r=t.split("-");return 2===r.length?null:(r.pop(),"x"===r[r.length-1].toLowerCase()?null:this.formatLanguageCode(r.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var r=t.split("-");return this.formatLanguageCode(r[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var r=["hans","hant","latn","cyrl","cans","mong","arab"],n=t.split("-");return this.options.lowerCaseLng?n=n.map((function(e){return e.toLowerCase()})):2===n.length?(n[0]=n[0].toLowerCase(),n[1]=n[1].toUpperCase(),r.indexOf(n[1].toLowerCase())>-1&&(n[1]=z(n[1].toLowerCase()))):3===n.length&&(n[0]=n[0].toLowerCase(),2===n[1].length&&(n[1]=n[1].toUpperCase()),"sgn"!==n[0]&&2===n[2].length&&(n[2]=n[2].toUpperCase()),r.indexOf(n[1].toLowerCase())>-1&&(n[1]=z(n[1].toLowerCase())),r.indexOf(n[2].toLowerCase())>-1&&(n[2]=z(n[2].toLowerCase()))),n.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var r=this,n;return t?(t.forEach((function(e){if(!n){var t=r.formatLanguageCode(e);r.options.supportedLngs&&!r.isSupportedCode(t)||(n=t)}})),!n&&this.options.supportedLngs&&t.forEach((function(e){if(!n){var t=r.getLanguagePartFromCode(e);if(r.isSupportedCode(t))return n=t;n=r.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n):null}},{key:"getFallbackCodes",value:function e(t,r){if(!t)return[];if("function"==typeof t&&(t=t(r)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!r)return t.default||[];var n=t[r];return n||(n=t[this.getScriptPartFromCode(r)]),n||(n=t[this.formatLanguageCode(r)]),n||(n=t[this.getLanguagePartFromCode(r)]),n||(n=t.default),n||[]}},{key:"toResolveHierarchy",value:function e(t,r){var n=this,i=this.getFallbackCodes(r||this.options.fallbackLng||[],t),o=[],a=function e(t){t&&(n.isSupportedCode(t)?o.push(t):n.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&a(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&a(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&a(this.getLanguagePartFromCode(t))):"string"==typeof t&&a(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&a(n.formatLanguageCode(e))})),o}}]),e}(),$=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],H={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function W(){var e={};return $.forEach((function(t){t.lngs.forEach((function(r){e[r]={numbers:t.nr,plurals:H[t.fc]}}))})),e}var Y=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};p.default(this,e),this.languageUtils=t,this.options=r,this.logger=x.create("pluralResolver"),this.rules=W()}return b.default(e,[{key:"addRule",value:function e(t,r){this.rules[t]=r}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var r=this.getRule(t);return r&&r.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,r){return this.getSuffixes(t).map((function(e){return r+e}))}},{key:"getSuffixes",value:function e(t){var r=this,n=this.getRule(t);return n?n.numbers.map((function(e){return r.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,r){var n=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(r):i.plurals(Math.abs(r)),a=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===a?a="plural":1===a&&(a=""));var s=function e(){return n.options.prepend&&a.toString()?n.options.prepend+a.toString():a.toString()};return"v1"===this.options.compatibilityJSON?1===a?"":"number"==typeof a?"_plural_".concat(a.toString()):s():"v2"===this.options.compatibilityJSON?s():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?s():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};p.default(this,e),this.logger=x.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return b.default(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var r=t.interpolation;this.escape=void 0!==r.escape?r.escape:R,this.escapeValue=void 0===r.escapeValue||r.escapeValue,this.useRawValueToEscape=void 0!==r.useRawValueToEscape&&r.useRawValueToEscape,this.prefix=r.prefix?B(r.prefix):r.prefixEscaped||"{{",this.suffix=r.suffix?B(r.suffix):r.suffixEscaped||"}}",this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||",",this.unescapePrefix=r.unescapeSuffix?"":r.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":r.unescapeSuffix||"",this.nestingPrefix=r.nestingPrefix?B(r.nestingPrefix):r.nestingPrefixEscaped||B("$t("),this.nestingSuffix=r.nestingSuffix?B(r.nestingSuffix):r.nestingSuffixEscaped||B(")"),this.nestingOptionsSeparator=r.nestingOptionsSeparator?r.nestingOptionsSeparator:r.nestingOptionsSeparator||",",this.maxReplaces=r.maxReplaces?r.maxReplaces:1e3,this.alwaysFormat=void 0!==r.alwaysFormat&&r.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var r="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(r,"g");var n="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(n,"g")}},{key:"interpolate",value:function e(t,r,n,i){var o=this,a,s,u,c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function l(e){return e.replace(/\$/g,"$$$$")}var f=function e(t){if(t.indexOf(o.formatSeparator)<0){var a=T(r,c,t);return o.alwaysFormat?o.format(a,void 0,n):a}var s=t.split(o.formatSeparator),u=s.shift().trim(),l=s.join(o.formatSeparator).trim();return o.format(T(r,c,u),l,n,i)};this.resetRegExp();var d=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return l(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?l(o.escape(t)):l(t)}}].forEach((function(e){for(u=0;a=e.regex.exec(t);){if(void 0===(s=f(a[1].trim())))if("function"==typeof d){var r=d(t,a,i);s="string"==typeof r?r:""}else{if(h){s=a[0];continue}o.logger.warn("missed to pass in variable ".concat(a[1]," for interpolating ").concat(t)),s=""}else"string"==typeof s||o.useRawValueToEscape||(s=j(s));if(t=t.replace(a[0],e.safeValue(s)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,r){var n=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o,a,s=h.default({},i);function u(e,t){var r=this.nestingOptionsSeparator;if(e.indexOf(r)<0)return e;var n=e.split(new RegExp("".concat(r,"[ ]*{"))),i="{".concat(n[1]);e=n[0],i=(i=this.interpolate(i,s)).replace(/'/g,'"');try{s=JSON.parse(i),t&&(s=h.default({},t,s))}catch(o){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),o),"".concat(e).concat(r).concat(i)}return delete s.defaultValue,e}for(s.applyPostProcessor=!1,delete s.defaultValue;o=this.nestingRegexp.exec(t);){var c=[],l=!1;if(o[0].includes(this.formatSeparator)&&!/{.*}/.test(o[1])){var f=o[1].split(this.formatSeparator).map((function(e){return e.trim()}));o[1]=f.shift(),c=f,l=!0}if((a=r(u.call(this,o[1].trim(),s),s))&&o[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=j(a)),a||(this.logger.warn("missed to resolve ".concat(o[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return n.format(e,t,i.lng,i)}),a.trim())),t=t.replace(o[0],a),this.regexp.lastIndex=0}return t}}]),e}();function K(e,t){for(var r=e.indexOf(t);-1!==r;)e.splice(r,1),r=e.indexOf(t)}var G=function(e){function t(e,r,n){var i,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return p.default(this,t),i=m.default(this,g.default(t).call(this)),N&&k.call(v.default(i)),i.backend=e,i.store=r,i.services=n,i.languageUtils=n.languageUtils,i.options=o,i.logger=x.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(n,o.backend,o),i}return y.default(t,e),b.default(t,[{key:"queueLoad",value:function e(t,r,n,i){var o=this,a=[],s=[],u=[],c=[];return t.forEach((function(e){var t=!0;r.forEach((function(r){var i="".concat(e,"|").concat(r);!n.reload&&o.store.hasResourceBundle(e,r)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?s.indexOf(i)<0&&s.push(i):(o.state[i]=1,t=!1,s.indexOf(i)<0&&s.push(i),a.indexOf(i)<0&&a.push(i),c.indexOf(r)<0&&c.push(r)))})),t||u.push(e)})),(a.length||s.length)&&this.queue.push({pending:s,loaded:{},errors:[],callback:i}),{toLoad:a,pending:s,toLoadLanguages:u,toLoadNamespaces:c}}},{key:"loaded",value:function e(t,r,n){var i=t.split("|"),o=i[0],a=i[1];r&&this.emit("failedLoading",o,a,r),n&&this.store.addResourceBundle(o,a,n),this.state[t]=r?-1:2;var e={};this.queue.forEach((function(n){O(n.loaded,[o],a),K(n.pending,t),r&&n.errors.push(r),0!==n.pending.length||n.done||(Object.keys(n.loaded).forEach((function(t){e[t]||(e[t]=[]),n.loaded[t].length&&n.loaded[t].forEach((function(r){e[t].indexOf(r)<0&&e[t].push(r)}))})),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,r,n){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,s=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[n](t,r,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,r,n,o+1,2*a,s)}),a):s(e,u)})):s(null,{})}},{key:"prepareLoading",value:function e(t,r){var n=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof r&&(r=[r]);var a=this.queueLoad(t,r,i,o);if(!a.toLoad.length)return a.pending.length||o(),null;a.toLoad.forEach((function(e){n.loadOne(e)}))}},{key:"load",value:function e(t,r,n){this.prepareLoading(t,r,{},n)}},{key:"reload",value:function e(t,r,n){this.prepareLoading(t,r,{reload:!0},n)}},{key:"loadOne",value:function e(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],a=i[1];this.read(o,a,"read",void 0,void 0,(function(e,i){e&&r.logger.warn("".concat(n,"loading namespace ").concat(a," for language ").concat(o," failed"),e),!e&&i&&r.logger.log("".concat(n,"loaded namespace ").concat(a," for language ").concat(o),i),r.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,r,n,i,o){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(r)?this.logger.warn('did not save key "'.concat(n,'" as the namespace "').concat(r,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=n&&""!==n&&(this.backend&&this.backend.create&&this.backend.create(t,r,n,i,null,h.default({},a,{isUpdate:o})),t&&t[0]&&this.store.addResource(t[0],r,n,i))}}]),t}(k);function X(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var r={};if("object"===d.default(t[1])&&(r=t[1]),"string"==typeof t[1]&&(r.defaultValue=t[1]),"string"==typeof t[2]&&(r.tDescription=t[2]),"object"===d.default(t[2])||"object"===d.default(t[3])){var n=t[3]||t[2];Object.keys(n).forEach((function(e){r[e]=n[e]}))}return r},interpolation:{escapeValue:!0,format:function e(t,r,n,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function Z(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function J(){}var Q,ee=new(function(e){function t(){var e,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(p.default(this,t),e=m.default(this,g.default(t).call(this)),N&&k.call(v.default(e)),e.options=Z(r),e.services={},e.logger=x,e.modules={external:[]},n&&!e.isInitialized&&!r.isClone){if(!e.options.initImmediate)return e.init(r,n),m.default(e,v.default(e));setTimeout((function(){e.init(r,n)}),0)}return e}return y.default(t,e),b.default(t,[{key:"init",value:function e(){var t=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;function i(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof r&&(n=r,r={}),r.whitelist&&!r.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),r.nonExplicitWhitelist&&!r.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=h.default({},X(),this.options,Z(r)),this.format=this.options.interpolation.format,n||(n=J),!this.options.isClone){this.modules.logger?x.init(i(this.modules.logger),this.options):x.init(null,this.options);var o=new U(this.options);this.store=new F(this.options.resources,this.options);var a=this.services;a.logger=x,a.resourceStore=this.store,a.languageUtils=o,a.pluralResolver=new Y(o,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new V(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new G(i(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i1?r-1:0),i=1;i0&&"dev"!==s[0]&&(this.options.lng=s[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var u=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];u.forEach((function(e){t[e]=function(){var r;return(r=t.store)[e].apply(r,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var r;return(r=t.store)[e].apply(r,arguments),t}}));var l=S(),f=function e(){var r=function e(r,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),n(r,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return r(null,t.t.bind(t));t.changeLanguage(t.options.lng,r)};return this.options.resources||!this.options.initImmediate?f():setTimeout(f,0),l}},{key:"loadResources",value:function e(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,i=n,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var a=[],s=function e(t){var n;t&&r.services.languageUtils.toResolveHierarchy(t).forEach((function(e){a.indexOf(e)<0&&a.push(e)}))};if(o)s(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return s(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return s(e)})),this.services.backendConnector.load(a,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,r,n){var i=S();return t||(t=this.languages),r||(r=this.options.ns),n||(n=J),this.services.backendConnector.reload(t,r,(function(e){i.resolve(),n(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&L.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,r){var n=this;this.isLanguageChangingTo=t;var i=S();this.emit("languageChanging",t);var o=function e(t,o){o?(n.language=o,n.languages=n.services.languageUtils.toResolveHierarchy(o),n.translator.changeLanguage(o),n.isLanguageChangingTo=void 0,n.emit("languageChanged",o),n.logger.log("languageChanged",o)):n.isLanguageChangingTo=void 0,i.resolve((function(){return n.t.apply(n,arguments)})),r&&r(t,(function(){return n.t.apply(n,arguments)}))},a=function e(t){var r="string"==typeof t?t:n.services.languageUtils.getBestMatchFromCodes(t);r&&(n.language||(n.language=r,n.languages=n.services.languageUtils.toResolveHierarchy(r)),n.translator.language||n.translator.changeLanguage(r),n.services.languageDetector&&n.services.languageDetector.cacheUserLanguage(r)),n.loadResources(r,(function(e){o(e,r)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(a):a(t):a(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,r){var n=this,i=function e(t,r){var i;if("object"!==d.default(r)){for(var o=arguments.length,a=new Array(o>2?o-2:0),s=2;s1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,a=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var s=function e(t,n){var i=r.services.backendConnector.state["".concat(t,"|").concat(n)];return-1===i||2===i};if(n.precheck){var u=n.precheck(this,s);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!s(i,t)||o&&!s(a,t)))}},{key:"loadNamespaces",value:function e(t,r){var n=this,i=S();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){n.options.ns.indexOf(e)<0&&n.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),r&&r(e)})),i):(r&&r(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,r){var n=S();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){n.resolve(),r&&r(e)})),n):(r&&r(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var r}},{key:"createInstance",value:function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new t(r,n)}},{key:"cloneInstance",value:function e(){var r=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,o=h.default({},this.options,n,{isClone:!0}),a=new t(o),s=["store","services","language"];return s.forEach((function(e){a[e]=r[e]})),a.services=h.default({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new q(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n=0&&r<=y}}function Z(e){return function(t){return null==t?void 0:t[e]}}var J=Z("byteLength"),Q=X(J),ee=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function te(e){return p?p(e)&&!U(e):Q(e)&&ee.test(s.call(e))}var re=c?te:G(!1),ne=Z("length");function ie(e){for(var t={},r=e.length,n=0;n":">",'"':""","'":"'","`":"`"},st=ot(at),ut,ct=ot(Ce(at)),lt=ce.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},ft=/(.)^/,dt={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},ht=/\\|'|\r|\n|\u2028|\u2029/g;function pt(e){return"\\"+dt[e]}var bt=/^\s*(\w|\$)+\s*$/;function mt(e,t,r){!t&&r&&(t=r),t=Re({},t,ce.templateSettings);var n=RegExp([(t.escape||ft).source,(t.interpolate||ft).source,(t.evaluate||ft).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(n,(function(t,r,n,a,s){return o+=e.slice(i,s).replace(ht,pt),i=s+t.length,r?o+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?o+="'+\n((__t=("+n+"))==null?'':__t)+\n'":a&&(o+="';\n"+a+"\n__p+='"),t})),o+="';\n";var a=t.variable,s;if(a){if(!bt.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{s=new Function(a,"_",o)}catch(c){throw c.source=o,c}var u=function(e){return s.call(this,e,ce)};return u.source="function("+a+"){\n"+o+"}",u}function gt(e,t,r){var n=(t=Ue(t)).length;if(!n)return N(r)?r.call(e):r;for(var i=0;i1)jt(s,t-1,r,n),i=n.length;else for(var u=0,c=s.length;ut?(n&&(clearTimeout(n),n=null),s=c,a=e.apply(i,o),n||(i=o=null)):n||!1===r.trailing||(n=setTimeout(u,l)),a};return c.cancel=function(){clearTimeout(n),s=0,n=i=o=null},c}function Tt(e,t,r){var n,i,o,a,s,u=function(){var c=it()-i;t>c?n=setTimeout(u,t-c):(n=null,r||(a=e.apply(s,o)),n||(o=s=null))},c=w((function(c){return s=this,o=c,i=it(),n||(n=setTimeout(u,t),r&&(a=e.apply(s,o))),a}));return c.cancel=function(){clearTimeout(n),n=o=s=null},c}function Mt(e,t){return xt(t,e)}function Bt(e){return function(){return!e.apply(this,arguments)}}function It(){var e=arguments,t=e.length-1;return function(){for(var r=t,n=e[t].apply(this,arguments);r--;)n=e[r].call(this,n);return n}}function Rt(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function Nt(e,t){var r;return function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=null),r}}var Ft=xt(Nt,2);function Lt(e,t,r){t=Je(t,r);for(var n=ae(e),i,o=0,a=n.length;o0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+u,s):u=o>=0?Math.min(o+1,u):o+u+1;else if(r&&o&&u)return n[o=r(n,i)]===i?o:-1;if(i!=i)return(o=t(a.call(n,s,u),K))>=0?o+s:-1;for(o=e>0?s:u-1;o>=0&&o0?0:a-1;for(i||(n=t[o?o[s]:s],s+=e);s>=0&&s=3;return t(e,Ge(r,i,4),n,o)}}var Zt=Xt(1),Jt=Xt(-1);function Qt(e,t,r){var n=[];return t=Je(t,r),Kt(e,(function(e,r,i){t(e,r,i)&&n.push(e)})),n}function er(e,t,r){return Qt(e,Bt(Je(t)),r)}function tr(e,t,r){t=Je(t,r);for(var n=!St(e)&&ae(e),i=(n||e).length,o=0;o=0}var ir=w((function(e,t,r){var n,i;return N(t)?i=t:(t=Ue(t),n=t.slice(0,-1),t=t[t.length-1]),Gt(e,(function(e){var o=i;if(!o){if(n&&n.length&&(e=$e(e,n)),null==e)return;o=e[t]}return null==o?o:o.apply(e,r)}))}));function or(e,t){return Gt(e,Ke(t))}function ar(e,t){return Qt(e,Ve(t))}function sr(e,t,r){var n=-1/0,i=-1/0,o,a;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,u=(e=St(e)?e:Ee(e)).length;sn&&(n=o);else t=Je(t,r),Kt(e,(function(e,r,o){((a=t(e,r,o))>i||a===-1/0&&n===-1/0)&&(n=e,i=a)}));return n}function ur(e,t,r){var n=1/0,i=1/0,o,a;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,u=(e=St(e)?e:Ee(e)).length;sn||void 0===r)return 1;if(r1&&(n=Ge(n,t[1])),t=be(e)):(n=wr,t=jt(t,!1,!1),e=Object(e));for(var i=0,o=t.length;i1&&(n=t[1])):(t=Gt(jt(t,!1,!1),String),r=function(e,r){return!nr(t,r)}),_r(e,r,n)}));function kr(e,t,r){return a.call(e,0,Math.max(0,e.length-(null==t||r?1:t)))}function Sr(e,t,r){return null==e||e.length<1?null==t||r?void 0:[]:null==t||r?e[0]:kr(e,e.length-t)}function jr(e,t,r){return a.call(e,null==t||r?1:t)}function Ar(e,t,r){return null==e||e.length<1?null==t||r?void 0:[]:null==t||r?e[e.length-1]:jr(e,Math.max(0,e.length-t))}function Dr(e){return Qt(e,Boolean)}function Er(e,t){return jt(e,t,!1)}var Or=w((function(e,t){return t=jt(t,!0,!0),Qt(e,(function(e){return!nr(t,e)}))})),Cr=w((function(e,t){return Or(e,t)}));function Tr(e,t,r,n){S(t)||(n=r,r=t,t=!1),null!=r&&(r=Je(r,n));for(var i=[],o=[],a=0,s=ne(e);ae(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},c=new Set,l=(e,t)=>{const r=`LRU_CACHE_OPTION_${e}`;p(r)&&b(r,`${e} option`,`options.${t}`,w)},f=(e,t)=>{const r=`LRU_CACHE_METHOD_${e}`;if(p(r)){const{prototype:n}=w,{get:i}=Object.getOwnPropertyDescriptor(n,e);b(r,`${e} method`,`cache.${t}()`,i)}},d=(e,t)=>{const r=`LRU_CACHE_PROPERTY_${e}`;if(p(r)){const{prototype:n}=w,{get:i}=Object.getOwnPropertyDescriptor(n,e);b(r,`${e} property`,`cache.${t}`,i)}},h=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!c.has(e),b=(e,t,r,n)=>{c.add(e);const i=`The ${t} is deprecated. Please use ${r} instead.`;h(i,"DeprecationWarning",e,n)},m=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),g=e=>m(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=g(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class w{constructor(e={}){const{max:t=0,ttl:r,ttlResolution:n=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:a,allowStale:s,dispose:u,disposeAfter:f,noDisposeOnSet:d,noUpdateTTL:b,maxSize:v=0,maxEntrySize:_=0,sizeCalculation:x,fetchMethod:k,fetchContext:S,noDeleteOnFetchRejection:j,noDeleteOnStaleGet:A}=e,{length:D,maxAge:E,stale:O}=e instanceof w?{}:e;if(0!==t&&!m(t))throw new TypeError("max option must be a nonnegative integer");const C=t?g(t):Array;if(!C)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=_||this.maxSize,this.sizeCalculation=x||D,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=k||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=S,!this.fetchMethod&&void 0!==S)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new C(t),this.prev=new C(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof f?(this.disposeAfter=f,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!d,this.noUpdateTTL=!!b,this.noDeleteOnFetchRejection=!!j,0!==this.maxEntrySize){if(0!==this.maxSize&&!m(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!m(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!s||!!O,this.noDeleteOnStaleGet=!!A,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!a,this.ttlResolution=m(n)||0===n?n:1,this.ttlAutopurge=!!i,this.ttl=r||E||0,this.ttl){if(!m(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){c.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";h(t,"UnboundedCacheWarning",e,w)}}O&&l("stale","allowStale"),E&&l("maxAge","ttl"),D&&l("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,r=n.now())=>{if(this.starts[e]=0!==t?r:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const r=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);r.unref&&r.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?n.now():0};let e=0;const t=()=>{const t=n.now();if(this.ttlResolution>0){e=t;const r=setTimeout(()=>e=0,this.ttlResolution);r.unref&&r.unref()}return t};this.getRemainingTTL=r=>{const n=this.keyMap.get(r);return void 0===n?0:0===this.ttls[n]||0===this.starts[n]?1/0:this.starts[n]+this.ttls[n]-(e||t())},this.isStale=r=>0!==this.ttls[r]&&0!==this.starts[r]&&(e||t())-this.starts[r]>this.ttls[r]}updateItemAge(e){}setItemTTL(e,t,r){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,r,n)=>{if(this.isBackgroundFetch(t))return 0;if(!m(r)){if(!n)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof n)throw new TypeError("sizeCalculation must be a function");if(r=n(t,e),!m(r))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return r},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,r,n){if(r||n)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const r of this.indexes())if(e(this.valList[r],this.keyList[r],this))return this.get(this.keyList[r],t)}forEach(e,t=this){for(const r of this.indexes())e.call(t,this.valList[r],this.keyList[r],this)}rforEach(e,t=this){for(const r of this.rindexes())e.call(t,this.valList[r],this.keyList[r],this)}get prune(){return f("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const r=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,a={value:o};if(this.ttls){a.ttl=this.ttls[t];const e=n.now()-this.starts[t];a.start=Math.floor(Date.now()-e)}this.sizes&&(a.size=this.sizes[t]),e.unshift([r,a])}return e}load(e){this.clear();for(const[t,r]of e){if(r.start){const e=Date.now()-r.start;r.start=n.now()-e}this.set(t,r.value,r)}}dispose(e,t,r){}set(e,t,{ttl:r=this.ttl,start:n,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:s=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,a),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),s=!1;else{const r=this.valList[u];t!==r&&(this.isBackgroundFetch(r)?r.__abortController.abort():i||(this.dispose(r,e,"set"),this.disposeAfter&&this.disposed.push([r,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===r||0!==this.ttl||this.ttls||this.initializeTTLTracking(),s||this.setItemTTL(u,r,n),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,r=this.keyList[t],n=this.valList[t];return this.isBackgroundFetch(n)?n.__abortController.abort():(this.dispose(n,r,"evict"),this.disposeAfter&&this.disposed.push([n,r,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(r),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const r=this.keyMap.get(e);return void 0!==r&&!this.isStale(r)&&(t&&this.updateItemAge(r),!0)}peek(e,{allowStale:t=this.allowStale}={}){const r=this.keyMap.get(e);if(void 0!==r&&(t||!this.isStale(r))){const e=this.valList[r];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,r,n){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const a=new o,s={signal:a.signal,options:r,context:n},u=t=>(a.signal.aborted||this.set(e,t,s.options),t),c=n=>{if(this.valList[t]===f){const n=!r.noDeleteOnFetchRejection||void 0===f.__staleWhileFetching;n?this.delete(e):this.valList[t]=f.__staleWhileFetching}if(f.__returned===f)throw n},l=t=>t(this.fetchMethod(e,i,s)),f=new Promise(l).then(u,c);return f.__abortController=a,f.__staleWhileFetching=i,f.__returned=null,void 0===t?(this.set(e,f,s.options),t=this.keyMap.get(e)):this.valList[t]=f,f}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:a=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,fetchContext:l=this.fetchContext,forceRefresh:f=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:r,noDeleteOnStaleGet:n});const d={allowStale:t,updateAgeOnGet:r,noDeleteOnStaleGet:n,ttl:i,noDisposeOnSet:o,size:a,sizeCalculation:s,noUpdateTTL:u,noDeleteOnFetchRejection:c};let h=this.keyMap.get(e);if(void 0===h){const t=this.backgroundFetch(e,h,d,l);return t.__returned=t}{const n=this.valList[h];if(this.isBackgroundFetch(n))return t&&void 0!==n.__staleWhileFetching?n.__staleWhileFetching:n.__returned=n;if(!f&&!this.isStale(h))return this.moveToTail(h),r&&this.updateItemAge(h),n;const i=this.backgroundFetch(e,h,d,l);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],a=this.isBackgroundFetch(o);if(this.isStale(i))return a?t?o.__staleWhileFetching:void 0:(n||this.delete(e),t?o:void 0);if(a)return;return this.moveToTail(i),r&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return f("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const r=this.keyMap.get(e);if(void 0!==r)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(r);const t=this.valList[r];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[r]=null,this.valList[r]=null,r===this.tail?this.tail=this.prev[r]:r===this.head?this.head=this.next[r]:(this.next[this.prev[r]]=this.next[r],this.prev[this.next[r]]=this.prev[r]),this.size--,this.free.push(r)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const r=this.keyList[e];this.dispose(t,r,"delete"),this.disposeAfter&&this.disposed.push([t,r,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return f("reset","clear"),this.clear}get length(){return d("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=w}}}},"form-builder":{"package.json":function e(t,r,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":function e(t,r){ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var r in t)if(void 0!==e.style[r])return{end:t[r]};return!1}e.fn.emulateTransitionEnd=function(t){var r=!1,n=this,i;return e(this).one("bsTransitionEnd",(function(){r=!0})),setTimeout((function(){r||e(n).trigger(e.support.transition.end)}),t),this},e((function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})}))}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',r=function(r){e(r).on("click",t,this.close)};function n(t){return this.each((function(){var n=e(this),i=n.data("bs.alert");i||n.data("bs.alert",i=new r(this)),"string"==typeof t&&i[t].call(n)}))}r.VERSION="3.4.1",r.TRANSITION_DURATION=150,r.prototype.close=function(t){var n=e(this),i=n.attr("data-target");i||(i=(i=n.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=e(document).find(i);function a(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=n.closest(".alert")),o.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),e.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",a).emulateTransitionEnd(r.TRANSITION_DURATION):a())};var i=e.fn.alert;e.fn.alert=n,e.fn.alert.Constructor=r,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,r.prototype.close)}(jQuery),function(e){"use strict";var t=function(r,n){this.$element=e(r),this.options=e.extend({},t.DEFAULTS,n),this.isLoading=!1};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.button"),o="object"==typeof r&&r;i||n.data("bs.button",i=new t(this,o)),"toggle"==r?i.toggle():r&&i.setState(r)}))}t.VERSION="3.4.1",t.DEFAULTS={loadingText:"loading..."},t.prototype.setState=function(t){var r="disabled",n=this.$element,i=n.is("input")?"val":"html",o=n.data();t+="Text",null==o.resetText&&n.data("resetText",n[i]()),setTimeout(e.proxy((function(){n[i](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,n.addClass(r).attr(r,r).prop(r,!0)):this.isLoading&&(this.isLoading=!1,n.removeClass(r).removeAttr(r).prop(r,!1))}),this),0)},t.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var r=this.$element.find("input");"radio"==r.prop("type")?(r.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==r.prop("type")&&(r.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),r.prop("checked",this.$element.hasClass("active")),e&&r.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=r,e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn");r.call(n,"toggle"),e(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),n.is("input,button")?n.trigger("focus"):n.find("input:visible,button:visible").first().trigger("focus"))})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))}))}(jQuery),function(e){"use strict";var t=function(t,r){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=r,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.carousel"),o=e.extend({},t.DEFAULTS,n.data(),"object"==typeof r&&r),a="string"==typeof r?r:o.slide;i||n.data("bs.carousel",i=new t(this,o)),"number"==typeof r?i.to(r):a?i[a]():o.interval&&i.pause().cycle()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=600,t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},t.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},t.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},t.prototype.getItemForDirection=function(e,t){var r=this.getItemIndex(t),n;if(("prev"==e&&0===r||"next"==e&&r==this.$items.length-1)&&!this.options.wrap)return t;var i,o=(r+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(o)},t.prototype.to=function(e){var t=this,r=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(e>this.$items.length-1||e<0))return this.sliding?this.$element.one("slid.bs.carousel",(function(){t.to(e)})):r==e?this.pause().cycle():this.slide(e>r?"next":"prev",this.$items.eq(e))},t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},t.prototype.next=function(){if(!this.sliding)return this.slide("next")},t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},t.prototype.slide=function(r,n){var i=this.$element.find(".item.active"),o=n||this.getItemForDirection(r,i),a=this.interval,s="next"==r?"left":"right",u=this;if(o.hasClass("active"))return this.sliding=!1;var c=o[0],l=e.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var f=e(this.$indicators.children()[this.getItemIndex(o)]);f&&f.addClass("active")}var d=e.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(r),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one("bsTransitionEnd",(function(){o.removeClass([r,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),u.sliding=!1,setTimeout((function(){u.$element.trigger(d)}),0)})).emulateTransitionEnd(t.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(d)),a&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=r,e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this};var i=function(t){var n=e(this),i=n.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=n.attr("data-target")||i,a=e(document).find(o);if(a.hasClass("carousel")){var s=e.extend({},a.data(),n.data()),u=n.attr("data-slide-to");u&&(s.interval=!1),r.call(a,s),u&&a.data("bs.carousel").to(u),t.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",i).on("click.bs.carousel.data-api","[data-slide-to]",i),e(window).on("load",(function(){e('[data-ride="carousel"]').each((function(){var t=e(this);r.call(t,t.data())}))}))}(jQuery),function(e){"use strict";var t=function(r,n){this.$element=e(r),this.options=e.extend({},t.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+r.id+'"],[data-toggle="collapse"][data-target="#'+r.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function r(t){var r,n=t.attr("data-target")||(r=t.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"");return e(document).find(n)}function n(r){return this.each((function(){var n=e(this),i=n.data("bs.collapse"),o=e.extend({},t.DEFAULTS,n.data(),"object"==typeof r&&r);!i&&o.toggle&&/show|hide/.test(r)&&(o.toggle=!1),i||n.data("bs.collapse",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.TRANSITION_DURATION=350,t.DEFAULTS={toggle:!0},t.prototype.dimension=function(){var e;return this.$element.hasClass("width")?"width":"height"},t.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var r,i=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(i&&i.length&&(r=i.data("bs.collapse"))&&r.transitioning)){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){i&&i.length&&(n.call(i,"hide"),r||i.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return s.call(this);var u=e.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",e.proxy(s,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[a](this.$element[0][u])}}}},t.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var r=e.Event("hide.bs.collapse");if(this.$element.trigger(r),!r.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!e.support.transition)return i.call(this);this.$element[n](0).one("bsTransitionEnd",e.proxy(i,this)).emulateTransitionEnd(t.TRANSITION_DURATION)}}},t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},t.prototype.getParent=function(){return e(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy((function(t,n){var i=e(n);this.addAriaAndCollapsedClass(r(i),i)}),this)).end()},t.prototype.addAriaAndCollapsedClass=function(e,t){var r=e.hasClass("in");e.attr("aria-expanded",r),t.toggleClass("collapsed",!r).attr("aria-expanded",r)};var i=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=i,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',(function(t){var i=e(this);i.attr("data-target")||t.preventDefault();var o=r(i),a,s=o.data("bs.collapse")?"toggle":i.data();n.call(o,s)}))}(jQuery),function(e){"use strict";var t=".dropdown-backdrop",r='[data-toggle="dropdown"]',n=function(t){e(t).on("click.bs.dropdown",this.toggle)};function i(t){var r=t.attr("data-target");r||(r=(r=t.attr("href"))&&/#[A-Za-z]/.test(r)&&r.replace(/.*(?=#[^\s]*$)/,""));var n="#"!==r?e(document).find(r):null;return n&&n.length?n:t.parent()}function o(n){n&&3===n.which||(e(t).remove(),e(r).each((function(){var t=e(this),r=i(t),o={relatedTarget:this};r.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(r[0],n.target)||(r.trigger(n=e.Event("hide.bs.dropdown",o)),n.isDefaultPrevented()||(t.attr("aria-expanded","false"),r.removeClass("open").trigger(e.Event("hidden.bs.dropdown",o)))))})))}function a(t){return this.each((function(){var r=e(this),i=r.data("bs.dropdown");i||r.data("bs.dropdown",i=new n(this)),"string"==typeof t&&i[t].call(r)}))}n.VERSION="3.4.1",n.prototype.toggle=function(t){var r=e(this);if(!r.is(".disabled, :disabled")){var n=i(r),a=n.hasClass("open");if(o(),!a){"ontouchstart"in document.documentElement&&!n.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",o);var s={relatedTarget:this};if(n.trigger(t=e.Event("show.bs.dropdown",s)),t.isDefaultPrevented())return;r.trigger("focus").attr("aria-expanded","true"),n.toggleClass("open").trigger(e.Event("shown.bs.dropdown",s))}return!1}},n.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var n=e(this);if(t.preventDefault(),t.stopPropagation(),!n.is(".disabled, :disabled")){var o=i(n),a=o.hasClass("open");if(!a&&27!=t.which||a&&27==t.which)return 27==t.which&&o.find(r).trigger("focus"),n.trigger("click");var s=" li:not(.disabled):visible a",u=o.find(".dropdown-menu"+s);if(u.length){var c=u.index(t.target);38==t.which&&c>0&&c--,40==t.which&&cdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},t.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:i},c.prototype.init=function(t,r,n){if(this.enabled=!0,this.type=t,this.$element=e(r),this.options=this.getOptions(n),this.$viewport=this.options.viewport&&e(document).find(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var i=this.options.trigger.split(" "),o=i.length;o--;){var a=i[o];if("click"==a)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=a){var s="hover"==a?"mouseenter":"focusin",u="hover"==a?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(u+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(r){var n=this.$element.data();for(var i in n)n.hasOwnProperty(i)&&-1!==e.inArray(i,t)&&delete n[i];return(r=e.extend({},this.getDefaults(),n,r)).delay&&"number"==typeof r.delay&&(r.delay={show:r.delay,hide:r.delay}),r.sanitize&&(r.template=u(r.template,r.whiteList,r.sanitizeFn)),r},c.prototype.getDelegateOptions=function(){var t={},r=this.getDefaults();return this._options&&e.each(this._options,(function(e,n){r[e]!=n&&(t[e]=n)})),t},c.prototype.enter=function(t){var r=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(r||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r)),t instanceof e.Event&&(r.inState["focusin"==t.type?"focus":"hover"]=!0),r.tip().hasClass("in")||"in"==r.hoverState)r.hoverState="in";else{if(clearTimeout(r.timeout),r.hoverState="in",!r.options.delay||!r.options.delay.show)return r.show();r.timeout=setTimeout((function(){"in"==r.hoverState&&r.show()}),r.options.delay.show)}},c.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},c.prototype.leave=function(t){var r=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);if(r||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r)),t instanceof e.Event&&(r.inState["focusout"==t.type?"focus":"hover"]=!1),!r.isInStateTrue()){if(clearTimeout(r.timeout),r.hoverState="out",!r.options.delay||!r.options.delay.hide)return r.hide();r.timeout=setTimeout((function(){"out"==r.hoverState&&r.hide()}),r.options.delay.hide)}},c.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var r=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!r)return;var n=this,i=this.tip(),o=this.getUID(this.type);this.setContent(),i.attr("id",o),this.$element.attr("aria-describedby",o),this.options.animation&&i.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,i[0],this.$element[0]):this.options.placement,s=/\s?auto?\s?/i,u=s.test(a);u&&(a=a.replace(s,"")||"top"),i.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?i.appendTo(e(document).find(this.options.container)):i.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),f=i[0].offsetWidth,d=i[0].offsetHeight;if(u){var h=a,p=this.getPosition(this.$viewport);a="bottom"==a&&l.bottom+d>p.bottom?"top":"top"==a&&l.top-dp.width?"left":"left"==a&&l.left-fa.top+a.height&&(i.top=a.top+a.height-u)}else{var c=t.left-o,l=t.left+o+r;ca.right&&(i.left=a.left+a.width-l)}return i},c.prototype.getTitle=function(){var e,t=this.$element,r=this.options;return e=t.attr("data-original-title")||("function"==typeof r.title?r.title.call(t[0]):r.title)},c.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(t){var r=this;t&&((r=e(t.currentTarget).data("bs."+this.type))||(r=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,r))),t?(r.inState.click=!r.inState.click,r.isInStateTrue()?r.enter(r):r.leave(r)):r.tip().hasClass("in")?r.leave(r):r.enter(r)},c.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide((function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null,e.$element=null}))},c.prototype.sanitizeHtml=function(e){return u(e,this.options.whiteList,this.options.sanitizeFn)};var f=e.fn.tooltip;e.fn.tooltip=l,e.fn.tooltip.Constructor=c,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=f,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");function r(r){return this.each((function(){var n=e(this),i=n.data("bs.popover"),o="object"==typeof r&&r;!i&&/destroy|hide/.test(r)||(i||n.data("bs.popover",i=new t(this,o)),"string"==typeof r&&i[r]())}))}t.VERSION="3.4.1",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),r=this.getContent();if(this.options.html){var n=typeof r;this.options.sanitize&&(t=this.sanitizeHtml(t),"string"===n&&(r=this.sanitizeHtml(r))),e.find(".popover-title").html(t),e.find(".popover-content").children().detach().end()["string"===n?"html":"append"](r)}else e.find(".popover-title").text(t),e.find(".popover-content").children().detach().end().text(r);e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=e.fn.popover;e.fn.popover=r,e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(jQuery),function(e){"use strict";function t(r,n){this.$body=e(document.body),this.$scrollElement=e(r).is(document.body)?e(window):e(r),this.options=e.extend({},t.DEFAULTS,n),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function r(r){return this.each((function(){var n=e(this),i=n.data("bs.scrollspy"),o="object"==typeof r&&r;i||n.data("bs.scrollspy",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,r="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(r="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map((function(){var t=e(this),i=t.data("target")||t.attr("href"),o=/^#./.test(i)&&e(i);return o&&o.length&&o.is(":visible")&&[[o[r]().top+n,i]]||null})).sort((function(e,t){return e[0]-t[0]})).each((function(){t.offsets.push(this[0]),t.targets.push(this[1])}))},t.prototype.process=function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.getScrollHeight(),r=this.options.offset+t-this.$scrollElement.height(),n=this.offsets,i=this.targets,o=this.activeTarget,a;if(this.scrollHeight!=t&&this.refresh(),e>=r)return o!=(a=i[i.length-1])&&this.activate(a);if(o&&e=n[a]&&(void 0===n[a+1]||e .active"),a=i&&e.support.transition&&(o.length&&o.hasClass("fade")||!!n.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),r.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(r[0].offsetWidth,r.addClass("in")):r.removeClass("fade"),r.parent(".dropdown-menu").length&&r.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&a?o.one("bsTransitionEnd",s).emulateTransitionEnd(t.TRANSITION_DURATION):s(),o.removeClass("in")};var n=e.fn.tab;e.fn.tab=r,e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this};var i=function(t){t.preventDefault(),r.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(e){"use strict";var t=function(r,n){this.options=e.extend({},t.DEFAULTS,n);var i=this.options.target===t.DEFAULTS.target?e(this.options.target):e(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(r),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function r(r){return this.each((function(){var n=e(this),i=n.data("bs.affix"),o="object"==typeof r&&r;i||n.data("bs.affix",i=new t(this,o)),"string"==typeof r&&i[r]()}))}t.VERSION="3.4.1",t.RESET="affix affix-top affix-bottom",t.DEFAULTS={offset:0,target:window},t.prototype.getState=function(e,t,r,n){var i=this.$target.scrollTop(),o=this.$element.offset(),a=this.$target.height();if(null!=r&&"top"==this.affixed)return i=e-n&&"bottom"},t.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(t.RESET).addClass("affix");var e=this.$target.scrollTop(),r=this.$element.offset();return this.pinnedOffset=r.top-e},t.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},t.prototype.checkPosition=function(){if(this.$element.is(":visible")){var r=this.$element.height(),n=this.options.offset,i=n.top,o=n.bottom,a=Math.max(e(document).height(),e(document.body).height());"object"!=typeof n&&(o=i=n),"function"==typeof i&&(i=n.top(this.$element)),"function"==typeof o&&(o=n.bottom(this.$element));var s=this.getState(a,r,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var u="affix"+(s?"-"+s:""),c=e.Event(u+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(t.RESET).addClass(u).trigger(u.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:a-r-o})}};var n=e.fn.affix;e.fn.affix=r,e.fn.affix.Constructor=t,e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",(function(){e('[data-spy="affix"]').each((function(){var t=e(this),n=t.data();n.offset=n.offset||{},null!=n.offsetBottom&&(n.offset.bottom=n.offsetBottom),null!=n.offsetTop&&(n.offset.top=n.offsetTop),r.call(t,n)}))}))}(jQuery)}}}},fibers:{"package.json":function e(t,r,e){e.exports={name:"fibers",version:"5.0.3",main:"fibers"}},"fibers.js":function e(t,r,e,n,i){if(process.fiberLib)e.exports=process.fiberLib;else{var o=t("fs"),a=t("path"),s=t("detect-libc");Math.random();var u=a.join(i,"bin",process.platform+"-"+process.arch+"-"+process.versions.modules+("linux"===process.platform?"-"+s.family:""),"fibers");try{process.fiberLib=e.exports=t(u).Fiber}catch(l){throw console.error("## There is an issue with `node-fibers` ##\n`"+u+".node` is missing.\n\nTry running this to fix the issue: "+process.execPath+" "+i.replace(" ","\\ ")+"/build"),console.error(l.stack||l.message||l),new Error("Missing binary. See message above.")}c(e.exports)}function c(e){try{var t=process.binding("async_wrap"),r;if(t.asyncIdStackSize instanceof Function)r=t.asyncIdStackSize;else{if(void 0===t.constants.kStackLength)throw new Error("Couldn't figure out how to get async stack size");f=t.constants.kStackLength,r=function(){return t.async_hook_fields[f]}}var n=t.popAsyncContext||t.popAsyncIds,i=t.pushAsyncContext||t.pushAsyncIds,o,a;if(!n||!i)throw new Error("Push/pop do not exist");o=void 0===t.constants.kExecutionAsyncId?t.constants.kCurrentAsyncId:t.constants.kExecutionAsyncId,a=void 0===t.constants.kTriggerAsyncId?t.constants.kCurrentTriggerId:t.constants.kTriggerAsyncId;var s=t.async_id_fields||t.async_uid_fields;function u(){for(var e=r(),t=new Array(e);e>0;--e){var i=s[o];t[e-1]={asyncId:i,triggerId:s[a]},n(i)}return t}function c(e){for(var t=0;t0)i.changeLanguage(e,n);else if(0!=s[u]){s[u]=0;var c=new XMLHttpRequest;c.overrideMimeType("application/json"),c.open("GET",u,!1),c.send(null),200===c.status?s[u]=1:s[u]=-1,r.addResourceBundle(e,a,JSON.parse(c.response)||{}),i.changeLanguage(e,n)}};r.changeLanguage=p;var b=function(e,t,r){return i.format(e,t,r)};r.format=b;var m=function(){return i.languages};r.getLanguages=m;var g=function(e,t){return i.loadLanguages(e,t)};r.loadLanguages=g;var v=function(e,t){return i.loadNamespaces(e,t)};r.loadNamespaces=v;var y=function(e,t){return i.on(e,t)};r.on=y;var w=function(e,t){return i.off(e,t)};r.off=w,n.__exportStar(t("./i18n/i18n"),r),n.__exportStar(t("./i18n/i18n.app"),r),n.__exportStar(t("./translations"),r)},i18n:{"i18n.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.fallbackKeys=r.getObjectI18nTemplate=r.translationI18nObjects=r.addObjectsI18n=r.translationI18nObject=void 0;var n=t("../index"),i=t("underscore"),o=t("clone"),a="_",s="base",u="core",c="translation",l=function(e,t){var r={lng:t,ns:c};if((0,n.exists)(e,r))return(0,n._t)(e,r)},f=function(e){return"".concat(e,"__object")},d=function(e,t){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t)},h=function(e,t){var r=d(e,t);return"".concat(r).concat("_","inlineHelpText")},p=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","group").concat("_").concat(r)},b=function(e,t,r){return t&&(t=t.replace(/\./g,"_")),"".concat(e).concat("_","field").concat("_").concat(t).concat("_","options").concat("_").concat(r)},m=function(e,t){return"".concat(e).concat("_","action").concat("_").concat(t)},g=function(e,t){return"".concat(e).concat("_","listview").concat("_").concat(t)},v=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},y=function(e,t,r){var n=f(t);return l(n,e)||r||""},w=function(e,t,r,n,i){var o=d(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=w(e,s,r,n,i))}return a||n||""},_=function(e,t,r,n,i){var o=h(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=_(e,s,r,n,i))}return a||n||""},x=function(e,t,r,n){var i=p(t,r);return l(i,e)||n||""},k=function(e,t,r,n,i,o){var a=b(t,r,n),s=l(a,e);if(!s){var u=v(o);u&&"base"!=t&&"core"!=t&&(s=k(e,u,r,n,i,o))}return s||i||""},S=function(e,t,r,n,i){var o=m(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=S(e,s,r,n,i))}return a||n||""},j=function(e,t,r,n,i){var o=g(t,r),a=l(o,e);if(!a){var s=v(i);s&&"base"!=t&&"core"!=t&&(a=j(e,s,r,n,i))}return a||n||""},A=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},D=function(e){i.forEach(e.fields,(function(e,t){var r=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;return e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return r.push(A(e))}))):r.push(A(e))})),e.options=r}catch(n){console.error("convertFieldsOptions error: ",e.options,n)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return r.push({label:e,value:t})})),e.options=r)}))},E=function(e,t,r){r.label=y(e,t,r.label),i.each(r.fields,(function(n,o){if(n.label=w(e,t,o,n.label,r.datasource),n.inlineHelpText&&(n.inlineHelpText=_(e,t,o,n.inlineHelpText,r.datasource)),n.group&&(n.group=x(e,t,n.group,n.group)),n.options){var a=[];i.each(n.options,(function(n){if(i.has(n,"value")){var s=k(e,t,o,n.value,n.label,r.datasource);a.push(i.extend({},n,{label:s}))}else a.push(n)})),n.options=a}})),i.each(r.actions,(function(n,i){n.label=S(e,t,i,n.label,r.datasource)})),i.each(r.list_views,(function(n,i){n.label=j(e,t,i,n.label,r.datasource)}))};r.translationI18nObject=E;var O=function(e){i.each(e,(function(e){(0,n.addResourceBundle)(e.lng,c,e.data,!0,!0)}))};r.addObjectsI18n=O;var C=function(e,t){i.each(t,(function(t,n){(0,r.translationI18nObject)(e,n,t)}))};r.translationI18nObjects=C;var T=function(e,t,r){var n=o(r);D(n);var a={};return a[f(t)]=y(e,t,n.label),i.each(n.fields,(function(r,o){a[d(t,o)]=w(e,t,o,r.label),r.inlineHelpText&&(a[h(t,o)]=_(e,t,o,r.inlineHelpText,n.datasource)),r.group&&(a[p(t,r.group)]=x(e,t,r.group,r.group)),r.options&&i.each(r.options,(function(r){i.has(r,"value")&&(a[b(t,o,r.value)]=k(e,t,o,r.value,r.label))}))})),i.each(n.actions,(function(r,n){a[m(t,n)]=S(e,t,n,r.label)})),i.each(n.list_views,(function(r,n){a[g(t,n)]=j(e,t,n,r.label)})),a};r.getObjectI18nTemplate=T,r.fallbackKeys={getObjectLabelKey:f,getObjectFieldLabelKey:d,getObjectFieldInlineHelpTextLabelKey:h,getObjectFieldGroupKey:p,getObjectFieldOptionsLabelKey:b,getObjectActionLabelKey:m,getObjectListviewLabelKey:g}},"i18n.app.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.appFallbackKeys=r.getAppI18nTemplate=r.translationI18nApps=r.translationI18nMenus=void 0;var n=t("../index"),i=t("underscore"),o=t("clone"),a="translation",s="_",u=function(e,t){var r={lng:t,ns:a};if((0,n.exists)(e,r))return(0,n._t)(e,r)},c=function(e){return"app".concat("_").concat(e).concat("_","name")},l=function(e){return"app".concat("_").concat(e).concat("_","description")},f=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");return"".concat(e).concat("_","tab_group").concat("_").concat(r)},d=function(e){return"menu".concat("_").concat(e)},h=function(e){return"tab".concat("_").concat(e)},p=function(e,t,r){var n=c(t);return u(n,e)||r||""},b=function(e,t,r){var n=l(t);return u(n,e)||r||""},m=function(e,t,r){var n=d(t);return u(n,e)||r||""},g=function(e,t,n){n.label=p(e,t,n.label||n.name),n.description=b(e,t,n.description),(0,r.translationI18nMenus)(e,n.admin_menus)},v=function(e,t){i.each(t,(function(t){var r=m(e,t._id,t.label||t.name);t.label=r,t.name=r}))};r.translationI18nMenus=v;var y=function(e,t){i.each(t,(function(t,r){g(e,r,t)}))};r.translationI18nApps=y;var w=function(e,t,r){var n=o(r),a={};return a[c(t)]=p(e,t,n.label||n.name),a[l(t)]=b(e,t,n.description),i.each(n.admin_menus,(function(t){a[d(t._id)]=m(e,t._id,t.label||t.name)})),a};r.getAppI18nTemplate=w,r.appFallbackKeys={getAppLabelKey:c,getAppDescriptionKey:l,getAppGroupKey:f,getMenuLabelKey:d,getTabKey:h}}},translations:{"index.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.SteedosTranslationPrefixKeys=r.convertObject=void 0;var n=t("tslib"),i=t("underscore");n.__exportStar(t("./objectTranslation"),r),n.__exportStar(t("./translation"),r),n.__exportStar(t("./templates/objectTranslation"),r),n.__exportStar(t("./templates/translation"),r);var o=function(e){var t;return(t=e.split(":")).length>1?{label:t[0],value:t[1]}:{label:t[0],value:t[0]}},a=function(e){i.forEach(e.fields,(function(e,t){var r=[];if(e.options&&i.isString(e.options))try{i.forEach(e.options.split("\n"),(function(e){var t;e.indexOf(",")?(t=e.split(","),i.forEach(t,(function(e){return r.push(o(e))}))):r.push(o(e))})),e.options=r}catch(n){console.error("convertFieldsOptions error: ",e.options,n)}else if(e.options&&i.isArray(e.options))try{i.forEach(e.options,(function(e){i.isString(e)?r.push(o(e)):r.push(e)})),e.options=r}catch(n){console.error("Creator.convertFieldsOptions",e.options,n)}else e.options&&!i.isFunction(e.options)&&!i.isArray(e.options)&&i.isObject(e.options)&&(i.each(e.options,(function(e,t){return r.push({label:e,value:t})})),e.options=r)}))},s;r.convertObject=a,function(e){e.Object="CustomObject",e.Field="CustomField",e.Action="CustomAction",e.Listview="CustomListview",e.Permission="CustomPermission",e.ValidationRule="CustomValidationRule",e.Application="CustomApplication",e.Tab="CustomTabs",e.Permissionset="CustomPermissionset",e.Profile="CustomProfile",e.Report="CustomReport",e.Workflow="Workflow",e.Layout="Layout",e.Client="Client",e.Server="Server",e.Function="Function",e.Router="Router",e.Trigger="Trigger"}(s=r.SteedosTranslationPrefixKeys||(r.SteedosTranslationPrefixKeys={}))},"objectTranslation.js":function e(t,r,e,n){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.addObjectsTranslation=r.getObjectTranslationTemplate=r.translationObjects=r.translationObject=r.translationObjectLabel=void 0;var i=t("underscore"),o=t("./"),a=t("../index"),s=t("./index"),u=t("../i18n/i18n"),c=t("lodash"),l=t("crypto"),f,d=(0,t("@steedos/cachers").getCacher)("lru.translations.objects");function h(e){var t;return l.createHash("md5").update(e).digest("hex")}var p=function(e,t){return"".concat(e,"_").concat(t.name,"_").concat(h(JSON.stringify(t)))},b=t("clone"),m=".",g="base",v="core",y="translation",w="object",_="field",x="listview",k="action",S=function(e,t){var r={lng:t,ns:y,keySeparator:!1};if((0,a.exists)(e,r))return(0,a._t)(e,r)},j=function(e){if(!e)return"";var t="core";return"default"!==e&&"meteor"!==e||(t="base"),t},A=function(e){switch(e){case"object":return o.SteedosTranslationPrefixKeys.Object;case"field":return o.SteedosTranslationPrefixKeys.Field;case"listview":return o.SteedosTranslationPrefixKeys.Listview;case"action":return o.SteedosTranslationPrefixKeys.Action;default:return"CustomLabels"}},D=function(e){var t;return[A(),e].join(".")},E=function(e){var t;return[A("object"),e,"label"].join(".")},O=function(e){var t;return[A("object"),e,"description"].join(".")},C=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"label"].join(".")},T=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"help"].join(".")},M=function(e,t){var r;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"description"].join(".")},B=function(e,t){var r=t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_"),n;return[A("field"),e,"group",r].join(".")},I=function(e,t,r){var n;return t&&(t=t.replace(/\./g,"_")),[A("field"),e,t,"options",r].join(".")},R=function(e,t){var r;return[A("action"),e,t].join(".")},N=function(e,t){var r;return[A("listview"),e,t].join(".")},F=function(e,t,r){var n,i=[E(t)],o=u.fallbackKeys.getObjectLabelKey(t);return o&&i.push(o),S(i,e)||r||""};r.translationObjectLabel=F;var L=function(e,t,r){var n=O(t);return S(n,e)||r||""},P=function(e,t,r,n,i,o){var a,s=[C(t,r)],c=u.fallbackKeys.getObjectFieldLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=P(e,f,r,n,i))}return l||n||""},q=function(e,t,r,n,i,o){var a,s=[T(t,r)],c=u.fallbackKeys.getObjectFieldInlineHelpTextLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=q(e,f,r,n,i))}return l||n||""},z=function(e,t,r,n,i,o){var a=M(t,r),s,u=S([a],e);if(1!=o&&!u){var c=j(i);c&&"base"!=t&&"core"!=t&&(u=z(e,c,r,n,i))}return u||n||""},U=function(e,t,r,n,i,o){var a,s=[B(t,r)],c=u.fallbackKeys.getObjectFieldGroupKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=U(e,f,r,n,i))}return l||n||""},$=function(e,t,r,n,i,o,a){var s,c=[I(t,r,n)],l=u.fallbackKeys.getObjectFieldOptionsLabelKey(t,r,n);l&&c.push(l);var f=S(c,e);if(1!=a&&!f){var d=j(o);d&&"base"!=t&&"core"!=t&&(f=$(e,d,r,n,i,o))}return f||i||""},H=function(e,t,r,n,i,o){var a,s=[R(t,r)],c=u.fallbackKeys.getObjectActionLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=H(e,f,r,n,i))}return l||n||""},W=function(e,t,r,n,i,o){var a,s=[N(t,r)],c=u.fallbackKeys.getObjectListviewLabelKey(t,r);c&&s.push(c);var l=S(s,e);if(1!=o&&!l){var f=j(i);f&&"base"!=t&&"core"!=t&&(l=W(e,f,r,n,i))}return l||n||""},Y=function(e,t,n,o,a){void 0===a&&(a=!1);var u=p(e,n),l=d.get(u);if(l)return Object.assign(n,(0,c.cloneDeep)(l));o&&(0,s.convertObject)(n),n.label=(0,r.translationObjectLabel)(e,t,n.label),n.description=L(e,t,n.description),i.each(n.fields,(function(r,o){if(r.label=P(e,t,o,r.label,n.datasource,a),r.inlineHelpText=q(e,t,o,r.inlineHelpText,n.datasource,a),r.description=z(e,t,o,r.description,n.datasource,a),r.group&&(r.group=U(e,t,r.group,r.group,n.datasource,a)),r.options){var s=[];i.each(r.options,(function(r){if(i.has(r,"value")){var u=$(e,t,o,r.value,r.label,n.datasource,a);s.push(i.extend({},r,{label:u}))}else s.push(r)})),r.options=s}})),i.each(n.actions,(function(r,i){r.label=H(e,t,i,r.label,n.datasource,a)})),i.each(n.list_views,(function(r,i){r.label=W(e,t,i,r.label,n.datasource,a)})),d.set(u,(0,c.cloneDeep)(n))};r.translationObject=Y;var V=function(e,t){i.each(t,(function(t,n){(0,r.translationObject)(e,n,t)}))};r.translationObjects=V;var K=function(e,t,n){var o=b(n);(0,s.convertObject)(o);var a={};return a[E(t)]=(0,r.translationObjectLabel)(e,t,o.label),a[O(t)]=L(e,t,o.description),i.each(o.fields,(function(r,n){a[C(t,n)]=P(e,t,n,r.label),r.inlineHelpText&&(a[T(t,n)]=q(e,t,n,r.inlineHelpText,o.datasource)),r.description&&(a[M(t,n)]=z(e,t,n,r.description,o.datasource)),r.group&&(a[B(t,r.group)]=U(e,t,r.group,r.group,o.datasource)),r.options&&i.each(r.options,(function(r){i.has(r,"value")&&(a[I(t,n,r.value)]=$(e,t,n,r.value,r.label))}))})),i.each(o.actions,(function(r,n){a[R(t,n)]=H(e,t,n,r.label)})),i.each(o.list_views,(function(r,n){a[N(t,n)]=W(e,t,n,r.label)})),a};function G(e,t){var r=b(e);(0,s.convertObject)(r);var n={},o=r.name;return o||console.error("Error: Invalid objectTranslation:"+t),n[E(o)]=r.label,n[O(o)]=r.description,i.each(r.fields,(function(e,t){n[C(o,t)]=e.label,e.help&&(n[T(o,t)]=e.help),e.description&&(n[M(o,t)]=e.description),e.options&&i.each(e.options,(function(e){i.has(e,"value")&&(n[I(o,t,e.value)]=e.label)}))})),i.each(r.groups,(function(e,t){n[B(o,t)]=e})),i.each(r.actions,(function(e,t){n[R(o,t)]=e.label})),i.each(r.listviews,(function(e,t){n[N(o,t)]=e.label})),i.each(r.CustomLabels,(function(e,t){n[D(t)]=e})),n}r.getObjectTranslationTemplate=K;var X=function(e){i.each(e,(function(e){var t=G(e.data,e.__filename);(0,a.addResourceBundle)(e.lng,y,t,!0,!0)}))};r.addObjectsTranslation=X},"translation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.addTranslations=r.convertTranslation=r.convertTranslationData=r.getAppTranslationTemplate=r.translationApps=r.translationMenus=r.translationApp=r.translationTabLabel=r.translationTabGroup=void 0;var n=t("../index"),i=t("underscore"),o=t("./"),a=t("../i18n/i18n.app"),s=t("clone"),u="translation",c=".",l="app",f="menu",d="tab",h=function(e){switch(e){case"app":return o.SteedosTranslationPrefixKeys.Application;case"tab":return o.SteedosTranslationPrefixKeys.Tab;default:return"CustomLabels"}},p=function(e){var t;return[h(),e].join(".")},b=function(e,t){var r={lng:t,ns:u,keySeparator:!1};if((0,n.exists)(e,r))return(0,n._t)(e,r)},m=function(e){var t;return[h("app"),e,"name"].join(".")},g=function(e){var t;return[h("app"),e,"description"].join(".")},v=function(e,t){var r,n;return[h("app"),e,"groups",t.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_")].join(".")},y=function(e){var t;return[h("menu"),"menu_".concat(e)].join(".")},w=function(e){var t;return[h("tab"),e].join(".")},_=function(e,t,r){var n,i=[m(t)],o=a.appFallbackKeys.getAppLabelKey(t);return o&&i.push(o),b(i,e)||r||""},x=function(e,t,r){var n,i=[g(t)],o=a.appFallbackKeys.getAppDescriptionKey(t);return o&&i.push(o),b(i,e)||r||""},k=function(e,t,r,n){var i,o=[v(t,r)],s=a.appFallbackKeys.getAppGroupKey(t,r);return s&&o.push(s),b(o,e)||n||""};r.translationTabGroup=k;var S=function(e,t,r){var n,i=[y(t)],o=a.appFallbackKeys.getMenuLabelKey(t);return o&&i.push(o),b(i,e)||r||""},j=function(e,t,r){var n,i=[w(t)],o=a.appFallbackKeys.getTabKey(t);return o&&i.push(o),b(i,e)||r||""};r.translationTabLabel=j;var A=function(e,t,n){n.label=_(e,t,n.label||n.name),n.description=x(e,t,n.description),i.each(n.tab_groups,(function(i,o){n.tab_groups[o].id=i.id||i.group_name,n.tab_groups[o].group_name=(0,r.translationTabGroup)(e,t,i.group_name,i.group_name)})),(0,r.translationMenus)(e,n.admin_menus)};r.translationApp=A;var D=function(e,t){i.each(t,(function(t){var r=S(e,t._id,t.label||t.name);t.label=r,t.name=r}))};r.translationMenus=D;var E=function(e,t){i.each(t,(function(t,n){(0,r.translationApp)(e,n,t)}))};r.translationApps=E;var O=function(e,t,r){var n=s(r),o={};return o[m(t)]=_(e,t,n.label||n.name),o[g(t)]=x(e,t,n.description),i.each(n.admin_menus,(function(t){o[y(t._id)]=S(e,t._id,t.label||t.name)})),o};r.getAppTranslationTemplate=O;var C=function(e,t,r){i.isArray(r)?i.each(r,(function(e){C(e,"",e)})):r&&i.each(i.keys(r),(function(n){var o=t?"".concat(t,".").concat(n):n,a=r[n];"object"==typeof a?i.isArray(a)?i.each(a,(function(e){C(e,o,a)})):C(e,o,a):e[o]=a}))};function T(e){for(var t in e)"object"==typeof e[t]&&C(e,t,e[t]);return e}r.convertTranslationData=T;var M=function(e){var t=s(e),r={};return i.each(t.CustomApplications,(function(e,t){r[m(t)]=e.name,r[g(t)]=e.description,i.each(e.groups,(function(e,n){r[v(t,n)]=e}))})),i.each(t.CustomTabs,(function(e,t){r[w(t)]=e})),i.each(t.CustomLabels,(function(e,t){var n;if("simpleschema"!=t&&i.isObject(e)){var o=T(((n={})[t]=e,n));i.each(o,(function(e,t){i.isObject(e)||(r[p(t)]=e)}))}else r[p(t)]=e})),r};r.convertTranslation=M;var B=function(e){i.each(e,(function(e){var t=(0,r.convertTranslation)(e.data);(0,n.addResourceBundle)(e.lng,u,t,!0,!0)}))};r.addTranslations=B},templates:{"objectTranslation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getObjectMetadataTranslationTemplate=void 0;var n=t("underscore"),i=t("../index"),o=t("clone");function a(e,t){var r={};return n.each(e,(function(e){r[e]="help"===e?t.inlineHelpText||"":t[e]||""})),r}function s(e){return a(["label","description"],e)}function u(e){switch(e.type){case"select":return a(["label","help","options","description"],e);default:return a(["label","help","description"],e)}}function c(e){return a(["label"],e)}function l(e){return a(["label"],e)}function f(e){var t={};return n.each(e,(function(e,r){t[r]=u(e)})),t}function d(e){var t={};return n.each(e,(function(e,r){t[r]=l(e)})),t}function h(e){var t={};return n.each(e,(function(e,r){t[r]=c(e)})),t}function p(e,t){var r={};return n.each(e,(function(e,n){if(e.group){var i=e.group.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");r[i]=t[n].group}})),r}var b=function(e,t,r,a){void 0===a&&(a=!1);var u=o(r);1!=a&&(0,i.translationObject)(e,t,u,!0,a);var c=Object.assign({},s(u));c=Object.assign({},c,{fields:f(u.fields)});var l=p(r.fields,u.fields);n.isEmpty(l)||(c=Object.assign({},c,{groups:l}));var b=h(u.list_views);n.isEmpty(b)||(c=Object.assign({},c,{listviews:b}));var m=d(u.actions);return n.isEmpty(m)||(c=Object.assign({},c,{actions:m})),Object.assign({name:t},c)};r.getObjectMetadataTranslationTemplate=b},"translation.js":function e(t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.getAppMetadataTranslationTemplate=void 0;var n=t("underscore"),i=t("../index"),o=t("clone");function a(e,t){var r={};return n.each(e,(function(e){r[e]=t[e]||""})),r}function s(e){var t={groups:{}};return e?(n.each(e,(function(e){var r=e.group_name.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t.groups[r]=e.group_name})),t):{}}var u=function(e){return Object.assign({},a(["name","description"],e),s(e.tab_groups))},c=function(e){var t={};return n.each(e,(function(e,r){t[r]=r})),t},l=function(e){var t={};return n.each(e,(function(e){var r=e.toLocaleLowerCase().replace(/\%/g,"_").replace(/\./g,"_").replace(/\ /g,"_");t[r]=e})),t},f=function(e,t,r){var n,a=o(r);(0,i.translationApp)(e,t,a);var s={},f;return a.tab_items?s=c(a.tab_items):a.tabs&&(s=l(a.tabs)),Object.assign({},{CustomApplications:(n={},n[t]=u(a),n)},{CustomTabs:s})};r.getAppMetadataTranslationTemplate=f}}}},node_modules:{i18next:{"package.json":function e(t,r,e){e.exports={name:"i18next",version:"19.9.2",main:"./dist/cjs/i18next.js",module:"./dist/esm/i18next.js"}},dist:{cjs:{"i18next.js":function e(t,r,e){"use strict";var n=t("@babel/runtime/helpers/typeof"),i=t("@babel/runtime/helpers/objectSpread"),o=t("@babel/runtime/helpers/classCallCheck"),a=t("@babel/runtime/helpers/createClass"),s=t("@babel/runtime/helpers/possibleConstructorReturn"),u=t("@babel/runtime/helpers/getPrototypeOf"),c=t("@babel/runtime/helpers/assertThisInitialized"),l=t("@babel/runtime/helpers/inherits");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=f(n),h=f(i),p=f(o),b=f(a),m=f(s),g=f(u),v=f(c),y=f(l),w={type:"logger",log:function e(t){this.output("log",t)},warn:function e(t){this.output("warn",t)},error:function e(t){this.output("error",t)},output:function e(t,r){console&&console[t]&&console[t].apply(console,r)}},_,x=new(function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};p.default(this,e),this.init(t,r)}return b.default(e,[{key:"init",value:function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.prefix=r.prefix||"i18next:",this.logger=t||w,this.options=r,this.debug=r.debug}},{key:"setDebug",value:function e(t){this.debug=t}},{key:"log",value:function e(){for(var t=arguments.length,r=new Array(t),n=0;n1?r-1:0),i=1;i-1?e.replace(/###/g,"."):e}function i(){return!e||"string"==typeof e}for(var o="string"!=typeof t?[].concat(t):t.split(".");o.length>1;){if(i())return{};var a=n(o.shift());!e[a]&&r&&(e[a]=new r),e=Object.prototype.hasOwnProperty.call(e,a)?e[a]:{}}return i()?{}:{obj:e,k:n(o.shift())}}function E(e,t,r){var n=D(e,t,Object),i,o;n.obj[n.k]=r}function O(e,t,r,n){var i=D(e,t,Object),o=i.obj,a=i.k;o[a]=o[a]||[],n&&(o[a]=o[a].concat(r)),n||o[a].push(r)}function C(e,t){var r=D(e,t),n=r.obj,i=r.k;if(n)return n[i]}function T(e,t,r){var n=C(e,r);return void 0!==n?n:C(t,r)}function M(e,t,r){for(var n in t)"__proto__"!==n&&"constructor"!==n&&(n in e?"string"==typeof e[n]||e[n]instanceof String||"string"==typeof t[n]||t[n]instanceof String?r&&(e[n]=t[n]):M(e[n],t[n],r):e[n]=t[n]);return e}function B(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var I={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function R(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,(function(e){return I[e]})):e}var N="undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,F=function(e){function t(e){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ns:["translation"],defaultNS:"translation"};return p.default(this,t),r=m.default(this,g.default(t).call(this)),N&&k.call(v.default(r)),r.data=e||{},r.options=n,void 0===r.options.keySeparator&&(r.options.keySeparator="."),r}return y.default(t,e),b.default(t,[{key:"addNamespaces",value:function e(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}},{key:"removeNamespaces",value:function e(t){var r=this.options.ns.indexOf(t);r>-1&&this.options.ns.splice(r,1)}},{key:"getResource",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=void 0!==i.keySeparator?i.keySeparator:this.options.keySeparator,a=[t,r];return n&&"string"!=typeof n&&(a=a.concat(n)),n&&"string"==typeof n&&(a=a.concat(o?n.split(o):n)),t.indexOf(".")>-1&&(a=t.split(".")),C(this.data,a)}},{key:"addResource",value:function e(t,r,n,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{silent:!1},a=this.options.keySeparator;void 0===a&&(a=".");var s=[t,r];n&&(s=s.concat(a?n.split(a):n)),t.indexOf(".")>-1&&(i=r,r=(s=t.split("."))[1]),this.addNamespaces(r),E(this.data,s,i),o.silent||this.emit("added",t,r,n,i)}},{key:"addResources",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{silent:!1};for(var o in n)"string"!=typeof n[o]&&"[object Array]"!==Object.prototype.toString.apply(n[o])||this.addResource(t,r,o,n[o],{silent:!0});i.silent||this.emit("added",t,r,n)}},{key:"addResourceBundle",value:function e(t,r,n,i,o){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{silent:!1},s=[t,r];t.indexOf(".")>-1&&(i=n,n=r,r=(s=t.split("."))[1]),this.addNamespaces(r);var u=C(this.data,s)||{};i?M(u,n,o):u=h.default({},u,n),E(this.data,s,u),a.silent||this.emit("added",t,r,n)}},{key:"removeResourceBundle",value:function e(t,r){this.hasResourceBundle(t,r)&&delete this.data[t][r],this.removeNamespaces(r),this.emit("removed",t,r)}},{key:"hasResourceBundle",value:function e(t,r){return void 0!==this.getResource(t,r)}},{key:"getResourceBundle",value:function e(t,r){return r||(r=this.options.defaultNS),"v1"===this.options.compatibilityAPI?h.default({},{},this.getResource(t,r)):this.getResource(t,r)}},{key:"getDataByLanguage",value:function e(t){return this.data[t]}},{key:"toJSON",value:function e(){return this.data}}]),t}(k),L={processors:{},addPostProcessor:function e(t){this.processors[t.name]=t},handle:function e(t,r,n,i,o){var a=this;return t.forEach((function(e){a.processors[e]&&(r=a.processors[e].process(r,n,i,o))})),r}},P={},q=function(e){function t(e){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return p.default(this,t),r=m.default(this,g.default(t).call(this)),N&&k.call(v.default(r)),A(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,v.default(r)),r.options=n,void 0===r.options.keySeparator&&(r.options.keySeparator="."),r.logger=x.create("translator"),r}return y.default(t,e),b.default(t,[{key:"changeLanguage",value:function e(t){t&&(this.language=t)}},{key:"exists",value:function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{interpolation:{}},n=this.resolve(t,r);return n&&void 0!==n.res}},{key:"extractFromKey",value:function e(t,r){var n=void 0!==r.nsSeparator?r.nsSeparator:this.options.nsSeparator;void 0===n&&(n=":");var i=void 0!==r.keySeparator?r.keySeparator:this.options.keySeparator,o=r.ns||this.options.defaultNS;if(n&&t.indexOf(n)>-1){var a=t.match(this.interpolator.nestingRegexp);if(a&&a.length>0)return{key:t,namespaces:o};var s=t.split(n);(n!==i||n===i&&this.options.ns.indexOf(s[0])>-1)&&(o=s.shift()),t=s.join(i)}return"string"==typeof o&&(o=[o]),{key:t,namespaces:o}}},{key:"translate",value:function e(r,n,i){var o=this;if("object"!==d.default(n)&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),n||(n={}),null==r)return"";Array.isArray(r)||(r=[String(r)]);var a=void 0!==n.keySeparator?n.keySeparator:this.options.keySeparator,s=this.extractFromKey(r[r.length-1],n),u=s.key,c=s.namespaces,l=c[c.length-1],f=n.lng||this.language,p=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f&&"cimode"===f.toLowerCase()){if(p){var b=n.nsSeparator||this.options.nsSeparator;return l+b+u}return u}var m=this.resolve(r,n),g=m&&m.res,v=m&&m.usedKey||u,y=m&&m.exactUsedKey||u,w=Object.prototype.toString.apply(g),_=["[object Number]","[object Function]","[object RegExp]"],x=void 0!==n.joinArrays?n.joinArrays:this.options.joinArrays,k=!this.i18nFormat||this.i18nFormat.handleAsObject,S="string"!=typeof g&&"boolean"!=typeof g&&"number"!=typeof g;if(k&&g&&S&&_.indexOf(w)<0&&("string"!=typeof x||"[object Array]"!==w)){if(!n.returnObjects&&!this.options.returnObjects)return this.logger.warn("accessing an object - but returnObjects options is not enabled!"),this.options.returnedObjectHandler?this.options.returnedObjectHandler(v,g,n):"key '".concat(u," (").concat(this.language,")' returned an object instead of string.");if(a){var j="[object Array]"===w,A=j?[]:{},D=j?y:v;for(var E in g)if(Object.prototype.hasOwnProperty.call(g,E)){var O="".concat(D).concat(a).concat(E);A[E]=this.translate(O,h.default({},n,{joinArrays:!1,ns:c})),A[E]===O&&(A[E]=g[E])}g=A}}else if(k&&"string"==typeof x&&"[object Array]"===w)(g=g.join(x))&&(g=this.extendTranslation(g,r,n,i));else{var C=!1,T=!1,M=void 0!==n.count&&"string"!=typeof n.count,B=t.hasDefaultValue(n),I=M?this.pluralResolver.getSuffix(f,n.count):"",R=n["defaultValue".concat(I)]||n.defaultValue;!this.isValidLookup(g)&&B&&(C=!0,g=R),this.isValidLookup(g)||(T=!0,g=u);var N=B&&R!==g&&this.options.updateMissing;if(T||C||N){if(this.logger.log(N?"updateKey":"missingKey",f,l,u,N?R:g),a){var F=this.resolve(u,h.default({},n,{keySeparator:!1}));F&&F.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var L=[],P=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if("fallback"===this.options.saveMissingTo&&P&&P[0])for(var q=0;q1&&void 0!==arguments[1]?arguments[1]:{},i,o,a,s,u;return"string"==typeof t&&(t=[t]),t.forEach((function(e){if(!r.isValidLookup(i)){var t=r.extractFromKey(e,n),c=t.key;o=c;var l=t.namespaces;r.options.fallbackNS&&(l=l.concat(r.options.fallbackNS));var f=void 0!==n.count&&"string"!=typeof n.count,d=void 0!==n.context&&"string"==typeof n.context&&""!==n.context,h=n.lngs?n.lngs:r.languageUtils.toResolveHierarchy(n.lng||r.language,n.fallbackLng);l.forEach((function(e){r.isValidLookup(i)||(u=e,!P["".concat(h[0],"-").concat(e)]&&r.utils&&r.utils.hasLoadedNamespace&&!r.utils.hasLoadedNamespace(u)&&(P["".concat(h[0],"-").concat(e)]=!0,r.logger.warn('key "'.concat(o,'" for languages "').concat(h.join(", "),'" won\'t get resolved as namespace "').concat(u,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),h.forEach((function(t){if(!r.isValidLookup(i)){s=t;var o=c,u=[o],l,h;if(r.i18nFormat&&r.i18nFormat.addLookupKeys)r.i18nFormat.addLookupKeys(u,c,t,e,n);else f&&(l=r.pluralResolver.getSuffix(t,n.count)),f&&d&&u.push(o+l),d&&u.push(o+="".concat(r.options.contextSeparator).concat(n.context)),f&&u.push(o+=l);for(;h=u.pop();)r.isValidLookup(i)||(a=h,i=r.getResource(t,e,h,n))}})))}))}})),{res:i,usedKey:o,exactUsedKey:a,usedLng:s,usedNS:u}}},{key:"isValidLookup",value:function e(t){return!(void 0===t||!this.options.returnNull&&null===t||!this.options.returnEmptyString&&""===t)}},{key:"getResource",value:function e(t,r,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,r,n,i):this.resourceStore.getResource(t,r,n,i)}}],[{key:"hasDefaultValue",value:function e(t){var r="defaultValue";for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&r===n.substring(0,r.length)&&void 0!==t[n])return!0;return!1}}]),t}(k);function z(e){return e.charAt(0).toUpperCase()+e.slice(1)}var U=function(){function e(t){p.default(this,e),this.options=t,this.whitelist=this.options.supportedLngs||!1,this.supportedLngs=this.options.supportedLngs||!1,this.logger=x.create("languageUtils")}return b.default(e,[{key:"getScriptPartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return null;var r=t.split("-");return 2===r.length?null:(r.pop(),"x"===r[r.length-1].toLowerCase()?null:this.formatLanguageCode(r.join("-")))}},{key:"getLanguagePartFromCode",value:function e(t){if(!t||t.indexOf("-")<0)return t;var r=t.split("-");return this.formatLanguageCode(r[0])}},{key:"formatLanguageCode",value:function e(t){if("string"==typeof t&&t.indexOf("-")>-1){var r=["hans","hant","latn","cyrl","cans","mong","arab"],n=t.split("-");return this.options.lowerCaseLng?n=n.map((function(e){return e.toLowerCase()})):2===n.length?(n[0]=n[0].toLowerCase(),n[1]=n[1].toUpperCase(),r.indexOf(n[1].toLowerCase())>-1&&(n[1]=z(n[1].toLowerCase()))):3===n.length&&(n[0]=n[0].toLowerCase(),2===n[1].length&&(n[1]=n[1].toUpperCase()),"sgn"!==n[0]&&2===n[2].length&&(n[2]=n[2].toUpperCase()),r.indexOf(n[1].toLowerCase())>-1&&(n[1]=z(n[1].toLowerCase())),r.indexOf(n[2].toLowerCase())>-1&&(n[2]=z(n[2].toLowerCase()))),n.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}},{key:"isWhitelisted",value:function e(t){return this.logger.deprecate("languageUtils.isWhitelisted",'function "isWhitelisted" will be renamed to "isSupportedCode" in the next major - please make sure to rename it\'s usage asap.'),this.isSupportedCode(t)}},{key:"isSupportedCode",value:function e(t){return("languageOnly"===this.options.load||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}},{key:"getBestMatchFromCodes",value:function e(t){var r=this,n;return t?(t.forEach((function(e){if(!n){var t=r.formatLanguageCode(e);r.options.supportedLngs&&!r.isSupportedCode(t)||(n=t)}})),!n&&this.options.supportedLngs&&t.forEach((function(e){if(!n){var t=r.getLanguagePartFromCode(e);if(r.isSupportedCode(t))return n=t;n=r.options.supportedLngs.find((function(e){if(0===e.indexOf(t))return e}))}})),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n):null}},{key:"getFallbackCodes",value:function e(t,r){if(!t)return[];if("function"==typeof t&&(t=t(r)),"string"==typeof t&&(t=[t]),"[object Array]"===Object.prototype.toString.apply(t))return t;if(!r)return t.default||[];var n=t[r];return n||(n=t[this.getScriptPartFromCode(r)]),n||(n=t[this.formatLanguageCode(r)]),n||(n=t[this.getLanguagePartFromCode(r)]),n||(n=t.default),n||[]}},{key:"toResolveHierarchy",value:function e(t,r){var n=this,i=this.getFallbackCodes(r||this.options.fallbackLng||[],t),o=[],a=function e(t){t&&(n.isSupportedCode(t)?o.push(t):n.logger.warn("rejecting language code not found in supportedLngs: ".concat(t)))};return"string"==typeof t&&t.indexOf("-")>-1?("languageOnly"!==this.options.load&&a(this.formatLanguageCode(t)),"languageOnly"!==this.options.load&&"currentOnly"!==this.options.load&&a(this.getScriptPartFromCode(t)),"currentOnly"!==this.options.load&&a(this.getLanguagePartFromCode(t))):"string"==typeof t&&a(this.formatLanguageCode(t)),i.forEach((function(e){o.indexOf(e)<0&&a(n.formatLanguageCode(e))})),o}}]),e}(),$=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","kk","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],H={1:function e(t){return Number(t>1)},2:function e(t){return Number(1!=t)},3:function e(t){return 0},4:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function e(t){return Number(0==t?0:1==t?1:2==t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function e(t){return Number(1==t?0:t>=2&&t<=4?1:2)},7:function e(t){return Number(1==t?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function e(t){return Number(1==t?0:2==t?1:8!=t&&11!=t?2:3)},9:function e(t){return Number(t>=2)},10:function e(t){return Number(1==t?0:2==t?1:t<7?2:t<11?3:4)},11:function e(t){return Number(1==t||11==t?0:2==t||12==t?1:t>2&&t<20?2:3)},12:function e(t){return Number(t%10!=1||t%100==11)},13:function e(t){return Number(0!==t)},14:function e(t){return Number(1==t?0:2==t?1:3==t?2:3)},15:function e(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function e(t){return Number(t%10==1&&t%100!=11?0:0!==t?1:2)},17:function e(t){return Number(1==t||t%10==1&&t%100!=11?0:1)},18:function e(t){return Number(0==t?0:1==t?1:2)},19:function e(t){return Number(1==t?0:0==t||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function e(t){return Number(1==t?0:0==t||t%100>0&&t%100<20?1:2)},21:function e(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function e(t){return Number(1==t?0:2==t?1:(t<0||t>10)&&t%10==0?2:3)}};function W(){var e={};return $.forEach((function(t){t.lngs.forEach((function(r){e[r]={numbers:t.nr,plurals:H[t.fc]}}))})),e}var Y=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};p.default(this,e),this.languageUtils=t,this.options=r,this.logger=x.create("pluralResolver"),this.rules=W()}return b.default(e,[{key:"addRule",value:function e(t,r){this.rules[t]=r}},{key:"getRule",value:function e(t){return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}},{key:"needsPlural",value:function e(t){var r=this.getRule(t);return r&&r.numbers.length>1}},{key:"getPluralFormsOfKey",value:function e(t,r){return this.getSuffixes(t).map((function(e){return r+e}))}},{key:"getSuffixes",value:function e(t){var r=this,n=this.getRule(t);return n?n.numbers.map((function(e){return r.getSuffix(t,e)})):[]}},{key:"getSuffix",value:function e(t,r){var n=this,i=this.getRule(t);if(i){var o=i.noAbs?i.plurals(r):i.plurals(Math.abs(r)),a=i.numbers[o];this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]&&(2===a?a="plural":1===a&&(a=""));var s=function e(){return n.options.prepend&&a.toString()?n.options.prepend+a.toString():a.toString()};return"v1"===this.options.compatibilityJSON?1===a?"":"number"==typeof a?"_plural_".concat(a.toString()):s():"v2"===this.options.compatibilityJSON?s():this.options.simplifyPluralSuffix&&2===i.numbers.length&&1===i.numbers[0]?s():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}return this.logger.warn("no plural rule found for: ".concat(t)),""}}]),e}(),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};p.default(this,e),this.logger=x.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(e){return e},this.init(t)}return b.default(e,[{key:"init",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});var r=t.interpolation;this.escape=void 0!==r.escape?r.escape:R,this.escapeValue=void 0===r.escapeValue||r.escapeValue,this.useRawValueToEscape=void 0!==r.useRawValueToEscape&&r.useRawValueToEscape,this.prefix=r.prefix?B(r.prefix):r.prefixEscaped||"{{",this.suffix=r.suffix?B(r.suffix):r.suffixEscaped||"}}",this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||",",this.unescapePrefix=r.unescapeSuffix?"":r.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":r.unescapeSuffix||"",this.nestingPrefix=r.nestingPrefix?B(r.nestingPrefix):r.nestingPrefixEscaped||B("$t("),this.nestingSuffix=r.nestingSuffix?B(r.nestingSuffix):r.nestingSuffixEscaped||B(")"),this.nestingOptionsSeparator=r.nestingOptionsSeparator?r.nestingOptionsSeparator:r.nestingOptionsSeparator||",",this.maxReplaces=r.maxReplaces?r.maxReplaces:1e3,this.alwaysFormat=void 0!==r.alwaysFormat&&r.alwaysFormat,this.resetRegExp()}},{key:"reset",value:function e(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function e(){var t="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(t,"g");var r="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(r,"g");var n="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(n,"g")}},{key:"interpolate",value:function e(t,r,n,i){var o=this,a,s,u,c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function l(e){return e.replace(/\$/g,"$$$$")}var f=function e(t){if(t.indexOf(o.formatSeparator)<0){var a=T(r,c,t);return o.alwaysFormat?o.format(a,void 0,n):a}var s=t.split(o.formatSeparator),u=s.shift().trim(),l=s.join(o.formatSeparator).trim();return o.format(T(r,c,u),l,n,i)};this.resetRegExp();var d=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,h=i&&i.interpolation&&i.interpolation.skipOnVariables||this.options.interpolation.skipOnVariables,p;return[{regex:this.regexpUnescape,safeValue:function e(t){return l(t)}},{regex:this.regexp,safeValue:function e(t){return o.escapeValue?l(o.escape(t)):l(t)}}].forEach((function(e){for(u=0;a=e.regex.exec(t);){if(void 0===(s=f(a[1].trim())))if("function"==typeof d){var r=d(t,a,i);s="string"==typeof r?r:""}else{if(h){s=a[0];continue}o.logger.warn("missed to pass in variable ".concat(a[1]," for interpolating ").concat(t)),s=""}else"string"==typeof s||o.useRawValueToEscape||(s=j(s));if(t=t.replace(a[0],e.safeValue(s)),e.regex.lastIndex=0,++u>=o.maxReplaces)break}})),t}},{key:"nest",value:function e(t,r){var n=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o,a,s=h.default({},i);function u(e,t){var r=this.nestingOptionsSeparator;if(e.indexOf(r)<0)return e;var n=e.split(new RegExp("".concat(r,"[ ]*{"))),i="{".concat(n[1]);e=n[0],i=(i=this.interpolate(i,s)).replace(/'/g,'"');try{s=JSON.parse(i),t&&(s=h.default({},t,s))}catch(o){return this.logger.warn("failed parsing options string in nesting for key ".concat(e),o),"".concat(e).concat(r).concat(i)}return delete s.defaultValue,e}for(s.applyPostProcessor=!1,delete s.defaultValue;o=this.nestingRegexp.exec(t);){var c=[],l=!1;if(o[0].includes(this.formatSeparator)&&!/{.*}/.test(o[1])){var f=o[1].split(this.formatSeparator).map((function(e){return e.trim()}));o[1]=f.shift(),c=f,l=!0}if((a=r(u.call(this,o[1].trim(),s),s))&&o[0]===t&&"string"!=typeof a)return a;"string"!=typeof a&&(a=j(a)),a||(this.logger.warn("missed to resolve ".concat(o[1]," for nesting ").concat(t)),a=""),l&&(a=c.reduce((function(e,t){return n.format(e,t,i.lng,i)}),a.trim())),t=t.replace(o[0],a),this.regexp.lastIndex=0}return t}}]),e}();function K(e,t){for(var r=e.indexOf(t);-1!==r;)e.splice(r,1),r=e.indexOf(t)}var G=function(e){function t(e,r,n){var i,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return p.default(this,t),i=m.default(this,g.default(t).call(this)),N&&k.call(v.default(i)),i.backend=e,i.store=r,i.services=n,i.languageUtils=n.languageUtils,i.options=o,i.logger=x.create("backendConnector"),i.state={},i.queue=[],i.backend&&i.backend.init&&i.backend.init(n,o.backend,o),i}return y.default(t,e),b.default(t,[{key:"queueLoad",value:function e(t,r,n,i){var o=this,a=[],s=[],u=[],c=[];return t.forEach((function(e){var t=!0;r.forEach((function(r){var i="".concat(e,"|").concat(r);!n.reload&&o.store.hasResourceBundle(e,r)?o.state[i]=2:o.state[i]<0||(1===o.state[i]?s.indexOf(i)<0&&s.push(i):(o.state[i]=1,t=!1,s.indexOf(i)<0&&s.push(i),a.indexOf(i)<0&&a.push(i),c.indexOf(r)<0&&c.push(r)))})),t||u.push(e)})),(a.length||s.length)&&this.queue.push({pending:s,loaded:{},errors:[],callback:i}),{toLoad:a,pending:s,toLoadLanguages:u,toLoadNamespaces:c}}},{key:"loaded",value:function e(t,r,n){var i=t.split("|"),o=i[0],a=i[1];r&&this.emit("failedLoading",o,a,r),n&&this.store.addResourceBundle(o,a,n),this.state[t]=r?-1:2;var e={};this.queue.forEach((function(n){O(n.loaded,[o],a),K(n.pending,t),r&&n.errors.push(r),0!==n.pending.length||n.done||(Object.keys(n.loaded).forEach((function(t){e[t]||(e[t]=[]),n.loaded[t].length&&n.loaded[t].forEach((function(r){e[t].indexOf(r)<0&&e[t].push(r)}))})),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())})),this.emit("loaded",e),this.queue=this.queue.filter((function(e){return!e.done}))}},{key:"read",value:function e(t,r,n){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:350,s=arguments.length>5?arguments[5]:void 0;return t.length?this.backend[n](t,r,(function(e,u){e&&u&&o<5?setTimeout((function(){i.read.call(i,t,r,n,o+1,2*a,s)}),a):s(e,u)})):s(null,{})}},{key:"prepareLoading",value:function e(t,r){var n=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),o&&o();"string"==typeof t&&(t=this.languageUtils.toResolveHierarchy(t)),"string"==typeof r&&(r=[r]);var a=this.queueLoad(t,r,i,o);if(!a.toLoad.length)return a.pending.length||o(),null;a.toLoad.forEach((function(e){n.loadOne(e)}))}},{key:"load",value:function e(t,r,n){this.prepareLoading(t,r,{},n)}},{key:"reload",value:function e(t,r,n){this.prepareLoading(t,r,{reload:!0},n)}},{key:"loadOne",value:function e(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=t.split("|"),o=i[0],a=i[1];this.read(o,a,"read",void 0,void 0,(function(e,i){e&&r.logger.warn("".concat(n,"loading namespace ").concat(a," for language ").concat(o," failed"),e),!e&&i&&r.logger.log("".concat(n,"loaded namespace ").concat(a," for language ").concat(o),i),r.loaded(t,e,i)}))}},{key:"saveMissing",value:function e(t,r,n,i,o){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(r)?this.logger.warn('did not save key "'.concat(n,'" as the namespace "').concat(r,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!"):null!=n&&""!==n&&(this.backend&&this.backend.create&&this.backend.create(t,r,n,i,null,h.default({},a,{isUpdate:o})),t&&t[0]&&this.store.addResource(t[0],r,n,i))}}]),t}(k);function X(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,whitelist:!1,nonExplicitWhitelist:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function e(t){var r={};if("object"===d.default(t[1])&&(r=t[1]),"string"==typeof t[1]&&(r.defaultValue=t[1]),"string"==typeof t[2]&&(r.tDescription=t[2]),"object"===d.default(t[2])||"object"===d.default(t[3])){var n=t[3]||t[2];Object.keys(n).forEach((function(e){r[e]=n[e]}))}return r},interpolation:{escapeValue:!0,format:function e(t,r,n,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!1}}}function Z(e){return"string"==typeof e.ns&&(e.ns=[e.ns]),"string"==typeof e.fallbackLng&&(e.fallbackLng=[e.fallbackLng]),"string"==typeof e.fallbackNS&&(e.fallbackNS=[e.fallbackNS]),e.whitelist&&(e.whitelist&&e.whitelist.indexOf("cimode")<0&&(e.whitelist=e.whitelist.concat(["cimode"])),e.supportedLngs=e.whitelist),e.nonExplicitWhitelist&&(e.nonExplicitSupportedLngs=e.nonExplicitWhitelist),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function J(){}var Q,ee=new(function(e){function t(){var e,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(p.default(this,t),e=m.default(this,g.default(t).call(this)),N&&k.call(v.default(e)),e.options=Z(r),e.services={},e.logger=x,e.modules={external:[]},n&&!e.isInitialized&&!r.isClone){if(!e.options.initImmediate)return e.init(r,n),m.default(e,v.default(e));setTimeout((function(){e.init(r,n)}),0)}return e}return y.default(t,e),b.default(t,[{key:"init",value:function e(){var t=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;function i(e){return e?"function"==typeof e?new e:e:null}if("function"==typeof r&&(n=r,r={}),r.whitelist&&!r.supportedLngs&&this.logger.deprecate("whitelist",'option "whitelist" will be renamed to "supportedLngs" in the next major - please make sure to rename this option asap.'),r.nonExplicitWhitelist&&!r.nonExplicitSupportedLngs&&this.logger.deprecate("whitelist",'options "nonExplicitWhitelist" will be renamed to "nonExplicitSupportedLngs" in the next major - please make sure to rename this option asap.'),this.options=h.default({},X(),this.options,Z(r)),this.format=this.options.interpolation.format,n||(n=J),!this.options.isClone){this.modules.logger?x.init(i(this.modules.logger),this.options):x.init(null,this.options);var o=new U(this.options);this.store=new F(this.options.resources,this.options);var a=this.services;a.logger=x,a.resourceStore=this.store,a.languageUtils=o,a.pluralResolver=new Y(o,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),a.interpolator=new V(this.options),a.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},a.backendConnector=new G(i(this.modules.backend),a.resourceStore,a,this.options),a.backendConnector.on("*",(function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i1?r-1:0),i=1;i0&&"dev"!==s[0]&&(this.options.lng=s[0])}this.services.languageDetector||this.options.lng||this.logger.warn("init: no languageDetector is used and no lng is defined");var u=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];u.forEach((function(e){t[e]=function(){var r;return(r=t.store)[e].apply(r,arguments)}}));var c=["addResource","addResources","addResourceBundle","removeResourceBundle"];c.forEach((function(e){t[e]=function(){var r;return(r=t.store)[e].apply(r,arguments),t}}));var l=S(),f=function e(){var r=function e(r,i){t.isInitialized&&t.logger.warn("init: i18next is already initialized. You should call init just once!"),t.isInitialized=!0,t.options.isClone||t.logger.log("initialized",t.options),t.emit("initialized",t.options),l.resolve(i),n(r,i)};if(t.languages&&"v1"!==t.options.compatibilityAPI&&!t.isInitialized)return r(null,t.t.bind(t));t.changeLanguage(t.options.lng,r)};return this.options.resources||!this.options.initImmediate?f():setTimeout(f,0),l}},{key:"loadResources",value:function e(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,i=n,o="string"==typeof t?t:this.language;if("function"==typeof t&&(i=t),!this.options.resources||this.options.partialBundledLanguages){if(o&&"cimode"===o.toLowerCase())return i();var a=[],s=function e(t){var n;t&&r.services.languageUtils.toResolveHierarchy(t).forEach((function(e){a.indexOf(e)<0&&a.push(e)}))};if(o)s(o);else{var u=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);u.forEach((function(e){return s(e)}))}this.options.preload&&this.options.preload.forEach((function(e){return s(e)})),this.services.backendConnector.load(a,this.options.ns,i)}else i(null)}},{key:"reloadResources",value:function e(t,r,n){var i=S();return t||(t=this.languages),r||(r=this.options.ns),n||(n=J),this.services.backendConnector.reload(t,r,(function(e){i.resolve(),n(e)})),i}},{key:"use",value:function e(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return"backend"===t.type&&(this.modules.backend=t),("logger"===t.type||t.log&&t.warn&&t.error)&&(this.modules.logger=t),"languageDetector"===t.type&&(this.modules.languageDetector=t),"i18nFormat"===t.type&&(this.modules.i18nFormat=t),"postProcessor"===t.type&&L.addPostProcessor(t),"3rdParty"===t.type&&this.modules.external.push(t),this}},{key:"changeLanguage",value:function e(t,r){var n=this;this.isLanguageChangingTo=t;var i=S();this.emit("languageChanging",t);var o=function e(t,o){o?(n.language=o,n.languages=n.services.languageUtils.toResolveHierarchy(o),n.translator.changeLanguage(o),n.isLanguageChangingTo=void 0,n.emit("languageChanged",o),n.logger.log("languageChanged",o)):n.isLanguageChangingTo=void 0,i.resolve((function(){return n.t.apply(n,arguments)})),r&&r(t,(function(){return n.t.apply(n,arguments)}))},a=function e(t){var r="string"==typeof t?t:n.services.languageUtils.getBestMatchFromCodes(t);r&&(n.language||(n.language=r,n.languages=n.services.languageUtils.toResolveHierarchy(r)),n.translator.language||n.translator.changeLanguage(r),n.services.languageDetector&&n.services.languageDetector.cacheUserLanguage(r)),n.loadResources(r,(function(e){o(e,r)}))};return t||!this.services.languageDetector||this.services.languageDetector.async?!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(a):a(t):a(this.services.languageDetector.detect()),i}},{key:"getFixedT",value:function e(t,r){var n=this,i=function e(t,r){var i;if("object"!==d.default(r)){for(var o=arguments.length,a=new Array(o>2?o-2:0),s=2;s1&&void 0!==arguments[1]?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var i=this.languages[0],o=!!this.options&&this.options.fallbackLng,a=this.languages[this.languages.length-1];if("cimode"===i.toLowerCase())return!0;var s=function e(t,n){var i=r.services.backendConnector.state["".concat(t,"|").concat(n)];return-1===i||2===i};if(n.precheck){var u=n.precheck(this,s);if(void 0!==u)return u}return!!this.hasResourceBundle(i,t)||(!this.services.backendConnector.backend||!(!s(i,t)||o&&!s(a,t)))}},{key:"loadNamespaces",value:function e(t,r){var n=this,i=S();return this.options.ns?("string"==typeof t&&(t=[t]),t.forEach((function(e){n.options.ns.indexOf(e)<0&&n.options.ns.push(e)})),this.loadResources((function(e){i.resolve(),r&&r(e)})),i):(r&&r(),Promise.resolve())}},{key:"loadLanguages",value:function e(t,r){var n=S();"string"==typeof t&&(t=[t]);var i=this.options.preload||[],o=t.filter((function(e){return i.indexOf(e)<0}));return o.length?(this.options.preload=i.concat(o),this.loadResources((function(e){n.resolve(),r&&r(e)})),n):(r&&r(),Promise.resolve())}},{key:"dir",value:function e(t){return t||(t=this.languages&&this.languages.length>0?this.languages[0]:this.language),t?["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam"].indexOf(this.services.languageUtils.getLanguagePartFromCode(t))>=0?"rtl":"ltr":"rtl";var r}},{key:"createInstance",value:function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new t(r,n)}},{key:"cloneInstance",value:function e(){var r=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,o=h.default({},this.options,n,{isClone:!0}),a=new t(o),s=["store","services","language"];return s.forEach((function(e){a[e]=r[e]})),a.services=h.default({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new q(a.services,a.options),a.translator.on("*",(function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n=0&&r<=y}}function Z(e){return function(t){return null==t?void 0:t[e]}}var J=Z("byteLength"),Q=X(J),ee=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function te(e){return p?p(e)&&!U(e):Q(e)&&ee.test(s.call(e))}var re=c?te:G(!1),ne=Z("length");function ie(e){for(var t={},r=e.length,n=0;n":">",'"':""","'":"'","`":"`"},st=ot(at),ut,ct=ot(Ce(at)),lt=ce.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},ft=/(.)^/,dt={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},ht=/\\|'|\r|\n|\u2028|\u2029/g;function pt(e){return"\\"+dt[e]}var bt=/^\s*(\w|\$)+\s*$/;function mt(e,t,r){!t&&r&&(t=r),t=Re({},t,ce.templateSettings);var n=RegExp([(t.escape||ft).source,(t.interpolate||ft).source,(t.evaluate||ft).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(n,(function(t,r,n,a,s){return o+=e.slice(i,s).replace(ht,pt),i=s+t.length,r?o+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?o+="'+\n((__t=("+n+"))==null?'':__t)+\n'":a&&(o+="';\n"+a+"\n__p+='"),t})),o+="';\n";var a=t.variable,s;if(a){if(!bt.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{s=new Function(a,"_",o)}catch(c){throw c.source=o,c}var u=function(e){return s.call(this,e,ce)};return u.source="function("+a+"){\n"+o+"}",u}function gt(e,t,r){var n=(t=Ue(t)).length;if(!n)return N(r)?r.call(e):r;for(var i=0;i1)jt(s,t-1,r,n),i=n.length;else for(var u=0,c=s.length;ut?(n&&(clearTimeout(n),n=null),s=c,a=e.apply(i,o),n||(i=o=null)):n||!1===r.trailing||(n=setTimeout(u,l)),a};return c.cancel=function(){clearTimeout(n),s=0,n=i=o=null},c}function Tt(e,t,r){var n,i,o,a,s,u=function(){var c=it()-i;t>c?n=setTimeout(u,t-c):(n=null,r||(a=e.apply(s,o)),n||(o=s=null))},c=w((function(c){return s=this,o=c,i=it(),n||(n=setTimeout(u,t),r&&(a=e.apply(s,o))),a}));return c.cancel=function(){clearTimeout(n),n=o=s=null},c}function Mt(e,t){return xt(t,e)}function Bt(e){return function(){return!e.apply(this,arguments)}}function It(){var e=arguments,t=e.length-1;return function(){for(var r=t,n=e[t].apply(this,arguments);r--;)n=e[r].call(this,n);return n}}function Rt(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function Nt(e,t){var r;return function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=null),r}}var Ft=xt(Nt,2);function Lt(e,t,r){t=Je(t,r);for(var n=ae(e),i,o=0,a=n.length;o0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+u,s):u=o>=0?Math.min(o+1,u):o+u+1;else if(r&&o&&u)return n[o=r(n,i)]===i?o:-1;if(i!=i)return(o=t(a.call(n,s,u),K))>=0?o+s:-1;for(o=e>0?s:u-1;o>=0&&o0?0:a-1;for(i||(n=t[o?o[s]:s],s+=e);s>=0&&s=3;return t(e,Ge(r,i,4),n,o)}}var Zt=Xt(1),Jt=Xt(-1);function Qt(e,t,r){var n=[];return t=Je(t,r),Kt(e,(function(e,r,i){t(e,r,i)&&n.push(e)})),n}function er(e,t,r){return Qt(e,Bt(Je(t)),r)}function tr(e,t,r){t=Je(t,r);for(var n=!St(e)&&ae(e),i=(n||e).length,o=0;o=0}var ir=w((function(e,t,r){var n,i;return N(t)?i=t:(t=Ue(t),n=t.slice(0,-1),t=t[t.length-1]),Gt(e,(function(e){var o=i;if(!o){if(n&&n.length&&(e=$e(e,n)),null==e)return;o=e[t]}return null==o?o:o.apply(e,r)}))}));function or(e,t){return Gt(e,Ke(t))}function ar(e,t){return Qt(e,Ve(t))}function sr(e,t,r){var n=-1/0,i=-1/0,o,a;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,u=(e=St(e)?e:Ee(e)).length;sn&&(n=o);else t=Je(t,r),Kt(e,(function(e,r,o){((a=t(e,r,o))>i||a===-1/0&&n===-1/0)&&(n=e,i=a)}));return n}function ur(e,t,r){var n=1/0,i=1/0,o,a;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,u=(e=St(e)?e:Ee(e)).length;sn||void 0===r)return 1;if(r1&&(n=Ge(n,t[1])),t=be(e)):(n=wr,t=jt(t,!1,!1),e=Object(e));for(var i=0,o=t.length;i1&&(n=t[1])):(t=Gt(jt(t,!1,!1),String),r=function(e,r){return!nr(t,r)}),_r(e,r,n)}));function kr(e,t,r){return a.call(e,0,Math.max(0,e.length-(null==t||r?1:t)))}function Sr(e,t,r){return null==e||e.length<1?null==t||r?void 0:[]:null==t||r?e[0]:kr(e,e.length-t)}function jr(e,t,r){return a.call(e,null==t||r?1:t)}function Ar(e,t,r){return null==e||e.length<1?null==t||r?void 0:[]:null==t||r?e[e.length-1]:jr(e,Math.max(0,e.length-t))}function Dr(e){return Qt(e,Boolean)}function Er(e,t){return jt(e,t,!1)}var Or=w((function(e,t){return t=jt(t,!0,!0),Qt(e,(function(e){return!nr(t,e)}))})),Cr=w((function(e,t){return Or(e,t)}));function Tr(e,t,r,n){S(t)||(n=r,r=t,t=!1),null!=r&&(r=Je(r,n));for(var i=[],o=[],a=0,s=ne(e);ae(t),this)}}onabort(){}addEventListener(e,t){"abort"===e&&this._listeners.push(t)}removeEventListener(e,t){"abort"===e&&(this._listeners=this._listeners.filter(e=>e!==t))}},c=new Set,l=(e,t)=>{const r=`LRU_CACHE_OPTION_${e}`;p(r)&&b(r,`${e} option`,`options.${t}`,w)},f=(e,t)=>{const r=`LRU_CACHE_METHOD_${e}`;if(p(r)){const{prototype:n}=w,{get:i}=Object.getOwnPropertyDescriptor(n,e);b(r,`${e} method`,`cache.${t}()`,i)}},d=(e,t)=>{const r=`LRU_CACHE_PROPERTY_${e}`;if(p(r)){const{prototype:n}=w,{get:i}=Object.getOwnPropertyDescriptor(n,e);b(r,`${e} property`,`cache.${t}`,i)}},h=(...e)=>{"object"==typeof process&&process&&"function"==typeof process.emitWarning?process.emitWarning(...e):console.error(...e)},p=e=>!c.has(e),b=(e,t,r,n)=>{c.add(e);const i=`The ${t} is deprecated. Please use ${r} instead.`;h(i,"DeprecationWarning",e,n)},m=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),g=e=>m(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?v:null:null;class v extends Array{constructor(e){super(e),this.fill(0)}}class y{constructor(e){if(0===e)return[];const t=g(e);this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}}class w{constructor(e={}){const{max:t=0,ttl:r,ttlResolution:n=1,ttlAutopurge:i,updateAgeOnGet:o,updateAgeOnHas:a,allowStale:s,dispose:u,disposeAfter:f,noDisposeOnSet:d,noUpdateTTL:b,maxSize:v=0,maxEntrySize:_=0,sizeCalculation:x,fetchMethod:k,fetchContext:S,noDeleteOnFetchRejection:j,noDeleteOnStaleGet:A}=e,{length:D,maxAge:E,stale:O}=e instanceof w?{}:e;if(0!==t&&!m(t))throw new TypeError("max option must be a nonnegative integer");const C=t?g(t):Array;if(!C)throw new Error("invalid max value: "+t);if(this.max=t,this.maxSize=v,this.maxEntrySize=_||this.maxSize,this.sizeCalculation=x||D,this.sizeCalculation){if(!this.maxSize&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if("function"!=typeof this.sizeCalculation)throw new TypeError("sizeCalculation set to non-function")}if(this.fetchMethod=k||null,this.fetchMethod&&"function"!=typeof this.fetchMethod)throw new TypeError("fetchMethod must be a function if specified");if(this.fetchContext=S,!this.fetchMethod&&void 0!==S)throw new TypeError("cannot set fetchContext without fetchMethod");if(this.keyMap=new Map,this.keyList=new Array(t).fill(null),this.valList=new Array(t).fill(null),this.next=new C(t),this.prev=new C(t),this.head=0,this.tail=0,this.free=new y(t),this.initialFill=1,this.size=0,"function"==typeof u&&(this.dispose=u),"function"==typeof f?(this.disposeAfter=f,this.disposed=[]):(this.disposeAfter=null,this.disposed=null),this.noDisposeOnSet=!!d,this.noUpdateTTL=!!b,this.noDeleteOnFetchRejection=!!j,0!==this.maxEntrySize){if(0!==this.maxSize&&!m(this.maxSize))throw new TypeError("maxSize must be a positive integer if specified");if(!m(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.initializeSizeTracking()}if(this.allowStale=!!s||!!O,this.noDeleteOnStaleGet=!!A,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!a,this.ttlResolution=m(n)||0===n?n:1,this.ttlAutopurge=!!i,this.ttl=r||E||0,this.ttl){if(!m(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.initializeTTLTracking()}if(0===this.max&&0===this.ttl&&0===this.maxSize)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.max&&!this.maxSize){const e="LRU_CACHE_UNBOUNDED";if(p(e)){c.add(e);const t="TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.";h(t,"UnboundedCacheWarning",e,w)}}O&&l("stale","allowStale"),E&&l("maxAge","ttl"),D&&l("length","sizeCalculation")}getRemainingTTL(e){return this.has(e,{updateAgeOnHas:!1})?1/0:0}initializeTTLTracking(){this.ttls=new v(this.max),this.starts=new v(this.max),this.setItemTTL=(e,t,r=n.now())=>{if(this.starts[e]=0!==t?r:0,this.ttls[e]=t,0!==t&&this.ttlAutopurge){const r=setTimeout(()=>{this.isStale(e)&&this.delete(this.keyList[e])},t+1);r.unref&&r.unref()}},this.updateItemAge=e=>{this.starts[e]=0!==this.ttls[e]?n.now():0};let e=0;const t=()=>{const t=n.now();if(this.ttlResolution>0){e=t;const r=setTimeout(()=>e=0,this.ttlResolution);r.unref&&r.unref()}return t};this.getRemainingTTL=r=>{const n=this.keyMap.get(r);return void 0===n?0:0===this.ttls[n]||0===this.starts[n]?1/0:this.starts[n]+this.ttls[n]-(e||t())},this.isStale=r=>0!==this.ttls[r]&&0!==this.starts[r]&&(e||t())-this.starts[r]>this.ttls[r]}updateItemAge(e){}setItemTTL(e,t,r){}isStale(e){return!1}initializeSizeTracking(){this.calculatedSize=0,this.sizes=new v(this.max),this.removeItemSize=e=>{this.calculatedSize-=this.sizes[e],this.sizes[e]=0},this.requireSize=(e,t,r,n)=>{if(this.isBackgroundFetch(t))return 0;if(!m(r)){if(!n)throw new TypeError("invalid size value (must be positive integer)");if("function"!=typeof n)throw new TypeError("sizeCalculation must be a function");if(r=n(t,e),!m(r))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}return r},this.addItemSize=(e,t)=>{if(this.sizes[e]=t,this.maxSize){const t=this.maxSize-this.sizes[e];for(;this.calculatedSize>t;)this.evict(!0)}this.calculatedSize+=this.sizes[e]}}removeItemSize(e){}addItemSize(e,t){}requireSize(e,t,r,n){if(r||n)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache")}*indexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.tail;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.head);)t=this.prev[t]}*rindexes({allowStale:e=this.allowStale}={}){if(this.size)for(let t=this.head;this.isValidIndex(t)&&(!e&&this.isStale(t)||(yield t),t!==this.tail);)t=this.next[t]}isValidIndex(e){return this.keyMap.get(this.keyList[e])===e}*entries(){for(const e of this.indexes())yield[this.keyList[e],this.valList[e]]}*rentries(){for(const e of this.rindexes())yield[this.keyList[e],this.valList[e]]}*keys(){for(const e of this.indexes())yield this.keyList[e]}*rkeys(){for(const e of this.rindexes())yield this.keyList[e]}*values(){for(const e of this.indexes())yield this.valList[e]}*rvalues(){for(const e of this.rindexes())yield this.valList[e]}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const r of this.indexes())if(e(this.valList[r],this.keyList[r],this))return this.get(this.keyList[r],t)}forEach(e,t=this){for(const r of this.indexes())e.call(t,this.valList[r],this.keyList[r],this)}rforEach(e,t=this){for(const r of this.rindexes())e.call(t,this.valList[r],this.keyList[r],this)}get prune(){return f("prune","purgeStale"),this.purgeStale}purgeStale(){let e=!1;for(const t of this.rindexes({allowStale:!0}))this.isStale(t)&&(this.delete(this.keyList[t]),e=!0);return e}dump(){const e=[];for(const t of this.indexes({allowStale:!0})){const r=this.keyList[t],i=this.valList[t],o=this.isBackgroundFetch(i)?i.__staleWhileFetching:i,a={value:o};if(this.ttls){a.ttl=this.ttls[t];const e=n.now()-this.starts[t];a.start=Math.floor(Date.now()-e)}this.sizes&&(a.size=this.sizes[t]),e.unshift([r,a])}return e}load(e){this.clear();for(const[t,r]of e){if(r.start){const e=Date.now()-r.start;r.start=n.now()-e}this.set(t,r.value,r)}}dispose(e,t,r){}set(e,t,{ttl:r=this.ttl,start:n,noDisposeOnSet:i=this.noDisposeOnSet,size:o=0,sizeCalculation:a=this.sizeCalculation,noUpdateTTL:s=this.noUpdateTTL}={}){if(o=this.requireSize(e,t,o,a),this.maxEntrySize&&o>this.maxEntrySize)return this.delete(e),this;let u=0===this.size?void 0:this.keyMap.get(e);if(void 0===u)u=this.newIndex(),this.keyList[u]=e,this.valList[u]=t,this.keyMap.set(e,u),this.next[this.tail]=u,this.prev[u]=this.tail,this.tail=u,this.size++,this.addItemSize(u,o),s=!1;else{const r=this.valList[u];t!==r&&(this.isBackgroundFetch(r)?r.__abortController.abort():i||(this.dispose(r,e,"set"),this.disposeAfter&&this.disposed.push([r,e,"set"])),this.removeItemSize(u),this.valList[u]=t,this.addItemSize(u,o)),this.moveToTail(u)}if(0===r||0!==this.ttl||this.ttls||this.initializeTTLTracking(),s||this.setItemTTL(u,r,n),this.disposeAfter)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return this}newIndex(){return 0===this.size?this.tail:this.size===this.max&&0!==this.max?this.evict(!1):0!==this.free.length?this.free.pop():this.initialFill++}pop(){if(this.size){const e=this.valList[this.head];return this.evict(!0),e}}evict(e){const t=this.head,r=this.keyList[t],n=this.valList[t];return this.isBackgroundFetch(n)?n.__abortController.abort():(this.dispose(n,r,"evict"),this.disposeAfter&&this.disposed.push([n,r,"evict"])),this.removeItemSize(t),e&&(this.keyList[t]=null,this.valList[t]=null,this.free.push(t)),this.head=this.next[t],this.keyMap.delete(r),this.size--,t}has(e,{updateAgeOnHas:t=this.updateAgeOnHas}={}){const r=this.keyMap.get(e);return void 0!==r&&!this.isStale(r)&&(t&&this.updateItemAge(r),!0)}peek(e,{allowStale:t=this.allowStale}={}){const r=this.keyMap.get(e);if(void 0!==r&&(t||!this.isStale(r))){const e=this.valList[r];return this.isBackgroundFetch(e)?e.__staleWhileFetching:e}}backgroundFetch(e,t,r,n){const i=void 0===t?void 0:this.valList[t];if(this.isBackgroundFetch(i))return i;const a=new o,s={signal:a.signal,options:r,context:n},u=t=>(a.signal.aborted||this.set(e,t,s.options),t),c=n=>{if(this.valList[t]===f){const n=!r.noDeleteOnFetchRejection||void 0===f.__staleWhileFetching;n?this.delete(e):this.valList[t]=f.__staleWhileFetching}if(f.__returned===f)throw n},l=t=>t(this.fetchMethod(e,i,s)),f=new Promise(l).then(u,c);return f.__abortController=a,f.__staleWhileFetching=i,f.__returned=null,void 0===t?(this.set(e,f,s.options),t=this.keyMap.get(e)):this.valList[t]=f,f}isBackgroundFetch(e){return e&&"object"==typeof e&&"function"==typeof e.then&&Object.prototype.hasOwnProperty.call(e,"__staleWhileFetching")&&Object.prototype.hasOwnProperty.call(e,"__returned")&&(e.__returned===e||null===e.__returned)}async fetch(e,{allowStale:t=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:i=this.ttl,noDisposeOnSet:o=this.noDisposeOnSet,size:a=0,sizeCalculation:s=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,fetchContext:l=this.fetchContext,forceRefresh:f=!1}={}){if(!this.fetchMethod)return this.get(e,{allowStale:t,updateAgeOnGet:r,noDeleteOnStaleGet:n});const d={allowStale:t,updateAgeOnGet:r,noDeleteOnStaleGet:n,ttl:i,noDisposeOnSet:o,size:a,sizeCalculation:s,noUpdateTTL:u,noDeleteOnFetchRejection:c};let h=this.keyMap.get(e);if(void 0===h){const t=this.backgroundFetch(e,h,d,l);return t.__returned=t}{const n=this.valList[h];if(this.isBackgroundFetch(n))return t&&void 0!==n.__staleWhileFetching?n.__staleWhileFetching:n.__returned=n;if(!f&&!this.isStale(h))return this.moveToTail(h),r&&this.updateItemAge(h),n;const i=this.backgroundFetch(e,h,d,l);return t&&void 0!==i.__staleWhileFetching?i.__staleWhileFetching:i.__returned=i}}get(e,{allowStale:t=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet}={}){const i=this.keyMap.get(e);if(void 0!==i){const o=this.valList[i],a=this.isBackgroundFetch(o);if(this.isStale(i))return a?t?o.__staleWhileFetching:void 0:(n||this.delete(e),t?o:void 0);if(a)return;return this.moveToTail(i),r&&this.updateItemAge(i),o}}connect(e,t){this.prev[t]=e,this.next[e]=t}moveToTail(e){e!==this.tail&&(e===this.head?this.head=this.next[e]:this.connect(this.prev[e],this.next[e]),this.connect(this.tail,e),this.tail=e)}get del(){return f("del","delete"),this.delete}delete(e){let t=!1;if(0!==this.size){const r=this.keyMap.get(e);if(void 0!==r)if(t=!0,1===this.size)this.clear();else{this.removeItemSize(r);const t=this.valList[r];this.isBackgroundFetch(t)?t.__abortController.abort():(this.dispose(t,e,"delete"),this.disposeAfter&&this.disposed.push([t,e,"delete"])),this.keyMap.delete(e),this.keyList[r]=null,this.valList[r]=null,r===this.tail?this.tail=this.prev[r]:r===this.head?this.head=this.next[r]:(this.next[this.prev[r]]=this.next[r],this.prev[this.next[r]]=this.prev[r]),this.size--,this.free.push(r)}}if(this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift());return t}clear(){for(const e of this.rindexes({allowStale:!0})){const t=this.valList[e];if(this.isBackgroundFetch(t))t.__abortController.abort();else{const r=this.keyList[e];this.dispose(t,r,"delete"),this.disposeAfter&&this.disposed.push([t,r,"delete"])}}if(this.keyMap.clear(),this.valList.fill(null),this.keyList.fill(null),this.ttls&&(this.ttls.fill(0),this.starts.fill(0)),this.sizes&&this.sizes.fill(0),this.head=0,this.tail=0,this.initialFill=1,this.free.length=0,this.calculatedSize=0,this.size=0,this.disposed)for(;this.disposed.length;)this.disposeAfter(...this.disposed.shift())}get reset(){return f("reset","clear"),this.clear}get length(){return d("length","size"),this.size}static get AbortController(){return o}static get AbortSignal(){return u}}e.exports=w}}}},"form-builder":{"package.json":function e(t,r,e){e.exports={name:"@steedos/form-builder",version:"3.6.2-patch.5",private:!1,publishConfig:{access:"public"},main:"dist/form-builder.min.js",homepage:"https://formbuilder.online/",repository:{url:"https://github.com/kevinchappell/formBuilder.git",type:"git"},files:["dist/**/*","docs/**/*","src/**/*"],author:"Kevin Chappell ",contributors:[],bugs:"https://github.com/kevinchappell/formBuilder/issues",description:"A jQuery plugin for drag and drop form building",keywords:["jquery-plugin","forms","drag and drop","form builder","form create"],license:"MIT",ignore:["**/*","node_modules","test"],config:{files:{test:["test/**/*.spec.js"],pluginsDir:"src/js/control_plugins/",fonts:"src/fonts",sass:"src/sass",formBuilder:{js:"src/js/form-builder.js",sass:["src/sass/form-builder.scss"]},formRender:{js:"src/js/form-render.js",sass:["src/sass/form-render.scss"]},site:["demo/assets/sass/site.scss"]},fontServer:"http://fontello.com",fontelloToken:"09d648f01d6c57cb9f9b8cc55043e0c0"},babel:{presets:[["@babel/preset-env",{targets:{browsers:["> 1%"]},loose:!0}]],comments:!1,plugins:["@babel/plugin-proposal-object-rest-spread","@babel/plugin-proposal-class-properties"]},scripts:{"build:analyze":"webpack --mode production -p --progress --config tools/webpack.config --analyze","build:plugins":"webpack --mode production -p --display-entrypoints --progress --config tools/webpack.plugins.config","build:vendor":"babel-node tools/build-vendor",build:"webpack --mode production -p --progress --config tools/webpack.config","build:all":"npm-run-all build:plugins build:vendor build copy",copy:"cp -a dist/* demo/assets/js/ && cp CONTRIBUTING.md docs/contributing.md && cp LICENSE docs/license.md && npm run copy:lang","copy:lang":"babel-node tools/copy-language-files","deploy:all":"npm-run-all deploy:demo deploy:site","deploy:demo":"node tools/deploy-demo.js","deploy:site":"node tools/deploy-site.js",docs:"mkdocs build",font:"babel-node tools/icon-font",lint:"eslint ./src --ext .js || true","semantic-release":"semantic-release","start:devServer":"webpack-dev-server --mode development --config tools/webpack.config",prestart:"npm-run-all -p build:vendor copy:lang",start:"npm run start:devServer",test:"npm run-script build"},dependencies:{jquery:">=3.4.1","jquery-ui-sortable":"*"},devDependencies:{"@babel/cli":"^7.10.5","@babel/core":"^7.11.4","@babel/node":"^7.10.5","@babel/plugin-proposal-class-properties":"^7.10.4","@babel/plugin-proposal-object-rest-spread":"^7.11.0","@babel/plugin-syntax-object-rest-spread":"^7.8.3","@babel/plugin-transform-destructuring":"^7.10.4","@babel/preset-env":"^7.11.0","@semantic-release/changelog":"^5.0.1","@semantic-release/git":"^9.0.0","@semantic-release/npm":"^7.0.5",autoprefixer:"^9.8.6","babel-eslint":"^10.1.0","babel-loader":"^8.1.0","clean-webpack-plugin":"^3.0.0",clui:"^0.3.6","compression-webpack-plugin":"^5.0.1","concat-files":"^0.1.1","cross-env":"^7.0.2","css-loader":"^4.2.1",eslint:"^7.7.0","eslint-loader":"^4.0.2","formbuilder-languages":"latest","fs-extra":"^9.0.1","html-webpack-harddisk-plugin":"^1.0.2","html-webpack-plugin":"^4.3.0",inquirer:"^7.3.3",mi18n:"^0.4.8","node-sass":"6.0.1","npm-run-all":"^4.1.5",opener:"^1.5.1","postcss-loader":"^3.0.0","replace-in-file":"^6.1.0",request:"^2.88.2","sass-loader":"10.5.2","semantic-release":"^17.1.1",semver:"^7.3.2","style-loader":"^1.2.1",unzipper:"^0.10.11",webpack:"^4.44.1","webpack-bundle-analyzer":"^3.8.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0","wrapper-webpack-plugin":"^2.1.0"},prettier:{singleQuote:!0,trailingComma:"all",printWidth:120,semi:!1,arrowParens:"avoid",spaceAfterFunction:!1},engines:{},release:{branch:"master",verifyConditions:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"],prepare:["@semantic-release/changelog","@semantic-release/npm","@semantic-release/git"]},browserslist:["> 1%"]}},dist:{"form-builder.min.js":function e(t,r){ /*! * jQuery formBuilder: https://formbuilder.online/ * Version: 3.6.2-patch.5 @@ -268,7 +268,7 @@ Package._define("mobile-experience"); !function(){var a=Package["ddp-client"].DDP;Package._define("ddp",{DDP:a})}(); -Package._define("ddp-server"); +!function(){var e,a,d;Package._define("ddp-server")}(); !function(){var e=Package.meteor.Meteor,t=Package.meteor.global,r=Package.meteor.meteorEnv,n=Package.minimongo.LocalCollection,o=Package.minimongo.Minimongo,i=Package.check.check,a=Package.check.Match,c=Package.ejson.EJSON,s=Package["ddp-client"].DDP,l=Package.modules.meteorInstall,d=Package.modules.meteorBabelHelpers,f=Package.promise.Promise,u,h;l({node_modules:{meteor:{"allow-deny":{"allow-deny.js":function t(){var r=Object.prototype.hasOwnProperty,o=(u={CollectionPrototype:{}}).CollectionPrototype;o.allow=function(e){h(this,"allow",e)},o.deny=function(e){h(this,"deny",e)},o._defineMutationMethods=function(t){var n=this;if(t=t||{},n._restricted=!1,n._insecure=void 0,n._validators={insert:{allow:[],deny:[]},update:{allow:[],deny:[]},remove:{allow:[],deny:[]},upsert:{allow:[],deny:[]},fetch:[],fetchAllFields:!1},n._name&&(n._prefix="/"+n._name+"/",n._connection&&(n._connection===e.server||e.isClient))){var o={};["insert","update","remove"].forEach((function(c){var s=n._prefix+c;if(t.useExisting){var l=e.isClient?"_methodHandlers":"method_handlers";if(n._connection[l]&&"function"==typeof n._connection[l][s])return}o[s]=function(){i(arguments,[a.Any]);var t=Array.from(arguments);try{var o=null;if("insert"!==c||r.call(t[0],"_id")||(o=n._makeNewID()),this.isSimulation)return null!==o&&(t[0]._id=o),n._collection[c].apply(n._collection,t);if("insert"!==c&&_(t[0],c),n._restricted){if(0===n._validators[c].allow.length)throw new e.Error(403,"Access denied. No allow validators set on restricted collection for method '"+c+"'.");var s="_validated"+c.charAt(0).toUpperCase()+c.slice(1);return t.unshift(this.userId),"insert"===c&&t.push(o),n[s].apply(n,t)}if(n._isInsecure())return null!==o&&(t[0]._id=o),n._collection[c].apply(n._collection,t);throw new e.Error(403,"Access denied")}catch(l){throw"MongoError"===l.name||"MinimongoError"===l.name?new e.Error(409,l.toString()):l}}})),n._connection.methods(o)}},o._updateFetch=function(e){var t=this;if(!this._validators.fetchAllFields)if(e){var r=Object.create(null),n=function(e){return e&&e.forEach((function(e){return r[e]=1}))};n(this._validators.fetch),n(e),this._validators.fetch=Object.keys(r)}else this._validators.fetchAllFields=!0,this._validators.fetch=null},o._isInsecure=function(){var e=this;return void 0===this._insecure?!!Package.insecure:this._insecure},o._validatedInsert=function(t,r,n){var o=this;if(this._validators.insert.deny.some((function(e){return e(t,f(e,r,n))})))throw new e.Error(403,"Access denied");if(this._validators.insert.allow.every((function(e){return!e(t,f(e,r,n))})))throw new e.Error(403,"Access denied");null!==n&&(r._id=n),this._collection.insert.call(this._collection,r)},o._validatedUpdate=function(t,o,a,c){var s=this;if(i(a,Object),c=Object.assign(Object.create(null),c),!n._selectorIsIdPerhapsAsObject(o))throw new Error("validated update should be of a single ID");if(c.upsert)throw new e.Error(403,"Access denied. Upserts not allowed in a restricted collection.");var f="Access denied. In a restricted collection you can only update documents, not replace them. Use a Mongo update operator, such as '$set'.",u=Object.keys(a),h={};if(0===u.length)throw new e.Error(403,f);u.forEach((function(t){var n=a[t];if("$"!==t.charAt(0))throw new e.Error(403,f);if(!r.call(l,t))throw new e.Error(403,"Access denied. Operator "+t+" not allowed in a restricted collection.");Object.keys(n).forEach((function(e){-1!==e.indexOf(".")&&(e=e.substring(0,e.indexOf("."))),h[e]=!0}))}));var _=Object.keys(h),v={transform:null};this._validators.fetchAllFields||(v.fields={},this._validators.fetch.forEach((function(e){v.fields[e]=1})));var m=this._collection.findOne(o,v);if(!m)return 0;if(this._validators.update.deny.some((function(e){var r=d(e,m);return e(t,r,_,a)})))throw new e.Error(403,"Access denied");if(this._validators.update.allow.every((function(e){var r=d(e,m);return!e(t,r,_,a)})))throw new e.Error(403,"Access denied");return c._forbidReplace=!0,this._collection.update.call(this._collection,o,a,c)};var l={$inc:1,$set:1,$unset:1,$addToSet:1,$pop:1,$pullAll:1,$pull:1,$pushAll:1,$push:1,$bit:1};function d(e,t){return e.transform?e.transform(t):t}function f(e,t,r){var n=t;return e.transform&&(n=c.clone(t),null!==r&&(n._id=r),n=e.transform(n)),n}function h(e,t,o){var i=/^(?:insert|update|remove|fetch|transform)$/;if(Object.keys(o).forEach((function(e){if(!i.test(e))throw new Error(t+": Invalid key: "+e)})),e._restricted=!0,["insert","update","remove"].forEach((function(i){if(r.call(o,i)){if(!(o[i]instanceof Function))throw new Error(t+": Value for `"+i+"` must be a function");void 0===o.transform?o[i].transform=e._transform:o[i].transform=n.wrapTransform(o.transform),e._validators[i][t].push(o[i])}})),o.update||o.remove||o.fetch){if(o.fetch&&!(o.fetch instanceof Array))throw new Error(t+": Value for `fetch` must be an array");e._updateFetch(o.fetch)}}function _(t,r){if(!n._selectorIsIdPerhapsAsObject(t))throw new e.Error(403,"Not permitted. Untrusted code may only "+r+" documents by ID.")}function v(){var e,t=(s._CurrentMethodInvocation||s._CurrentInvocation).get();return t&&t.isSimulation}o._validatedRemove=function(t,r){var n=this,o={transform:null};this._validators.fetchAllFields||(o.fields={},this._validators.fetch.forEach((function(e){o.fields[e]=1})));var i=this._collection.findOne(r,o);if(!i)return 0;if(this._validators.remove.deny.some((function(e){return e(t,d(e,i))})))throw new e.Error(403,"Access denied");if(this._validators.remove.allow.every((function(e){return!e(t,d(e,i))})))throw new e.Error(403,"Access denied");return this._collection.remove.call(this._collection,r)},o._callMutatorMethod=function(){function t(t,r,n){var o;!e.isClient||n||v()||(n=function(r){r&&e._debug(t+" failed: "+(r.reason||r.stack))}),("update"===t||"remove"===t)&&!v()&&_(r[0],t);var i=this._prefix+t;return this._connection.apply(i,r,{returnStubValue:!0},n)}return t}()}}}}},{extensions:[".js",".json"]})("/node_modules/meteor/allow-deny/allow-deny.js"),Package._define("allow-deny",{AllowDeny:u})}(); diff --git a/server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json b/server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json similarity index 99% rename from server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json rename to server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json index 8c5d55b9fa..554bfa5ec8 100644 --- a/server/bundle/programs/web.cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json +++ b/server/bundle/programs/web.cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json @@ -3,8 +3,8 @@ "name": "standard-minifier-js", "version": "2.6.0" }, - "totalMinifiedBytes": 4482939, - "totalMinifiedGzipBytes": 1144346, + "totalMinifiedBytes": 4482964, + "totalMinifiedGzipBytes": 1144347, "minifiedBytesByPackage": { "packages/meteor.js": 9639, "packages/coffeescript.js": 32, @@ -1317,7 +1317,7 @@ } ], "packages/ddp.js": 78, - "packages/ddp-server.js": 30, + "packages/ddp-server.js": 55, "packages/allow-deny.js": [ 6029, { diff --git a/server/bundle/programs/web.cordova/program.json b/server/bundle/programs/web.cordova/program.json index 81f1349874..24ae4eeb5a 100644 --- a/server/bundle/programs/web.cordova/program.json +++ b/server/bundle/programs/web.cordova/program.json @@ -2,24 +2,24 @@ "format": "web-program-pre1", "manifest": [ { - "path": "562208cdca3e6c297f81857edf4a42d67cc7b014.js", + "path": "717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js", "where": "client", "type": "js", "cacheable": true, - "url": "/__cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.js?meteor_js_resource=true", - "size": 4482939, - "hash": "562208cdca3e6c297f81857edf4a42d67cc7b014", - "sri": "siGUoqXR2aXnth1Dk0AjCefngPU/9OYxKzTi7YQ4ilQg39nLjtSXbFANAXLXTJlHS2pXRmo79zm1ZElKWfW4KA==" + "url": "/__cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js?meteor_js_resource=true", + "size": 4482964, + "hash": "717fd9820c5c4cf898af8b1c4a65e09c854f6d33", + "sri": "umWnr/cf2bXXD8RxsTQ8J7UvfCTN0M5R0cUUb7MEMwVlmW6IxafLb8XC1yIkZZrB/VrmhQ2aiQfyX0sorJZSMQ==" }, { - "path": "562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json", + "path": "717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json", "where": "client", "type": "json", "cacheable": true, - "url": "/__cordova/562208cdca3e6c297f81857edf4a42d67cc7b014.stats.json?meteor_js_resource=true", + "url": "/__cordova/717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json?meteor_js_resource=true", "size": 82586, - "hash": "0f44998ebad4725dcb8ba71e25a03bc2bb1c877e", - "sri": "L/9Fn9V9FI0HKRTgKHvgub2YGRQC/uzKBlqHA6h60E1sqWvn7yMbKcZYy0pPzdbN1XRDluzzofDmWs8Ps5M5aQ==" + "hash": "dfc2e03a04605fe54471304f74bb304df52ec5c8", + "sri": "F50KddjLHeuM7uZ9OhrdEYHxB4FSMIb7bv26qmLWvvt5zuWBk/5BOepZu4f0bVmgeq5ETSrxRn2z0u0yAtK2vA==" }, { "path": "106b9e345091b56401f90f1c9096385cd0758cb4.css", diff --git a/server/bundle/star.json b/server/bundle/star.json index d656a54d88..665464447a 100644 --- a/server/bundle/star.json +++ b/server/bundle/star.json @@ -36,5 +36,5 @@ "meteorRelease": "METEOR@1.9.3", "nodeVersion": "12.16.1", "npmVersion": "6.13.4", - "gitCommitHash": "846f5bcd7ec32fba16adbc1f43fd4a39df37bd5b" + "gitCommitHash": "dfc5b93993de2cdc4f25fc17cd29ba7f8947c069" } \ No newline at end of file From 957145ac948fb1c17342669b1451edf987f03952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=A9=E6=9E=97?= Date: Fri, 19 Jul 2024 10:58:16 +0800 Subject: [PATCH 2/6] =?UTF-8?q?[Bug]:=20sockjs/info=20=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E4=B8=ADAccess-Control-Allow-Origin=E4=B8=BA*=EF=BC=8C?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=AE=89=E5=85=A8=E9=9A=90=E6=82=A3=20#6964?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- creator/packages/ddp-server/stream_server.js | 26 ++++++++++--------- .../programs/server/packages/ddp-server.js | 6 +++-- .../server/packages/ddp-server.js.map | 2 +- server/bundle/star.json | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/creator/packages/ddp-server/stream_server.js b/creator/packages/ddp-server/stream_server.js index 1996d9088c..85a9997e56 100644 --- a/creator/packages/ddp-server/stream_server.js +++ b/creator/packages/ddp-server/stream_server.js @@ -15,7 +15,7 @@ var websocketExtensions = _.once(function () { var extensions = []; var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION - ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {}; + ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {}; if (websocketCompressionConfig) { extensions.push(Npm.require('permessage-deflate').configure( websocketCompressionConfig @@ -25,7 +25,7 @@ var websocketExtensions = _.once(function () { return extensions; }); -var pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; +var pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; StreamServer = function () { var self = this; @@ -41,7 +41,7 @@ StreamServer = function () { var sockjs = Npm.require('sockjs'); var serverOptions = { prefix: self.prefix, - log: function() {}, + log: function () { }, // this is the default, but we code it explicitly because we depend // on it in stream_client:HEARTBEAT_TIMEOUT heartbeat_delay: 45000, @@ -55,7 +55,9 @@ StreamServer = function () { // Set the USE_JSESSIONID environment variable to enable setting the // JSESSIONID cookie. This is useful for setting up proxies with // session affinity. - jsessionid: !!process.env.USE_JSESSIONID + jsessionid: !!process.env.USE_JSESSIONID, + // 禁用cors,防止请求response返回Access-Control-Allow-Origin:* + disable_cors: true }; // If you know your server environment (eg, proxies) will prevent websockets @@ -98,8 +100,8 @@ StreamServer = function () { // livedata_server.js. socket.setWebsocketTimeout = function (timeout) { if ((socket.protocol === 'websocket' || - socket.protocol === 'websocket-raw') - && socket._session.recv) { + socket.protocol === 'websocket-raw') + && socket._session.recv) { socket._session.recv.connection.setTimeout(timeout); } }; @@ -118,7 +120,7 @@ StreamServer = function () { // concerned about people upgrading from a pre-0.7.0 release. Also, // remove the clause in the client that ignores the welcome message // (livedata_connection.js) - socket.send(JSON.stringify({server_id: "0"})); + socket.send(JSON.stringify({ server_id: "0" })); // call all our callbacks when we get a new socket. they will do the // work of setting up handlers and such for specific messages. @@ -148,21 +150,21 @@ _.extend(StreamServer.prototype, { // Redirect /websocket to /sockjs/websocket in order to not expose // sockjs to clients that want to use raw websockets - _redirectWebsocketEndpoint: function() { + _redirectWebsocketEndpoint: function () { var self = this; // Unfortunately we can't use a connect middleware here since // sockjs installs itself prior to all existing listeners // (meaning prior to any connect middlewares) so we need to take // an approach similar to overshadowListeners in // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee - _.each(['request', 'upgrade'], function(event) { + _.each(['request', 'upgrade'], function (event) { var httpServer = WebApp.httpServer; var oldHttpServerListeners = httpServer.listeners(event).slice(0); httpServer.removeAllListeners(event); // request and upgrade have different arguments passed but // we only care about the first one which is always request - var newListener = function(request /*, moreArguments */) { + var newListener = function (request /*, moreArguments */) { // Store arguments for use within the closure below var args = arguments; @@ -170,11 +172,11 @@ _.extend(StreamServer.prototype, { // preserving query string. var parsedUrl = url.parse(request.url); if (parsedUrl.pathname === pathPrefix + '/websocket' || - parsedUrl.pathname === pathPrefix + '/websocket/') { + parsedUrl.pathname === pathPrefix + '/websocket/') { parsedUrl.pathname = self.prefix + '/websocket'; request.url = url.format(parsedUrl); } - _.each(oldHttpServerListeners, function(oldListener) { + _.each(oldHttpServerListeners, function (oldListener) { oldListener.apply(httpServer, args); }); }; diff --git a/server/bundle/programs/server/packages/ddp-server.js b/server/bundle/programs/server/packages/ddp-server.js index 4cd5085e6d..440878eebe 100644 --- a/server/bundle/programs/server/packages/ddp-server.js +++ b/server/bundle/programs/server/packages/ddp-server.js @@ -87,7 +87,9 @@ StreamServer = function () { // Set the USE_JSESSIONID environment variable to enable setting the // JSESSIONID cookie. This is useful for setting up proxies with // session affinity. - jsessionid: !!process.env.USE_JSESSIONID + jsessionid: !!process.env.USE_JSESSIONID, + // 禁用cors,防止请求response返回Access-Control-Allow-Origin:* + disable_cors: true }; // If you know your server environment (eg, proxies) will prevent websockets // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie, // browsers) will not waste time attempting to use them. @@ -2245,4 +2247,4 @@ Package._define("ddp-server", { })(); //# sourceURL=meteor://💻app/packages/ddp-server.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJqc2Vzc2lvbmlkIiwiVVNFX0pTRVNTSU9OSUQiLCJESVNBQkxFX1dFQlNPQ0tFVFMiLCJ3ZWJzb2NrZXQiLCJmYXllX3NlcnZlcl9vcHRpb25zIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiV2ViQXBwIiwiaHR0cFNlcnZlciIsInJlbW92ZUxpc3RlbmVyIiwiX3RpbWVvdXRBZGp1c3RtZW50UmVxdWVzdENhbGxiYWNrIiwiaW5zdGFsbEhhbmRsZXJzIiwiYWRkTGlzdGVuZXIiLCJfcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCIsIm9uIiwic29ja2V0Iiwic2V0V2Vic29ja2V0VGltZW91dCIsInRpbWVvdXQiLCJwcm90b2NvbCIsIl9zZXNzaW9uIiwicmVjdiIsImNvbm5lY3Rpb24iLCJzZXRUaW1lb3V0Iiwic2VuZCIsImRhdGEiLCJ3cml0ZSIsIndpdGhvdXQiLCJzdHJpbmdpZnkiLCJzZXJ2ZXJfaWQiLCJlYWNoIiwiY2FsbGJhY2siLCJleHRlbmQiLCJwcm90b3R5cGUiLCJyZWdpc3RlciIsImFsbF9zb2NrZXRzIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIdHRwU2VydmVyTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwic2xpY2UiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJuZXdMaXN0ZW5lciIsInJlcXVlc3QiLCJhcmdzIiwiYXJndW1lbnRzIiwicGFyc2VkVXJsIiwicGF0aG5hbWUiLCJmb3JtYXQiLCJvbGRMaXN0ZW5lciIsImFwcGx5IiwiRERQU2VydmVyIiwiRmliZXIiLCJTZXNzaW9uRG9jdW1lbnRWaWV3IiwiZXhpc3RzSW4iLCJTZXQiLCJkYXRhQnlLZXkiLCJNYXAiLCJfU2Vzc2lvbkRvY3VtZW50VmlldyIsImdldEZpZWxkcyIsInJldCIsImZvckVhY2giLCJwcmVjZWRlbmNlTGlzdCIsImtleSIsInZhbHVlIiwiY2xlYXJGaWVsZCIsInN1YnNjcmlwdGlvbkhhbmRsZSIsImNoYW5nZUNvbGxlY3RvciIsImdldCIsInJlbW92ZWRWYWx1ZSIsInVuZGVmaW5lZCIsImkiLCJsZW5ndGgiLCJwcmVjZWRlbmNlIiwic3BsaWNlIiwiZGVsZXRlIiwiRUpTT04iLCJlcXVhbHMiLCJjaGFuZ2VGaWVsZCIsImlzQWRkIiwiY2xvbmUiLCJoYXMiLCJzZXQiLCJlbHQiLCJmaW5kIiwiU2Vzc2lvbkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbk5hbWUiLCJzZXNzaW9uQ2FsbGJhY2tzIiwiZG9jdW1lbnRzIiwiY2FsbGJhY2tzIiwiX1Nlc3Npb25Db2xsZWN0aW9uVmlldyIsImlzRW1wdHkiLCJzaXplIiwiZGlmZiIsInByZXZpb3VzIiwiRGlmZlNlcXVlbmNlIiwiZGlmZk1hcHMiLCJib3RoIiwiYmluZCIsImRpZmZEb2N1bWVudCIsInJpZ2h0T25seSIsImlkIiwibm93RFYiLCJhZGRlZCIsImxlZnRPbmx5IiwicHJldkRWIiwicmVtb3ZlZCIsImZpZWxkcyIsImRpZmZPYmplY3RzIiwicHJldiIsIm5vdyIsImNoYW5nZWQiLCJkb2NWaWV3IiwiYWRkIiwiY2hhbmdlZFJlc3VsdCIsIkVycm9yIiwiZXJyIiwiU2Vzc2lvbiIsInZlcnNpb24iLCJvcHRpb25zIiwiUmFuZG9tIiwiaW5pdGlhbGl6ZWQiLCJpblF1ZXVlIiwiTWV0ZW9yIiwiX0RvdWJsZUVuZGVkUXVldWUiLCJibG9ja2VkIiwid29ya2VyUnVubmluZyIsIl9uYW1lZFN1YnMiLCJfdW5pdmVyc2FsU3VicyIsInVzZXJJZCIsImNvbGxlY3Rpb25WaWV3cyIsIl9pc1NlbmRpbmciLCJfZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyIsIl9wZW5kaW5nUmVhZHkiLCJfY2xvc2VDYWxsYmFja3MiLCJfc29ja2V0VXJsIiwiX3Jlc3BvbmRUb1BpbmdzIiwicmVzcG9uZFRvUGluZ3MiLCJjb25uZWN0aW9uSGFuZGxlIiwiY2xvc2UiLCJvbkNsb3NlIiwiZm4iLCJjYiIsImJpbmRFbnZpcm9ubWVudCIsImRlZmVyIiwiY2xpZW50QWRkcmVzcyIsIl9jbGllbnRBZGRyZXNzIiwiaHR0cEhlYWRlcnMiLCJoZWFkZXJzIiwibXNnIiwic2Vzc2lvbiIsInN0YXJ0VW5pdmVyc2FsU3VicyIsInJ1biIsImhlYXJ0YmVhdEludGVydmFsIiwiaGVhcnRiZWF0IiwiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiaGVhcnRiZWF0VGltZW91dCIsIm9uVGltZW91dCIsInNlbmRQaW5nIiwic3RhcnQiLCJQYWNrYWdlIiwiRmFjdHMiLCJpbmNyZW1lbnRTZXJ2ZXJGYWN0Iiwic2VuZFJlYWR5Iiwic3Vic2NyaXB0aW9uSWRzIiwic3VicyIsInN1YnNjcmlwdGlvbklkIiwic2VuZEFkZGVkIiwiY29sbGVjdGlvbiIsInNlbmRDaGFuZ2VkIiwic2VuZFJlbW92ZWQiLCJnZXRTZW5kQ2FsbGJhY2tzIiwiZ2V0Q29sbGVjdGlvblZpZXciLCJ2aWV3IiwiaGFuZGxlcnMiLCJ1bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyIsImhhbmRsZXIiLCJfc3RhcnRTdWJzY3JpcHRpb24iLCJzdG9wIiwiX21ldGVvclNlc3Npb24iLCJfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMiLCJfcmVtb3ZlU2Vzc2lvbiIsIl9wcmludFNlbnRERFAiLCJfZGVidWciLCJzdHJpbmdpZnlERFAiLCJzZW5kRXJyb3IiLCJyZWFzb24iLCJvZmZlbmRpbmdNZXNzYWdlIiwicHJvY2Vzc01lc3NhZ2UiLCJtc2dfaW4iLCJtZXNzYWdlUmVjZWl2ZWQiLCJwcm9jZXNzTmV4dCIsInNoaWZ0IiwidW5ibG9jayIsIm9uTWVzc2FnZUhvb2siLCJwcm90b2NvbF9oYW5kbGVycyIsImNhbGwiLCJzdWIiLCJuYW1lIiwicGFyYW1zIiwiQXJyYXkiLCJwdWJsaXNoX2hhbmRsZXJzIiwiZXJyb3IiLCJERFBSYXRlTGltaXRlciIsInJhdGVMaW1pdGVySW5wdXQiLCJ0eXBlIiwiY29ubmVjdGlvbklkIiwiX2luY3JlbWVudCIsInJhdGVMaW1pdFJlc3VsdCIsIl9jaGVjayIsImFsbG93ZWQiLCJnZXRFcnJvck1lc3NhZ2UiLCJ0aW1lVG9SZXNldCIsInVuc3ViIiwiX3N0b3BTdWJzY3JpcHRpb24iLCJtZXRob2QiLCJyYW5kb21TZWVkIiwiZmVuY2UiLCJfV3JpdGVGZW5jZSIsIm9uQWxsQ29tbWl0dGVkIiwicmV0aXJlIiwibWV0aG9kcyIsIm1ldGhvZF9oYW5kbGVycyIsImFybSIsInNldFVzZXJJZCIsIl9zZXRVc2VySWQiLCJpbnZvY2F0aW9uIiwiTWV0aG9kSW52b2NhdGlvbiIsImlzU2ltdWxhdGlvbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9DdXJyZW50V3JpdGVGZW5jZSIsIndpdGhWYWx1ZSIsIkREUCIsIl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsIm1heWJlQXVkaXRBcmd1bWVudENoZWNrcyIsImZpbmlzaCIsInBheWxvYWQiLCJ0aGVuIiwicmVzdWx0IiwiZXhjZXB0aW9uIiwid3JhcEludGVybmFsRXhjZXB0aW9uIiwiX2VhY2hTdWIiLCJmIiwiX2RpZmZDb2xsZWN0aW9uVmlld3MiLCJiZWZvcmVDVnMiLCJsZWZ0VmFsdWUiLCJyaWdodFZhbHVlIiwiZG9jIiwiX2RlYWN0aXZhdGUiLCJvbGROYW1lZFN1YnMiLCJuZXdTdWIiLCJfcmVjcmVhdGUiLCJfcnVuSGFuZGxlciIsIl9ub1lpZWxkc0FsbG93ZWQiLCJzdWJJZCIsIlN1YnNjcmlwdGlvbiIsInN1Yk5hbWUiLCJtYXliZVN1YiIsIl9uYW1lIiwiX3JlbW92ZUFsbERvY3VtZW50cyIsInJlc3BvbnNlIiwiaHR0cEZvcndhcmRlZENvdW50IiwicGFyc2VJbnQiLCJyZW1vdGVBZGRyZXNzIiwiZm9yd2FyZGVkRm9yIiwiaXNTdHJpbmciLCJ0cmltIiwic3BsaXQiLCJfaGFuZGxlciIsIl9zdWJzY3JpcHRpb25JZCIsIl9wYXJhbXMiLCJfc3Vic2NyaXB0aW9uSGFuZGxlIiwiX2RlYWN0aXZhdGVkIiwiX3N0b3BDYWxsYmFja3MiLCJfZG9jdW1lbnRzIiwiX3JlYWR5IiwiX2lkRmlsdGVyIiwiaWRTdHJpbmdpZnkiLCJNb25nb0lEIiwiaWRQYXJzZSIsInJlcyIsIl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIiwiZSIsIl9pc0RlYWN0aXZhdGVkIiwiX3B1Ymxpc2hIYW5kbGVyUmVzdWx0IiwiaXNDdXJzb3IiLCJjIiwiX3B1Ymxpc2hDdXJzb3IiLCJyZWFkeSIsImlzQXJyYXkiLCJhbGwiLCJjb2xsZWN0aW9uTmFtZXMiLCJfZ2V0Q29sbGVjdGlvbk5hbWUiLCJjdXIiLCJfY2FsbFN0b3BDYWxsYmFja3MiLCJjb2xsZWN0aW9uRG9jcyIsInN0cklkIiwib25TdG9wIiwiaWRzIiwiU2VydmVyIiwiZGVmYXVsdHMiLCJvbkNvbm5lY3Rpb25Ib29rIiwiSG9vayIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwic2Vzc2lvbnMiLCJzdHJlYW1fc2VydmVyIiwicmF3X21zZyIsIl9wcmludFJlY2VpdmVkRERQIiwicGFyc2VERFAiLCJfaGFuZGxlQ29ubmVjdCIsIm9uQ29ubmVjdGlvbiIsIm9uTWVzc2FnZSIsInN1cHBvcnQiLCJjb250YWlucyIsIlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMiLCJjYWxjdWxhdGVWZXJzaW9uIiwicHVibGlzaCIsImlzT2JqZWN0IiwiYXV0b3B1Ymxpc2giLCJpc19hdXRvIiwid2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoIiwiZnVuYyIsInBvcCIsImNhbGxBc3luYyIsImFwcGx5QXN5bmMiLCJhd2FpdCIsImN1cnJlbnRNZXRob2RJbnZvY2F0aW9uIiwiY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsIm1ha2VScGNTZWVkIiwiX3VybEZvclNlc3Npb24iLCJzZXNzaW9uSWQiLCJjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyIsInNlcnZlclN1cHBvcnRlZFZlcnNpb25zIiwiY29ycmVjdFZlcnNpb24iLCJfY2FsY3VsYXRlVmVyc2lvbiIsImNvbnRleHQiLCJpc0NsaWVudFNhZmUiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtZXNzYWdlIiwiZGV0YWlscyIsIl9leHBlY3RlZEJ5VGVzdCIsInN0YWNrIiwic2FuaXRpemVkRXJyb3IiLCJkZXNjcmlwdGlvbiIsIk1hdGNoIiwiX2ZhaWxJZkFyZ3VtZW50c0FyZU5vdEFsbENoZWNrZWQiLCJGdXR1cmUiLCJhcm1lZCIsImZpcmVkIiwicmV0aXJlZCIsIm91dHN0YW5kaW5nX3dyaXRlcyIsImJlZm9yZV9maXJlX2NhbGxiYWNrcyIsImNvbXBsZXRpb25fY2FsbGJhY2tzIiwiRW52aXJvbm1lbnRWYXJpYWJsZSIsImJlZ2luV3JpdGUiLCJjb21taXR0ZWQiLCJfbWF5YmVGaXJlIiwib25CZWZvcmVGaXJlIiwiYXJtQW5kV2FpdCIsImZ1dHVyZSIsIndhaXQiLCJpbnZva2VDYWxsYmFjayIsIl9Dcm9zc2JhciIsIm5leHRJZCIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbiIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50IiwiZmFjdFBhY2thZ2UiLCJmYWN0TmFtZSIsIl9jb2xsZWN0aW9uRm9yTWVzc2FnZSIsImxpc3RlbiIsInRyaWdnZXIiLCJyZWNvcmQiLCJmaXJlIiwibm90aWZpY2F0aW9uIiwibGlzdGVuZXJzRm9yQ29sbGVjdGlvbiIsImNhbGxiYWNrSWRzIiwibCIsIl9tYXRjaGVzIiwiT2JqZWN0SUQiLCJ0cmlnZ2VyVmFsdWUiLCJfSW52YWxpZGF0aW9uQ3Jvc3NiYXIiLCJERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCIsInJlZnJlc2giLCJkZWZhdWx0X3NlcnZlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsR0FBRyxHQUFHQyxHQUFHLENBQUNDLE9BQUosQ0FBWSxLQUFaLENBQVYsQyxDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLG1CQUFtQixHQUFHQyxDQUFDLENBQUNDLElBQUYsQ0FBTyxZQUFZO0FBQzNDLE1BQUlDLFVBQVUsR0FBRyxFQUFqQjtBQUVBLE1BQUlDLDBCQUEwQixHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQVosR0FDekJDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQXZCLENBRHlCLEdBQzhCLEVBRC9EOztBQUVBLE1BQUlILDBCQUFKLEVBQWdDO0FBQzlCRCxjQUFVLENBQUNPLElBQVgsQ0FBZ0JaLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLG9CQUFaLEVBQWtDWSxTQUFsQyxDQUNkUCwwQkFEYyxDQUFoQjtBQUdEOztBQUVE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QVAsR0FBaUIsVUFBVVQsWUFBVixFQUF3QjtBQUN2Q3RVLFdBQVMsQ0FBQzZVLHFCQUFWLENBQWdDUixJQUFoQyxDQUFxQ0MsWUFBckM7QUFDRCxDQUZELEMsQ0FJQTtBQUNBOzs7QUFDQWxaLENBQUMsQ0FBQ3VELElBQUYsQ0FBTyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCLE9BQS9CLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELENBQVAsRUFDTyxVQUFVeUssSUFBVixFQUFnQjtBQUNkNUUsUUFBTSxDQUFDNEUsSUFBRCxDQUFOLEdBQWVoTyxDQUFDLENBQUMySCxJQUFGLENBQU95QixNQUFNLENBQUNySCxNQUFQLENBQWNpTSxJQUFkLENBQVAsRUFBNEI1RSxNQUFNLENBQUNySCxNQUFuQyxDQUFmO0FBQ0QsQ0FIUixFLENBS0E7QUFDQTtBQUNBOzs7QUFDQXFILE1BQU0sQ0FBQ3dRLGNBQVAsR0FBd0J4USxNQUFNLENBQUNySCxNQUEvQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9kZHAtc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHVybCA9IE5wbS5yZXF1aXJlKCd1cmwnKTtcblxuLy8gQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBwZXJtZXNzYWdlLWRlZmxhdGUgZXh0ZW5zaW9uIHdpdGggZGVmYXVsdFxuLy8gY29uZmlndXJhdGlvbi4gSWYgJFNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04gaXMgc2V0LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRcbi8vIEpTT04uIElmIGl0IHJlcHJlc2VudHMgYSBmYWxzZXkgdmFsdWUsIHRoZW4gd2UgZG8gbm90IHVzZSBwZXJtZXNzYWdlLWRlZmxhdGVcbi8vIGF0IGFsbDsgb3RoZXJ3aXNlLCB0aGUgSlNPTiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGRlZmxhdGUnc1xuLy8gY29uZmlndXJlIG1ldGhvZDsgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmF5ZS9wZXJtZXNzYWdlLWRlZmxhdGUtbm9kZS9ibG9iL21hc3Rlci9SRUFETUUubWRcbi8vXG4vLyAoV2UgZG8gdGhpcyBpbiBhbiBfLm9uY2UgaW5zdGVhZCBvZiBhdCBzdGFydHVwLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG9cbi8vIGNyYXNoIHRoZSB0b29sIGR1cmluZyBpc29wYWNrZXQgbG9hZCBpZiB5b3VyIEpTT04gZG9lc24ndCBwYXJzZS4gVGhpcyBpcyBvbmx5XG4vLyBhIHByb2JsZW0gYmVjYXVzZSB0aGUgdG9vbCBoYXMgdG8gbG9hZCB0aGUgRERQIHNlcnZlciBjb2RlIGp1c3QgaW4gb3JkZXIgdG9cbi8vIGJlIGEgRERQIGNsaWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRlb3IvbWV0ZW9yL2lzc3Vlcy8zNDUyIC4pXG52YXIgd2Vic29ja2V0RXh0ZW5zaW9ucyA9IF8ub25jZShmdW5jdGlvbiAoKSB7XG4gIHZhciBleHRlbnNpb25zID0gW107XG5cbiAgdmFyIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnID0gcHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTlxuICAgICAgICA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTikgOiB7fTtcbiAgaWYgKHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnKSB7XG4gICAgZXh0ZW5zaW9ucy5wdXNoKE5wbS5yZXF1aXJlKCdwZXJtZXNzYWdlLWRlZmxhdGUnKS5jb25maWd1cmUoXG4gICAgICB3ZWJzb2NrZXRDb21wcmVzc2lvbkNvbmZpZ1xuICAgICkpO1xuICB9XG5cbiAgcmV0dXJuIGV4dGVuc2lvbnM7XG59KTtcblxudmFyIHBhdGhQcmVmaXggPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYIHx8ICBcIlwiO1xuXG5TdHJlYW1TZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzID0gW107XG4gIHNlbGYub3Blbl9zb2NrZXRzID0gW107XG5cbiAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zdGFsbGluZyBkaXJlY3RseSBvbnRvIFdlYkFwcC5odHRwU2VydmVyIGluc3RlYWQgb2YgdXNpbmdcbiAgLy8gV2ViQXBwLmFwcCwgd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBwYXRoIHByZWZpeCBvdXJzZWx2ZXMuXG4gIHNlbGYucHJlZml4ID0gcGF0aFByZWZpeCArICcvc29ja2pzJztcbiAgUm91dGVQb2xpY3kuZGVjbGFyZShzZWxmLnByZWZpeCArICcvJywgJ25ldHdvcmsnKTtcblxuICAvLyBzZXQgdXAgc29ja2pzXG4gIHZhciBzb2NranMgPSBOcG0ucmVxdWlyZSgnc29ja2pzJyk7XG4gIHZhciBzZXJ2ZXJPcHRpb25zID0ge1xuICAgIHByZWZpeDogc2VsZi5wcmVmaXgsXG4gICAgbG9nOiBmdW5jdGlvbigpIHt9LFxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBjb2RlIGl0IGV4cGxpY2l0bHkgYmVjYXVzZSB3ZSBkZXBlbmRcbiAgICAvLyBvbiBpdCBpbiBzdHJlYW1fY2xpZW50OkhFQVJUQkVBVF9USU1FT1VUXG4gICAgaGVhcnRiZWF0X2RlbGF5OiA0NTAwMCxcbiAgICAvLyBUaGUgZGVmYXVsdCBkaXNjb25uZWN0X2RlbGF5IGlzIDUgc2Vjb25kcywgYnV0IGlmIHRoZSBzZXJ2ZXIgZW5kcyB1cCBDUFVcbiAgICAvLyBib3VuZCBmb3IgdGhhdCBtdWNoIHRpbWUsIFNvY2tKUyBtaWdodCBub3Qgbm90aWNlIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgLy8gcmVjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdGltZXIgKG9mIGRpc2Nvbm5lY3RfZGVsYXkgbXMpIGNhbiBmaXJlIGJlZm9yZVxuICAgIC8vIFNvY2tKUyBwcm9jZXNzZXMgdGhlIG5ldyBjb25uZWN0aW9uLiBFdmVudHVhbGx5IHdlJ2xsIGZpeCB0aGlzIGJ5IG5vdFxuICAgIC8vIGNvbWJpbmluZyBDUFUtaGVhdnkgcHJvY2Vzc2luZyB3aXRoIFNvY2tKUyB0ZXJtaW5hdGlvbiAoZWcgYSBwcm94eSB3aGljaFxuICAgIC8vIGNvbnZlcnRzIHRvIFVuaXggc29ja2V0cykgYnV0IGZvciBub3csIHJhaXNlIHRoZSBkZWxheS5cbiAgICBkaXNjb25uZWN0X2RlbGF5OiA2MCAqIDEwMDAsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklEXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICAgJiYgc29ja2V0Ll9zZXNzaW9uLnJlY3YpIHtcbiAgICAgICAgc29ja2V0Ll9zZXNzaW9uLnJlY3YuY29ubmVjdGlvbi5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgc29ja2V0LnNldFdlYnNvY2tldFRpbWVvdXQoNDUgKiAxMDAwKTtcblxuICAgIHNvY2tldC5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHNvY2tldC53cml0ZShkYXRhKTtcbiAgICB9O1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9wZW5fc29ja2V0cyA9IF8ud2l0aG91dChzZWxmLm9wZW5fc29ja2V0cywgc29ja2V0KTtcbiAgICB9KTtcbiAgICBzZWxmLm9wZW5fc29ja2V0cy5wdXNoKHNvY2tldCk7XG5cbiAgICAvLyBYWFggQ09NUEFUIFdJVEggMC42LjYuIFNlbmQgdGhlIG9sZCBzdHlsZSB3ZWxjb21lIG1lc3NhZ2UsIHdoaWNoXG4gICAgLy8gd2lsbCBmb3JjZSBvbGQgY2xpZW50cyB0byByZWxvYWQuIFJlbW92ZSB0aGlzIG9uY2Ugd2UncmUgbm90XG4gICAgLy8gY29uY2VybmVkIGFib3V0IHBlb3BsZSB1cGdyYWRpbmcgZnJvbSBhIHByZS0wLjcuMCByZWxlYXNlLiBBbHNvLFxuICAgIC8vIHJlbW92ZSB0aGUgY2xhdXNlIGluIHRoZSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZSB3ZWxjb21lIG1lc3NhZ2VcbiAgICAvLyAobGl2ZWRhdGFfY29ubmVjdGlvbi5qcylcbiAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7c2VydmVyX2lkOiBcIjBcIn0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgYSBjb25uZWN0IG1pZGRsZXdhcmUgaGVyZSBzaW5jZVxuICAgIC8vIHNvY2tqcyBpbnN0YWxscyBpdHNlbGYgcHJpb3IgdG8gYWxsIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgIC8vIChtZWFuaW5nIHByaW9yIHRvIGFueSBjb25uZWN0IG1pZGRsZXdhcmVzKSBzbyB3ZSBuZWVkIHRvIHRha2VcbiAgICAvLyBhbiBhcHByb2FjaCBzaW1pbGFyIHRvIG92ZXJzaGFkb3dMaXN0ZW5lcnMgaW5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc29ja2pzL3NvY2tqcy1ub2RlL2Jsb2IvY2Y4MjBjNTVhZjZhOTk1M2UxNjU1ODU1NWEzMWRlY2VhNTU0ZjcwZS9zcmMvdXRpbHMuY29mZmVlXG4gICAgXy5lYWNoKFsncmVxdWVzdCcsICd1cGdyYWRlJ10sIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgaHR0cFNlcnZlciA9IFdlYkFwcC5odHRwU2VydmVyO1xuICAgICAgdmFyIG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMgPSBodHRwU2VydmVyLmxpc3RlbmVycyhldmVudCkuc2xpY2UoMCk7XG4gICAgICBodHRwU2VydmVyLnJlbW92ZUFsbExpc3RlbmVycyhldmVudCk7XG5cbiAgICAgIC8vIHJlcXVlc3QgYW5kIHVwZ3JhZGUgaGF2ZSBkaWZmZXJlbnQgYXJndW1lbnRzIHBhc3NlZCBidXRcbiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3Qgb25lIHdoaWNoIGlzIGFsd2F5cyByZXF1ZXN0XG4gICAgICB2YXIgbmV3TGlzdGVuZXIgPSBmdW5jdGlvbihyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgICBwYXJzZWRVcmwucGF0aG5hbWUgPT09IHBhdGhQcmVmaXggKyAnL3dlYnNvY2tldC8nKSB7XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID0gc2VsZi5wcmVmaXggKyAnL3dlYnNvY2tldCc7XG4gICAgICAgICAgcmVxdWVzdC51cmwgPSB1cmwuZm9ybWF0KHBhcnNlZFVybCk7XG4gICAgICAgIH1cbiAgICAgICAgXy5lYWNoKG9sZEh0dHBTZXJ2ZXJMaXN0ZW5lcnMsIGZ1bmN0aW9uKG9sZExpc3RlbmVyKSB7XG4gICAgICAgICAgb2xkTGlzdGVuZXIuYXBwbHkoaHR0cFNlcnZlciwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGh0dHBTZXJ2ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIG5ld0xpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufSk7XG4iLCJERFBTZXJ2ZXIgPSB7fTtcblxudmFyIEZpYmVyID0gTnBtLnJlcXVpcmUoJ2ZpYmVycycpO1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3Nlczpcbi8vICogU2Vzc2lvbiAtIFRoZSBzZXJ2ZXIncyBjb25uZWN0aW9uIHRvIGEgc2luZ2xlIEREUCBjbGllbnRcbi8vICogU3Vic2NyaXB0aW9uIC0gQSBzaW5nbGUgc3Vic2NyaXB0aW9uIGZvciBhIHNpbmdsZSBjbGllbnRcbi8vICogU2VydmVyIC0gQW4gZW50aXJlIHNlcnZlciB0aGF0IG1heSB0YWxrIHRvID4gMSBjbGllbnQuIEEgRERQIGVuZHBvaW50LlxuLy9cbi8vIFNlc3Npb24gYW5kIFN1YnNjcmlwdGlvbiBhcmUgZmlsZSBzY29wZS4gRm9yIG5vdywgdW50aWwgd2UgZnJlZXplXG4vLyB0aGUgaW50ZXJmYWNlLCBTZXJ2ZXIgaXMgcGFja2FnZSBzY29wZSAoaW4gdGhlIGZ1dHVyZSBpdCBzaG91bGQgYmVcbi8vIGV4cG9ydGVkLilcblxuLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBkb2N1bWVudCBpbiBhIFNlc3Npb25Db2xsZWN0aW9uVmlld1xudmFyIFNlc3Npb25Eb2N1bWVudFZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5leGlzdHNJbiA9IG5ldyBTZXQoKTsgLy8gc2V0IG9mIHN1YnNjcmlwdGlvbkhhbmRsZVxuICBzZWxmLmRhdGFCeUtleSA9IG5ldyBNYXAoKTsgLy8ga2V5LT4gWyB7c3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZX0gYnkgcHJlY2VkZW5jZV1cbn07XG5cbkREUFNlcnZlci5fU2Vzc2lvbkRvY3VtZW50VmlldyA9IFNlc3Npb25Eb2N1bWVudFZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkRvY3VtZW50Vmlldy5wcm90b3R5cGUsIHtcblxuICBnZXRGaWVsZHM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHNlbGYuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgIHJldFtrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBjbGVhckZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZUNvbGxlY3Rvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBQdWJsaXNoIEFQSSBpZ25vcmVzIF9pZCBpZiBwcmVzZW50IGluIGZpZWxkc1xuICAgIGlmIChrZXkgPT09IFwiX2lkXCIpXG4gICAgICByZXR1cm47XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAvLyBJdCdzIG9rYXkgdG8gY2xlYXIgZmllbGRzIHRoYXQgZGlkbid0IGV4aXN0LiBObyBuZWVkIHRvIHRocm93XG4gICAgLy8gYW4gZXJyb3IuXG4gICAgaWYgKCFwcmVjZWRlbmNlTGlzdClcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZW1vdmVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVjZWRlbmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlTGlzdFtpXTtcbiAgICAgIGlmIChwcmVjZWRlbmNlLnN1YnNjcmlwdGlvbkhhbmRsZSA9PT0gc3Vic2NyaXB0aW9uSGFuZGxlKSB7XG4gICAgICAgIC8vIFRoZSB2aWV3J3MgdmFsdWUgY2FuIG9ubHkgY2hhbmdlIGlmIHRoaXMgc3Vic2NyaXB0aW9uIGlzIHRoZSBvbmUgdGhhdFxuICAgICAgICAvLyB1c2VkIHRvIGhhdmUgcHJlY2VkZW5jZS5cbiAgICAgICAgaWYgKGkgPT09IDApXG4gICAgICAgICAgcmVtb3ZlZFZhbHVlID0gcHJlY2VkZW5jZS52YWx1ZTtcbiAgICAgICAgcHJlY2VkZW5jZUxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZWNlZGVuY2VMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAhRUpTT04uZXF1YWxzKHJlbW92ZWRWYWx1ZSwgcHJlY2VkZW5jZUxpc3RbMF0udmFsdWUpKSB7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHByZWNlZGVuY2VMaXN0WzBdLnZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VGaWVsZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VDb2xsZWN0b3IsIGlzQWRkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERvbid0IHNoYXJlIHN0YXRlIHdpdGggdGhlIGRhdGEgcGFzc2VkIGluIGJ5IHRoZSB1c2VyLlxuICAgIHZhbHVlID0gRUpTT04uY2xvbmUodmFsdWUpO1xuXG4gICAgaWYgKCFzZWxmLmRhdGFCeUtleS5oYXMoa2V5KSkge1xuICAgICAgc2VsZi5kYXRhQnlLZXkuc2V0KGtleSwgW3tzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlfV0pO1xuICAgICAgY2hhbmdlQ29sbGVjdG9yW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByZWNlZGVuY2VMaXN0ID0gc2VsZi5kYXRhQnlLZXkuZ2V0KGtleSk7XG4gICAgdmFyIGVsdDtcbiAgICBpZiAoIWlzQWRkKSB7XG4gICAgICBlbHQgPSBwcmVjZWRlbmNlTGlzdC5maW5kKGZ1bmN0aW9uIChwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZWx0KSB7XG4gICAgICBpZiAoZWx0ID09PSBwcmVjZWRlbmNlTGlzdFswXSAmJiAhRUpTT04uZXF1YWxzKHZhbHVlLCBlbHQudmFsdWUpKSB7XG4gICAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZWx0LnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMgc3Vic2NyaXB0aW9uIGlzIG5ld2x5IGNhcmluZyBhYm91dCB0aGlzIGZpZWxkXG4gICAgICBwcmVjZWRlbmNlTGlzdC5wdXNoKHtzdWJzY3JpcHRpb25IYW5kbGU6IHN1YnNjcmlwdGlvbkhhbmRsZSwgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gIH1cbn0pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjbGllbnQncyB2aWV3IG9mIGEgc2luZ2xlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGl0IHJlcHJlc2VudHNcbiAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIEZ1bmN0aW9uPn0gc2Vzc2lvbkNhbGxiYWNrcyBUaGUgY2FsbGJhY2tzIGZvciBhZGRlZCwgY2hhbmdlZCwgcmVtb3ZlZFxuICogQGNsYXNzIFNlc3Npb25Db2xsZWN0aW9uVmlld1xuICovXG52YXIgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3ID0gZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBzZXNzaW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lO1xuICBzZWxmLmRvY3VtZW50cyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5jYWxsYmFja3MgPSBzZXNzaW9uQ2FsbGJhY2tzO1xufTtcblxuRERQU2VydmVyLl9TZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBTZXNzaW9uQ29sbGVjdGlvblZpZXc7XG5cblxuXy5leHRlbmQoU2Vzc2lvbkNvbGxlY3Rpb25WaWV3LnByb3RvdHlwZSwge1xuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuZG9jdW1lbnRzLnNpemUgPT09IDA7XG4gIH0sXG5cbiAgZGlmZjogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhwcmV2aW91cy5kb2N1bWVudHMsIHNlbGYuZG9jdW1lbnRzLCB7XG4gICAgICBib3RoOiBfLmJpbmQoc2VsZi5kaWZmRG9jdW1lbnQsIHNlbGYpLFxuXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChpZCwgbm93RFYpIHtcbiAgICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIG5vd0RWLmdldEZpZWxkcygpKTtcbiAgICAgIH0sXG5cbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoaWQsIHByZXZEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBkaWZmRG9jdW1lbnQ6IGZ1bmN0aW9uIChpZCwgcHJldkRWLCBub3dEVikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZmllbGRzID0ge307XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZPYmplY3RzKHByZXZEVi5nZXRGaWVsZHMoKSwgbm93RFYuZ2V0RmllbGRzKCksIHtcbiAgICAgIGJvdGg6IGZ1bmN0aW9uIChrZXksIHByZXYsIG5vdykge1xuICAgICAgICBpZiAoIUVKU09OLmVxdWFscyhwcmV2LCBub3cpKVxuICAgICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGtleSwgbm93KSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gbm93O1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbihrZXksIHByZXYpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgdmFyIGFkZGVkID0gZmFsc2U7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgICBkb2NWaWV3ID0gbmV3IFNlc3Npb25Eb2N1bWVudFZpZXcoKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLnNldChpZCwgZG9jVmlldyk7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uYWRkKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgdmFyIGNoYW5nZUNvbGxlY3RvciA9IHt9O1xuICAgIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKFxuICAgICAgICBzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgdmFsdWUsIGNoYW5nZUNvbGxlY3RvciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgaWYgKGFkZGVkKVxuICAgICAgc2VsZi5jYWxsYmFja3MuYWRkZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZUNvbGxlY3Rvcik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgY2hhbmdlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2hhbmdlZFJlc3VsdCA9IHt9O1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICBpZiAoIWRvY1ZpZXcpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBlbGVtZW50IHdpdGggaWQgXCIgKyBpZCArIFwiIHRvIGNoYW5nZVwiKTtcbiAgICBfLmVhY2goY2hhbmdlZCwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWRSZXN1bHQpO1xuICAgICAgZWxzZVxuICAgICAgICBkb2NWaWV3LmNoYW5nZUZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgfSk7XG4gICAgc2VsZi5jYWxsYmFja3MuY2hhbmdlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlZFJlc3VsdCk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldykge1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlJlbW92ZWQgbm9uZXhpc3RlbnQgZG9jdW1lbnQgXCIgKyBpZCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGRvY1ZpZXcuZXhpc3RzSW4uZGVsZXRlKHN1YnNjcmlwdGlvbkhhbmRsZSk7XG4gICAgaWYgKGRvY1ZpZXcuZXhpc3RzSW4uc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gaXQgaXMgZ29uZSBmcm9tIGV2ZXJ5b25lXG4gICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmVkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgICAgIHNlbGYuZG9jdW1lbnRzLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGFuZ2VkID0ge307XG4gICAgICAvLyByZW1vdmUgdGhpcyBzdWJzY3JpcHRpb24gZnJvbSBldmVyeSBwcmVjZWRlbmNlIGxpc3RcbiAgICAgIC8vIGFuZCByZWNvcmQgdGhlIGNoYW5nZXNcbiAgICAgIGRvY1ZpZXcuZGF0YUJ5S2V5LmZvckVhY2goZnVuY3Rpb24gKHByZWNlZGVuY2VMaXN0LCBrZXkpIHtcbiAgICAgICAgZG9jVmlldy5jbGVhckZpZWxkKHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCBjaGFuZ2VkKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkKTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2Vzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbnZhciBTZXNzaW9uID0gZnVuY3Rpb24gKHNlcnZlciwgdmVyc2lvbiwgc29ja2V0LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5pZCA9IFJhbmRvbS5pZCgpO1xuXG4gIHNlbGYuc2VydmVyID0gc2VydmVyO1xuICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gIHNlbGYuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgc2VsZi5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgLy8gc2V0IHRvIG51bGwgd2hlbiB0aGUgc2Vzc2lvbiBpcyBkZXN0cm95ZWQuIG11bHRpcGxlIHBsYWNlcyBiZWxvd1xuICAvLyB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlIHNlc3Npb24gaXMgYWxpdmUgb3Igbm90LlxuICBzZWxmLmluUXVldWUgPSBuZXcgTWV0ZW9yLl9Eb3VibGVFbmRlZFF1ZXVlKCk7XG5cbiAgc2VsZi5ibG9ja2VkID0gZmFsc2U7XG4gIHNlbGYud29ya2VyUnVubmluZyA9IGZhbHNlO1xuXG4gIC8vIFN1YiBvYmplY3RzIGZvciBhY3RpdmUgc3Vic2NyaXB0aW9uc1xuICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG4gIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICBzZWxmLnVzZXJJZCA9IG51bGw7XG5cbiAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgLy8gU2V0IHRoaXMgdG8gZmFsc2UgdG8gbm90IHNlbmQgbWVzc2FnZXMgd2hlbiBjb2xsZWN0aW9uVmlld3MgYXJlXG4gIC8vIG1vZGlmaWVkLiBUaGlzIGlzIGRvbmUgd2hlbiByZXJ1bm5pbmcgc3VicyBpbiBfc2V0VXNlcklkIGFuZCB0aG9zZSBtZXNzYWdlc1xuICAvLyBhcmUgY2FsY3VsYXRlZCB2aWEgYSBkaWZmIGluc3RlYWQuXG4gIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG5cbiAgLy8gSWYgdGhpcyBpcyB0cnVlLCBkb24ndCBzdGFydCBhIG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHB1Ymxpc2hlciBvbiB0aGlzXG4gIC8vIHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgdGFrZSBjYXJlIG9mIHN0YXJ0aW5nIGl0IHdoZW4gYXBwcm9wcmlhdGUuXG4gIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcblxuICAvLyB3aGVuIHdlIGFyZSByZXJ1bm5pbmcgc3Vic2NyaXB0aW9ucywgYW55IHJlYWR5IG1lc3NhZ2VzXG4gIC8vIHdlIHdhbnQgdG8gYnVmZmVyIHVwIGZvciB3aGVuIHdlIGFyZSBkb25lIHJlcnVubmluZyBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiB0aGlzIGNvbm5lY3Rpb24gaXMgY2xvc2VkLlxuICBzZWxmLl9jbG9zZUNhbGxiYWNrcyA9IFtdO1xuXG5cbiAgLy8gWFhYIEhBQ0s6IElmIGEgc29ja2pzIGNvbm5lY3Rpb24sIHNhdmUgb2ZmIHRoZSBVUkwuIFRoaXMgaXNcbiAgLy8gdGVtcG9yYXJ5IGFuZCB3aWxsIGdvIGF3YXkgaW4gdGhlIG5lYXIgZnV0dXJlLlxuICBzZWxmLl9zb2NrZXRVcmwgPSBzb2NrZXQudXJsO1xuXG4gIC8vIEFsbG93IHRlc3RzIHRvIGRpc2FibGUgcmVzcG9uZGluZyB0byBwaW5ncy5cbiAgc2VsZi5fcmVzcG9uZFRvUGluZ3MgPSBvcHRpb25zLnJlc3BvbmRUb1BpbmdzO1xuXG4gIC8vIFRoaXMgb2JqZWN0IGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBzZXNzaW9uLiBJbiB0aGUgcHVibGljXG4gIC8vIEFQSSwgaXQgaXMgY2FsbGVkIHRoZSBgY29ubmVjdGlvbmAgb2JqZWN0LiAgSW50ZXJuYWxseSB3ZSBjYWxsIGl0XG4gIC8vIGEgYGNvbm5lY3Rpb25IYW5kbGVgIHRvIGF2b2lkIGFtYmlndWl0eS5cbiAgc2VsZi5jb25uZWN0aW9uSGFuZGxlID0ge1xuICAgIGlkOiBzZWxmLmlkLFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNsb3NlKCk7XG4gICAgfSxcbiAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHZhciBjYiA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZm4sIFwiY29ubmVjdGlvbiBvbkNsb3NlIGNhbGxiYWNrXCIpO1xuICAgICAgaWYgKHNlbGYuaW5RdWV1ZSkge1xuICAgICAgICBzZWxmLl9jbG9zZUNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgY2xvc2VkLCBjYWxsIHRoZSBjYWxsYmFjay5cbiAgICAgICAgTWV0ZW9yLmRlZmVyKGNiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuX2NsaWVudEFkZHJlc3MoKSxcbiAgICBodHRwSGVhZGVyczogc2VsZi5zb2NrZXQuaGVhZGVyc1xuICB9O1xuXG4gIHNlbGYuc2VuZCh7IG1zZzogJ2Nvbm5lY3RlZCcsIHNlc3Npb246IHNlbGYuaWQgfSk7XG5cbiAgLy8gT24gaW5pdGlhbCBjb25uZWN0LCBzcGluIHVwIGFsbCB0aGUgdW5pdmVyc2FsIHB1Ymxpc2hlcnMuXG4gIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICB9KS5ydW4oKTtcblxuICBpZiAodmVyc2lvbiAhPT0gJ3ByZTEnICYmIG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwgIT09IDApIHtcbiAgICAvLyBXZSBubyBsb25nZXIgbmVlZCB0aGUgbG93IGxldmVsIHRpbWVvdXQgYmVjYXVzZSB3ZSBoYXZlIGhlYXJ0YmVhdGluZy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCgwKTtcblxuICAgIHNlbGYuaGVhcnRiZWF0ID0gbmV3IEREUENvbW1vbi5IZWFydGJlYXQoe1xuICAgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWwsXG4gICAgICBoZWFydGJlYXRUaW1lb3V0OiBvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQsXG4gICAgICBvblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgfSxcbiAgICAgIHNlbmRQaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7bXNnOiAncGluZyd9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmhlYXJ0YmVhdC5zdGFydCgpO1xuICB9XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFNlc3Npb24ucHJvdG90eXBlLCB7XG5cbiAgc2VuZFJlYWR5OiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSWRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZWFkeVwiLCBzdWJzOiBzdWJzY3JpcHRpb25JZHN9KTtcbiAgICBlbHNlIHtcbiAgICAgIF8uZWFjaChzdWJzY3JpcHRpb25JZHMsIGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkucHVzaChzdWJzY3JpcHRpb25JZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZEFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcImFkZGVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWQsIGZpZWxkczogZmllbGRzfSk7XG4gIH0sXG5cbiAgc2VuZENoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoXy5pc0VtcHR5KGZpZWxkcykpXG4gICAgICByZXR1cm47XG5cbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKSB7XG4gICAgICBzZWxmLnNlbmQoe1xuICAgICAgICBtc2c6IFwiY2hhbmdlZFwiLFxuICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNlbmRSZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpXG4gICAgICBzZWxmLnNlbmQoe21zZzogXCJyZW1vdmVkXCIsIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLCBpZDogaWR9KTtcbiAgfSxcblxuICBnZXRTZW5kQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICBhZGRlZDogXy5iaW5kKHNlbGYuc2VuZEFkZGVkLCBzZWxmKSxcbiAgICAgIGNoYW5nZWQ6IF8uYmluZChzZWxmLnNlbmRDaGFuZ2VkLCBzZWxmKSxcbiAgICAgIHJlbW92ZWQ6IF8uYmluZChzZWxmLnNlbmRSZW1vdmVkLCBzZWxmKVxuICAgIH07XG4gIH0sXG5cbiAgZ2V0Q29sbGVjdGlvblZpZXc6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0gc2VsZi5jb2xsZWN0aW9uVmlld3MuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcmV0ID0gbmV3IFNlc3Npb25Db2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFNlbmRDYWxsYmFja3MoKSk7XG4gICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5zZXQoY29sbGVjdGlvbk5hbWUsIHJldCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgYWRkZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5hZGRlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHJlbW92ZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcucmVtb3ZlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkKTtcbiAgICBpZiAodmlldy5pc0VtcHR5KCkpIHtcbiAgICAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cy5kZWxldGUoY29sbGVjdGlvbk5hbWUpO1xuICAgIH1cbiAgfSxcblxuICBjaGFuZ2VkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmlldyA9IHNlbGYuZ2V0Q29sbGVjdGlvblZpZXcoY29sbGVjdGlvbk5hbWUpO1xuICAgIHZpZXcuY2hhbmdlZChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIHN0YXJ0VW5pdmVyc2FsU3ViczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBzZXQgb2YgdW5pdmVyc2FsIGhhbmRsZXJzIGFuZCBzdGFydCB0aGVtLiBJZlxuICAgIC8vIGFkZGl0aW9uYWwgdW5pdmVyc2FsIHB1Ymxpc2hlcnMgc3RhcnQgd2hpbGUgd2UncmUgcnVubmluZyB0aGVtIChkdWUgdG9cbiAgICAvLyB5aWVsZGluZyksIHRoZXkgd2lsbCBydW4gc2VwYXJhdGVseSBhcyBwYXJ0IG9mIFNlcnZlci5wdWJsaXNoLlxuICAgIHZhciBoYW5kbGVycyA9IF8uY2xvbmUoc2VsZi5zZXJ2ZXIudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMpO1xuICAgIF8uZWFjaChoYW5kbGVycywgZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIERlc3Ryb3kgdGhpcyBzZXNzaW9uIGFuZCB1bnJlZ2lzdGVyIGl0IGF0IHRoZSBzZXJ2ZXIuXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24sIGV2ZW4gaWYgaXQncyBub3QgcmVnaXN0ZXJlZCBhdCB0aGVcbiAgICAvLyBzZXJ2ZXIuIFN0b3AgYWxsIHByb2Nlc3NpbmcgYW5kIHRlYXIgZXZlcnl0aGluZyBkb3duLiBJZiBhIHNvY2tldFxuICAgIC8vIHdhcyBhdHRhY2hlZCwgY2xvc2UgaXQuXG5cbiAgICAvLyBBbHJlYWR5IGRlc3Ryb3llZC5cbiAgICBpZiAoISBzZWxmLmluUXVldWUpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBEcm9wIHRoZSBtZXJnZSBib3ggZGF0YSBpbW1lZGlhdGVseS5cbiAgICBzZWxmLmluUXVldWUgPSBudWxsO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBzZWxmLmhlYXJ0YmVhdC5zdG9wKCk7XG4gICAgICBzZWxmLmhlYXJ0YmVhdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBzZWxmLnNvY2tldC5jbG9zZSgpO1xuICAgICAgc2VsZi5zb2NrZXQuX21ldGVvclNlc3Npb24gPSBudWxsO1xuICAgIH1cblxuICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgIFwibGl2ZWRhdGFcIiwgXCJzZXNzaW9uc1wiLCAtMSk7XG5cbiAgICBNZXRlb3IuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RvcCBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBkZWZlciB0aGlzIG9uIGNsb3NlLlxuICAgICAgLy8gc3ViLl9pc0RlYWN0aXZhdGVkKCkgZGV0ZWN0cyB0aGF0IHdlIHNldCBpblF1ZXVlIHRvIG51bGwgYW5kXG4gICAgICAvLyB0cmVhdHMgaXQgYXMgc2VtaS1kZWFjdGl2YXRlZCAoaXQgd2lsbCBpZ25vcmUgaW5jb21pbmcgY2FsbGJhY2tzLCBldGMpLlxuICAgICAgc2VsZi5fZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMoKTtcblxuICAgICAgLy8gRGVmZXIgY2FsbGluZyB0aGUgY2xvc2UgY2FsbGJhY2tzLCBzbyB0aGF0IHRoZSBjYWxsZXIgY2xvc2luZ1xuICAgICAgLy8gdGhlIHNlc3Npb24gaXNuJ3Qgd2FpdGluZyBmb3IgYWxsIHRoZSBjYWxsYmFja3MgdG8gY29tcGxldGUuXG4gICAgICBfLmVhY2goc2VsZi5fY2xvc2VDYWxsYmFja3MsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBVbnJlZ2lzdGVyIHRoZSBzZXNzaW9uLlxuICAgIHNlbGYuc2VydmVyLl9yZW1vdmVTZXNzaW9uKHNlbGYpO1xuICB9LFxuXG4gIC8vIFNlbmQgYSBtZXNzYWdlIChkb2luZyBub3RoaW5nIGlmIG5vIHNvY2tldCBpcyBjb25uZWN0ZWQgcmlnaHQgbm93LilcbiAgLy8gSXQgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QgKGl0IHdpbGwgYmUgc3RyaW5naWZpZWQuKVxuICBzZW5kOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLnNvY2tldCkge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRTZW50RERQKVxuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiU2VudCBERFBcIiwgRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICAgIHNlbGYuc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUChtc2cpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU2VuZCBhIGNvbm5lY3Rpb24gZXJyb3IuXG4gIHNlbmRFcnJvcjogZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgbXNnLm9mZmVuZGluZ01lc3NhZ2UgPSBvZmZlbmRpbmdNZXNzYWdlO1xuICAgIHNlbGYuc2VuZChtc2cpO1xuICB9LFxuXG4gIC8vIFByb2Nlc3MgJ21zZycgYXMgYW4gaW5jb21pbmcgbWVzc2FnZS4gKEJ1dCBhcyBhIGd1YXJkIGFnYWluc3RcbiAgLy8gcmFjZSBjb25kaXRpb25zIGR1cmluZyByZWNvbm5lY3Rpb24sIGlnbm9yZSB0aGUgbWVzc2FnZSBpZlxuICAvLyAnc29ja2V0JyBpcyBub3QgdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgc29ja2V0LilcbiAgLy9cbiAgLy8gV2UgcnVuIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgb25lIGF0IGEgdGltZSwgaW4gdGhlIG9yZGVyXG4gIC8vIGdpdmVuIGJ5IHRoZSBjbGllbnQuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaXMgcGFzc2VkIGFuIGlkZW1wb3RlbnRcbiAgLy8gZnVuY3Rpb24gJ3VuYmxvY2snIHdoaWNoIGl0IG1heSBjYWxsIHRvIGFsbG93IG90aGVyIG1lc3NhZ2VzIHRvXG4gIC8vIGJlZ2luIHJ1bm5pbmcgaW4gcGFyYWxsZWwgaW4gYW5vdGhlciBmaWJlciAoZm9yIGV4YW1wbGUsIGEgbWV0aG9kXG4gIC8vIHRoYXQgd2FudHMgdG8geWllbGQuKSBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkgdW5ibG9ja2VkXG4gIC8vIHdoZW4gaXQgcmV0dXJucy5cbiAgLy9cbiAgLy8gQWN0dWFsbHksIHdlIGRvbid0IGhhdmUgdG8gJ3RvdGFsbHkgb3JkZXInIHRoZSBtZXNzYWdlcyBpbiB0aGlzXG4gIC8vIHdheSwgYnV0IGl0J3MgdGhlIGVhc2llc3QgdGhpbmcgdGhhdCdzIGNvcnJlY3QuICh1bnN1YiBuZWVkcyB0b1xuICAvLyBiZSBvcmRlcmVkIGFnYWluc3Qgc3ViLCBtZXRob2RzIG5lZWQgdG8gYmUgb3JkZXJlZCBhZ2FpbnN0IGVhY2hcbiAgLy8gb3RoZXIuKVxuICBwcm9jZXNzTWVzc2FnZTogZnVuY3Rpb24gKG1zZ19pbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoIXNlbGYuaW5RdWV1ZSkgLy8gd2UgaGF2ZSBiZWVuIGRlc3Ryb3llZC5cbiAgICAgIHJldHVybjtcblxuICAgIC8vIFJlc3BvbmQgdG8gcGluZyBhbmQgcG9uZyBtZXNzYWdlcyBpbW1lZGlhdGVseSB3aXRob3V0IHF1ZXVpbmcuXG4gICAgLy8gSWYgdGhlIG5lZ290aWF0ZWQgRERQIHZlcnNpb24gaXMgXCJwcmUxXCIgd2hpY2ggZGlkbid0IHN1cHBvcnRcbiAgICAvLyBwaW5ncywgcHJlc2VydmUgdGhlIFwicHJlMVwiIGJlaGF2aW9yIG9mIHJlc3BvbmRpbmcgd2l0aCBhIFwiYmFkXG4gICAgLy8gcmVxdWVzdFwiIGZvciB0aGUgdW5rbm93biBtZXNzYWdlcy5cbiAgICAvL1xuICAgIC8vIEZpYmVycyBhcmUgbmVlZGVkIGJlY2F1c2UgaGVhcnRiZWF0IHVzZXMgTWV0ZW9yLnNldFRpbWVvdXQsIHdoaWNoXG4gICAgLy8gbmVlZHMgYSBGaWJlci4gV2UgY291bGQgYWN0dWFsbHkgdXNlIHJlZ3VsYXIgc2V0VGltZW91dCBhbmQgYXZvaWRcbiAgICAvLyB0aGVzZSBuZXcgZmliZXJzLCBidXQgaXQgaXMgZWFzaWVyIHRvIGp1c3QgbWFrZSBldmVyeXRoaW5nIHVzZVxuICAgIC8vIE1ldGVvci5zZXRUaW1lb3V0IGFuZCBub3QgdGhpbmsgdG9vIGhhcmQuXG4gICAgLy9cbiAgICAvLyBBbnkgbWVzc2FnZSBjb3VudHMgYXMgcmVjZWl2aW5nIGEgcG9uZywgYXMgaXQgZGVtb25zdHJhdGVzIHRoYXRcbiAgICAvLyB0aGUgY2xpZW50IGlzIHN0aWxsIGFsaXZlLlxuICAgIGlmIChzZWxmLmhlYXJ0YmVhdCkge1xuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmhlYXJ0YmVhdC5tZXNzYWdlUmVjZWl2ZWQoKTtcbiAgICAgIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncGluZycpIHtcbiAgICAgIGlmIChzZWxmLl9yZXNwb25kVG9QaW5ncylcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6IFwicG9uZ1wiLCBpZDogbXNnX2luLmlkfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxmLnZlcnNpb24gIT09ICdwcmUxJyAmJiBtc2dfaW4ubXNnID09PSAncG9uZycpIHtcbiAgICAgIC8vIFNpbmNlIGV2ZXJ5dGhpbmcgaXMgYSBwb25nLCBub3RoaW5nIHRvIGRvXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pblF1ZXVlLnB1c2gobXNnX2luKTtcbiAgICBpZiAoc2VsZi53b3JrZXJSdW5uaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIHNlbGYud29ya2VyUnVubmluZyA9IHRydWU7XG5cbiAgICB2YXIgcHJvY2Vzc05leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbXNnID0gc2VsZi5pblF1ZXVlICYmIHNlbGYuaW5RdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKCFtc2cpIHtcbiAgICAgICAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFibG9ja2VkKVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBpZGVtcG90ZW50XG4gICAgICAgICAgYmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHByb2Nlc3NOZXh0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VsZi5zZXJ2ZXIub25NZXNzYWdlSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKG1zZywgc2VsZik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfLmhhcyhzZWxmLnByb3RvY29sX2hhbmRsZXJzLCBtc2cubXNnKSlcbiAgICAgICAgICBzZWxmLnByb3RvY29sX2hhbmRsZXJzW21zZy5tc2ddLmNhbGwoc2VsZiwgbXNnLCB1bmJsb2NrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHNlbGYuc2VuZEVycm9yKCdCYWQgcmVxdWVzdCcsIG1zZyk7XG4gICAgICAgIHVuYmxvY2soKTsgLy8gaW4gY2FzZSB0aGUgaGFuZGxlciBkaWRuJ3QgYWxyZWFkeSBkbyBpdFxuICAgICAgfSkucnVuKCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3NOZXh0KCk7XG4gIH0sXG5cbiAgcHJvdG9jb2xfaGFuZGxlcnM6IHtcbiAgICBzdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm5hbWUpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkpIHtcbiAgICAgICAgc2VsZi5zZW5kRXJyb3IoXCJNYWxmb3JtZWQgc3Vic2NyaXB0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXSkge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ25vc3ViJywgaWQ6IG1zZy5pZCxcbiAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcig0MDQsIGBTdWJzY3JpcHRpb24gJyR7bXNnLm5hbWV9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9uYW1lZFN1YnMuaGFzKG1zZy5pZCkpXG4gICAgICAgIC8vIHN1YnMgYXJlIGlkZW1wb3RlbnQsIG9yIHJhdGhlciwgdGhleSBhcmUgaWdub3JlZCBpZiBhIHN1YlxuICAgICAgICAvLyB3aXRoIHRoYXQgaWQgYWxyZWFkeSBleGlzdHMuIHRoaXMgaXMgaW1wb3J0YW50IGR1cmluZ1xuICAgICAgICAvLyByZWNvbm5lY3QuXG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gWFhYIEl0J2QgYmUgbXVjaCBiZXR0ZXIgaWYgd2UgaGFkIGdlbmVyaWMgaG9va3Mgd2hlcmUgYW55IHBhY2thZ2UgY2FuXG4gICAgICAvLyBob29rIGludG8gc3Vic2NyaXB0aW9uIGhhbmRsaW5nLCBidXQgaW4gdGhlIG1lYW4gd2hpbGUgd2Ugc3BlY2lhbCBjYXNlXG4gICAgICAvLyBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UuIFRoaXMgaXMgYWxzbyBkb25lIGZvciB3ZWFrIHJlcXVpcmVtZW50cyB0b1xuICAgICAgLy8gYWRkIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlIEFjY291bnRzLiBBXG4gICAgICAvLyB1c2VyIHRyeWluZyB0byB1c2UgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgbXVzdCBleHBsaWNpdGx5IHJlcXVpcmUgaXQuXG4gICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgIHZhciBERFBSYXRlTGltaXRlciA9IFBhY2thZ2VbJ2RkcC1yYXRlLWxpbWl0ZXInXS5ERFBSYXRlTGltaXRlcjtcbiAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICBjbGllbnRBZGRyZXNzOiBzZWxmLmNvbm5lY3Rpb25IYW5kbGUuY2xpZW50QWRkcmVzcyxcbiAgICAgICAgICB0eXBlOiBcInN1YnNjcmlwdGlvblwiLFxuICAgICAgICAgIG5hbWU6IG1zZy5uYW1lLFxuICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIHZhciByYXRlTGltaXRSZXN1bHQgPSBERFBSYXRlTGltaXRlci5fY2hlY2socmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgICd0b28tbWFueS1yZXF1ZXN0cycsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVyID0gc2VsZi5zZXJ2ZXIucHVibGlzaF9oYW5kbGVyc1ttc2cubmFtZV07XG5cbiAgICAgIHNlbGYuX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIsIG1zZy5pZCwgbXNnLnBhcmFtcywgbXNnLm5hbWUpO1xuXG4gICAgfSxcblxuICAgIHVuc3ViOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHNlbGYuX3N0b3BTdWJzY3JpcHRpb24obXNnLmlkKTtcbiAgICB9LFxuXG4gICAgbWV0aG9kOiBmdW5jdGlvbiAobXNnLCB1bmJsb2NrKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIHJlamVjdCBtYWxmb3JtZWQgbWVzc2FnZXNcbiAgICAgIC8vIEZvciBub3csIHdlIHNpbGVudGx5IGlnbm9yZSB1bmtub3duIGF0dHJpYnV0ZXMsXG4gICAgICAvLyBmb3IgZm9yd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgIGlmICh0eXBlb2YgKG1zZy5pZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICB0eXBlb2YgKG1zZy5tZXRob2QpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgKCgncGFyYW1zJyBpbiBtc2cpICYmICEobXNnLnBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSkgfHxcbiAgICAgICAgICAoKCdyYW5kb21TZWVkJyBpbiBtc2cpICYmICh0eXBlb2YgbXNnLnJhbmRvbVNlZWQgIT09IFwic3RyaW5nXCIpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBtZXRob2QgaW52b2NhdGlvblwiLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByYW5kb21TZWVkID0gbXNnLnJhbmRvbVNlZWQgfHwgbnVsbDtcblxuICAgICAgLy8gc2V0IHVwIHRvIG1hcmsgdGhlIG1ldGhvZCBhcyBzYXRpc2ZpZWQgb25jZSBhbGwgb2JzZXJ2ZXJzXG4gICAgICAvLyAoYW5kIHN1YnNjcmlwdGlvbnMpIGhhdmUgcmVhY3RlZCB0byBhbnkgd3JpdGVzIHRoYXQgd2VyZVxuICAgICAgLy8gZG9uZS5cbiAgICAgIHZhciBmZW5jZSA9IG5ldyBERFBTZXJ2ZXIuX1dyaXRlRmVuY2U7XG4gICAgICBmZW5jZS5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJldGlyZSB0aGUgZmVuY2Ugc28gdGhhdCBmdXR1cmUgd3JpdGVzIGFyZSBhbGxvd2VkLlxuICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgY2FsbGJhY2tzIGxpa2UgdGltZXJzIGFyZSBmcmVlIHRvIHVzZVxuICAgICAgICAvLyB0aGUgZmVuY2UsIGFuZCBpZiB0aGV5IGZpcmUgYmVmb3JlIGl0J3MgYXJtZWQgKGZvclxuICAgICAgICAvLyBleGFtcGxlLCBiZWNhdXNlIHRoZSBtZXRob2Qgd2FpdHMgZm9yIHRoZW0pIHRoZWlyXG4gICAgICAgIC8vIHdyaXRlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmZW5jZS5cbiAgICAgICAgZmVuY2UucmV0aXJlKCk7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAndXBkYXRlZCcsIG1ldGhvZHM6IFttc2cuaWRdfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZmluZCB0aGUgaGFuZGxlclxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5tZXRob2RfaGFuZGxlcnNbbXNnLm1ldGhvZF07XG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICdyZXN1bHQnLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHttc2cubWV0aG9kfScgbm90IGZvdW5kYCl9KTtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBzZWxmLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgICAgaXNTaW11bGF0aW9uOiBmYWxzZSxcbiAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgc2V0VXNlcklkOiBzZXRVc2VySWQsXG4gICAgICAgIHVuYmxvY2s6IHVuYmxvY2ssXG4gICAgICAgIGNvbm5lY3Rpb246IHNlbGYuY29ubmVjdGlvbkhhbmRsZSxcbiAgICAgICAgcmFuZG9tU2VlZDogcmFuZG9tU2VlZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIFhYWCBJdCdkIGJlIGJldHRlciBpZiB3ZSBjb3VsZCBob29rIGludG8gbWV0aG9kIGhhbmRsZXJzIGJldHRlciBidXRcbiAgICAgICAgLy8gZm9yIG5vdywgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGRwLXJhdGUtbGltaXRlciBleGlzdHMgc2luY2Ugd2VcbiAgICAgICAgLy8gaGF2ZSBhIHdlYWsgcmVxdWlyZW1lbnQgZm9yIHRoZSBkZHAtcmF0ZS1saW1pdGVyIHBhY2thZ2UgdG8gYmUgYWRkZWRcbiAgICAgICAgLy8gdG8gb3VyIGFwcGxpY2F0aW9uLlxuICAgICAgICBpZiAoUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddKSB7XG4gICAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICAgIHZhciByYXRlTGltaXRlcklucHV0ID0ge1xuICAgICAgICAgICAgdXNlcklkOiBzZWxmLnVzZXJJZCxcbiAgICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgdHlwZTogXCJtZXRob2RcIixcbiAgICAgICAgICAgIG5hbWU6IG1zZy5tZXRob2QsXG4gICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHNlbGYuaWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIEREUFJhdGVMaW1pdGVyLl9pbmNyZW1lbnQocmF0ZUxpbWl0ZXJJbnB1dCk7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KVxuICAgICAgICAgIGlmICghcmF0ZUxpbWl0UmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgTWV0ZW9yLkVycm9yKFxuICAgICAgICAgICAgICBcInRvby1tYW55LXJlcXVlc3RzXCIsXG4gICAgICAgICAgICAgIEREUFJhdGVMaW1pdGVyLmdldEVycm9yTWVzc2FnZShyYXRlTGltaXRSZXN1bHQpLFxuICAgICAgICAgICAgICB7dGltZVRvUmVzZXQ6IHJhdGVMaW1pdFJlc3VsdC50aW1lVG9SZXNldH1cbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS53aXRoVmFsdWUoXG4gICAgICAgICAgZmVuY2UsXG4gICAgICAgICAgKCkgPT4gRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgICAgICBoYW5kbGVyLCBpbnZvY2F0aW9uLCBtc2cucGFyYW1zLFxuICAgICAgICAgICAgICBcImNhbGwgdG8gJ1wiICsgbXNnLm1ldGhvZCArIFwiJ1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICAgIGZlbmNlLmFybSgpO1xuICAgICAgICB1bmJsb2NrKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIG1zZzogXCJyZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZFxuICAgICAgfTtcblxuICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBheWxvYWQucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIHBheWxvYWQuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgICAgZXhjZXB0aW9uLFxuICAgICAgICAgIGB3aGlsZSBpbnZva2luZyBtZXRob2QgJyR7bXNnLm1ldGhvZH0nYFxuICAgICAgICApO1xuICAgICAgICBzZWxmLnNlbmQocGF5bG9hZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2VhY2hTdWI6IGZ1bmN0aW9uIChmKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGYpO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMuZm9yRWFjaChmKTtcbiAgfSxcblxuICBfZGlmZkNvbGxlY3Rpb25WaWV3czogZnVuY3Rpb24gKGJlZm9yZUNWcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk1hcHMoYmVmb3JlQ1ZzLCBzZWxmLmNvbGxlY3Rpb25WaWV3cywge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kaWZmKGxlZnRWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgcmlnaHRWYWx1ZS5kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9jVmlldywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRBZGRlZChjb2xsZWN0aW9uTmFtZSwgaWQsIGRvY1ZpZXcuZ2V0RmllbGRzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBsZWZ0T25seTogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBsZWZ0VmFsdWUpIHtcbiAgICAgICAgbGVmdFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MsIGlkKSB7XG4gICAgICAgICAgc2VsZi5zZW5kUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICAvLyBTZXRzIHRoZSBjdXJyZW50IHVzZXIgaWQgaW4gYWxsIGFwcHJvcHJpYXRlIGNvbnRleHRzIGFuZCByZXJ1bnNcbiAgLy8gYWxsIHN1YnNjcmlwdGlvbnNcbiAgX3NldFVzZXJJZDogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHVzZXJJZCAhPT0gbnVsbCAmJiB0eXBlb2YgdXNlcklkICE9PSBcInN0cmluZ1wiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VXNlcklkIG11c3QgYmUgY2FsbGVkIG9uIHN0cmluZyBvciBudWxsLCBub3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB1c2VySWQpO1xuXG4gICAgLy8gUHJldmVudCBuZXdseS1jcmVhdGVkIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zIGZyb20gYmVpbmcgYWRkZWQgdG8gb3VyXG4gICAgLy8gc2Vzc2lvbjsgdGhleSB3aWxsIGJlIGZvdW5kIGJlbG93IHdoZW4gd2UgY2FsbCBzdGFydFVuaXZlcnNhbFN1YnMuXG4gICAgLy9cbiAgICAvLyAoV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBuYW1lZCBzdWJzY3JpcHRpb25zLCBiZWNhdXNlIHdlIG9ubHkgYWRkXG4gICAgLy8gdGhlbSB3aGVuIHdlIHByb2Nlc3MgYSAnc3ViJyBtZXNzYWdlLiBXZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYVxuICAgIC8vICdtZXRob2QnIG1lc3NhZ2UsIGFuZCB0aGUgbWV0aG9kIGRpZCBub3QgdW5ibG9jaywgYmVjYXVzZSBpdCBpcyBpbGxlZ2FsXG4gICAgLy8gdG8gY2FsbCBzZXRVc2VySWQgYWZ0ZXIgdW5ibG9jay4gVGh1cyB3ZSBjYW5ub3QgYmUgY29uY3VycmVudGx5IGFkZGluZyBhXG4gICAgLy8gbmV3IG5hbWVkIHN1YnNjcmlwdGlvbi4pXG4gICAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IHRydWU7XG5cbiAgICAvLyBQcmV2ZW50IGN1cnJlbnQgc3VicyBmcm9tIHVwZGF0aW5nIG91ciBjb2xsZWN0aW9uVmlld3MgYW5kIGNhbGwgdGhlaXJcbiAgICAvLyBzdG9wIGNhbGxiYWNrcy4gVGhpcyBtYXkgeWllbGQuXG4gICAgc2VsZi5fZWFjaFN1YihmdW5jdGlvbiAoc3ViKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEFsbCBzdWJzIHNob3VsZCBub3cgYmUgZGVhY3RpdmF0ZWQuIFN0b3Agc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgY2xpZW50LFxuICAgIC8vIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBwdWJsaXNoZWQgY29sbGVjdGlvbnMsIHJlc2V0IHRvIGFuIGVtcHR5IHZpZXcsIGFuZFxuICAgIC8vIHVwZGF0ZSB0aGUgdXNlcklkLlxuICAgIHNlbGYuX2lzU2VuZGluZyA9IGZhbHNlO1xuICAgIHZhciBiZWZvcmVDVnMgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cztcbiAgICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcbiAgICBzZWxmLnVzZXJJZCA9IHVzZXJJZDtcblxuICAgIC8vIF9zZXRVc2VySWQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gYSBNZXRlb3IgbWV0aG9kIHdpdGhcbiAgICAvLyBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uIHNldC4gQnV0IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gaXMgbm90XG4gICAgLy8gZXhwZWN0ZWQgdG8gYmUgc2V0IGluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24sIHNvIHdlIHRlbXBvcmFyeSB1bnNldCBpdC5cbiAgICAvLyBJbnNpZGUgYSBwdWJsaXNoIGZ1bmN0aW9uIEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiBpcyBzZXQuXG4gICAgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbi53aXRoVmFsdWUodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTYXZlIHRoZSBvbGQgbmFtZWQgc3VicywgYW5kIHJlc2V0IHRvIGhhdmluZyBubyBzdWJzY3JpcHRpb25zLlxuICAgICAgdmFyIG9sZE5hbWVkU3VicyA9IHNlbGYuX25hbWVkU3VicztcbiAgICAgIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcblxuICAgICAgb2xkTmFtZWRTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yiwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgdmFyIG5ld1N1YiA9IHN1Yi5fcmVjcmVhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLnNldChzdWJzY3JpcHRpb25JZCwgbmV3U3ViKTtcbiAgICAgICAgLy8gbmI6IGlmIHRoZSBoYW5kbGVyIHRocm93cyBvciBjYWxscyB0aGlzLmVycm9yKCksIGl0IHdpbGwgaW4gZmFjdFxuICAgICAgICAvLyBpbW1lZGlhdGVseSBzZW5kIGl0cyAnbm9zdWInLiBUaGlzIGlzIE9LLCB0aG91Z2guXG4gICAgICAgIG5ld1N1Yi5fcnVuSGFuZGxlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnMgdG8gYmUgc3RhcnRlZCBvbiBvdXIgY29ubmVjdGlvbiBpblxuICAgICAgLy8gcGFyYWxsZWwgd2l0aCB0aGUgb25lcyB3ZSdyZSBzcGlubmluZyB1cCBoZXJlLCBhbmQgc3BpbiB1cCB1bml2ZXJzYWxcbiAgICAgIC8vIHN1YnMuXG4gICAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gZmFsc2U7XG4gICAgICBzZWxmLnN0YXJ0VW5pdmVyc2FsU3VicygpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgc2VuZGluZyBtZXNzYWdlcyBhZ2FpbiwgYmVnaW5uaW5nIHdpdGggdGhlIGRpZmYgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAvLyBzdGF0ZSBvZiB0aGUgd29ybGQgdG8gdGhlIGN1cnJlbnQgc3RhdGUuIE5vIHlpZWxkcyBhcmUgYWxsb3dlZCBkdXJpbmdcbiAgICAvLyB0aGlzIGRpZmYsIHNvIHRoYXQgb3RoZXIgY2hhbmdlcyBjYW5ub3QgaW50ZXJsZWF2ZS5cbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9pc1NlbmRpbmcgPSB0cnVlO1xuICAgICAgc2VsZi5fZGlmZkNvbGxlY3Rpb25WaWV3cyhiZWZvcmVDVnMpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoc2VsZi5fcGVuZGluZ1JlYWR5KSkge1xuICAgICAgICBzZWxmLnNlbmRSZWFkeShzZWxmLl9wZW5kaW5nUmVhZHkpO1xuICAgICAgICBzZWxmLl9wZW5kaW5nUmVhZHkgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBfc3RhcnRTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLCBoYW5kbGVyLCBzdWJJZCwgcGFyYW1zLCBuYW1lKTtcbiAgICBpZiAoc3ViSWQpXG4gICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YklkLCBzdWIpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMucHVzaChzdWIpO1xuXG4gICAgc3ViLl9ydW5IYW5kbGVyKCk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIHNwZWNpZmllZCBzdWJzY3JpcHRpb25cbiAgX3N0b3BTdWJzY3JpcHRpb246IGZ1bmN0aW9uIChzdWJJZCwgZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViTmFtZSA9IG51bGw7XG4gICAgaWYgKHN1YklkKSB7XG4gICAgICB2YXIgbWF5YmVTdWIgPSBzZWxmLl9uYW1lZFN1YnMuZ2V0KHN1YklkKTtcbiAgICAgIGlmIChtYXliZVN1Yikge1xuICAgICAgICBzdWJOYW1lID0gbWF5YmVTdWIuX25hbWU7XG4gICAgICAgIG1heWJlU3ViLl9yZW1vdmVBbGxEb2N1bWVudHMoKTtcbiAgICAgICAgbWF5YmVTdWIuX2RlYWN0aXZhdGUoKTtcbiAgICAgICAgc2VsZi5fbmFtZWRTdWJzLmRlbGV0ZShzdWJJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3BvbnNlID0ge21zZzogJ25vc3ViJywgaWQ6IHN1YklkfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgcmVzcG9uc2UuZXJyb3IgPSB3cmFwSW50ZXJuYWxFeGNlcHRpb24oXG4gICAgICAgIGVycm9yLFxuICAgICAgICBzdWJOYW1lID8gKFwiZnJvbSBzdWIgXCIgKyBzdWJOYW1lICsgXCIgaWQgXCIgKyBzdWJJZClcbiAgICAgICAgICA6IChcImZyb20gc3ViIGlkIFwiICsgc3ViSWQpKTtcbiAgICB9XG5cbiAgICBzZWxmLnNlbmQocmVzcG9uc2UpO1xuICB9LFxuXG4gIC8vIHRlYXIgZG93biBhbGwgc3Vic2NyaXB0aW9ucy4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1Qgc2VuZCByZW1vdmVkIG9yIG5vc3ViXG4gIC8vIG1lc3NhZ2VzLCBzaW5jZSB3ZSBhc3N1bWUgdGhlIGNsaWVudCBpcyBnb25lLlxuICBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLl9uYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBpZCkge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuXG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuICAgIHNlbGYuX3VuaXZlcnNhbFN1YnMgPSBbXTtcbiAgfSxcblxuICAvLyBEZXRlcm1pbmUgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzLCBiYXNlZCBvbiB0aGVcbiAgLy8gSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVwcmVzZW50aW5nIGhvdyBtYW55XG4gIC8vIHByb3hpZXMgdGhlIHNlcnZlciBpcyBiZWhpbmQuXG4gIF9jbGllbnRBZGRyZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRm9yIHRoZSByZXBvcnRlZCBjbGllbnQgYWRkcmVzcyBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGNvcnJlY3QsXG4gICAgLy8gdGhlIGRldmVsb3BlciBtdXN0IHNldCB0aGUgSFRUUF9GT1JXQVJERURfQ09VTlQgZW52aXJvbm1lbnRcbiAgICAvLyB2YXJpYWJsZSB0byBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGhvcHMgdGhleVxuICAgIC8vIGV4cGVjdCBpbiB0aGUgYHgtZm9yd2FyZGVkLWZvcmAgaGVhZGVyLiBFLmcuLCBzZXQgdG8gXCIxXCIgaWYgdGhlXG4gICAgLy8gc2VydmVyIGlzIGJlaGluZCBvbmUgcHJveHkuXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvdWxkIGJlIGNvbXB1dGVkIG9uY2UgYXQgc3RhcnR1cCBpbnN0ZWFkIG9mIGV2ZXJ5IHRpbWUuXG4gICAgdmFyIGh0dHBGb3J3YXJkZWRDb3VudCA9IHBhcnNlSW50KHByb2Nlc3MuZW52WydIVFRQX0ZPUldBUkRFRF9DT1VOVCddKSB8fCAwO1xuXG4gICAgaWYgKGh0dHBGb3J3YXJkZWRDb3VudCA9PT0gMClcbiAgICAgIHJldHVybiBzZWxmLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuXG4gICAgdmFyIGZvcndhcmRlZEZvciA9IHNlbGYuc29ja2V0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1mb3JcIl07XG4gICAgaWYgKCEgXy5pc1N0cmluZyhmb3J3YXJkZWRGb3IpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgZm9yd2FyZGVkRm9yID0gZm9yd2FyZGVkRm9yLnRyaW0oKS5zcGxpdCgvXFxzKixcXHMqLyk7XG5cbiAgICAvLyBUeXBpY2FsbHkgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIgaXNcbiAgICAvLyB0aGUgb3JpZ2luYWwgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50IGNvbm5lY3RpbmcgdG8gdGhlIGZpcnN0XG4gICAgLy8gcHJveHkuICBIb3dldmVyLCB0aGUgZW5kIHVzZXIgY2FuIGVhc2lseSBzcG9vZiB0aGUgaGVhZGVyLCBpblxuICAgIC8vIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHZhbHVlKHMpIHdpbGwgYmUgdGhlIGZha2UgSVAgYWRkcmVzcyBmcm9tXG4gICAgLy8gdGhlIHVzZXIgcHJldGVuZGluZyB0byBiZSBhIHByb3h5IHJlcG9ydGluZyB0aGUgb3JpZ2luYWwgSVBcbiAgICAvLyBhZGRyZXNzIHZhbHVlLiAgQnkgY291bnRpbmcgSFRUUF9GT1JXQVJERURfQ09VTlQgYmFjayBmcm9tIHRoZVxuICAgIC8vIGVuZCBvZiB0aGUgbGlzdCwgd2UgZW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBJUCBhZGRyZXNzIGJlaW5nXG4gICAgLy8gcmVwb3J0ZWQgYnkgKm91ciogZmlyc3QgcHJveHkuXG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50IDwgMCB8fCBodHRwRm9yd2FyZGVkQ291bnQgPiBmb3J3YXJkZWRGb3IubGVuZ3RoKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZm9yd2FyZGVkRm9yW2ZvcndhcmRlZEZvci5sZW5ndGggLSBodHRwRm9yd2FyZGVkQ291bnRdO1xuICB9XG59KTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIFN1YnNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBjdG9yIGZvciBhIHN1YiBoYW5kbGU6IHRoZSBpbnB1dCB0byBlYWNoIHB1Ymxpc2ggZnVuY3Rpb25cblxuLy8gSW5zdGFuY2UgbmFtZSBpcyB0aGlzIGJlY2F1c2UgaXQncyB1c3VhbGx5IHJlZmVycmVkIHRvIGFzIHRoaXMgaW5zaWRlIGFcbi8vIHB1Ymxpc2hcbi8qKlxuICogQHN1bW1hcnkgVGhlIHNlcnZlcidzIHNpZGUgb2YgYSBzdWJzY3JpcHRpb25cbiAqIEBjbGFzcyBTdWJzY3JpcHRpb25cbiAqIEBpbnN0YW5jZU5hbWUgdGhpc1xuICogQHNob3dJbnN0YW5jZU5hbWUgdHJ1ZVxuICovXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKFxuICAgIHNlc3Npb24sIGhhbmRsZXIsIHN1YnNjcmlwdGlvbklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLl9zZXNzaW9uID0gc2Vzc2lvbjsgLy8gdHlwZSBpcyBTZXNzaW9uXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFjY2VzcyBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uIFRoZSBpbmNvbWluZyBbY29ubmVjdGlvbl0oI21ldGVvcl9vbmNvbm5lY3Rpb24pIGZvciB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbmFtZSAgY29ubmVjdGlvblxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi5jb25uZWN0aW9uID0gc2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlOyAvLyBwdWJsaWMgQVBJIG9iamVjdFxuXG4gIHNlbGYuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXG4gIC8vIG15IHN1YnNjcmlwdGlvbiBJRCAoZ2VuZXJhdGVkIGJ5IGNsaWVudCwgdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3VicykuXG4gIHNlbGYuX3N1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7XG4gIC8vIHVuZGVmaW5lZCBmb3IgdW5pdmVyc2FsIHN1YnNcbiAgc2VsZi5fbmFtZSA9IG5hbWU7XG5cbiAgc2VsZi5fcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuXG4gIC8vIE9ubHkgbmFtZWQgc3Vic2NyaXB0aW9ucyBoYXZlIElEcywgYnV0IHdlIG5lZWQgc29tZSBzb3J0IG9mIHN0cmluZ1xuICAvLyBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIHN1YnNjcmlwdGlvbnMgaW5zaWRlXG4gIC8vIFNlc3Npb25Eb2N1bWVudFZpZXdzLiBXZSB1c2UgdGhpcyBzdWJzY3JpcHRpb25IYW5kbGUgZm9yIHRoYXQuXG4gIGlmIChzZWxmLl9zdWJzY3JpcHRpb25JZCkge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdOJyArIHNlbGYuX3N1YnNjcmlwdGlvbklkO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSA9ICdVJyArIFJhbmRvbS5pZCgpO1xuICB9XG5cbiAgLy8gaGFzIF9kZWFjdGl2YXRlIGJlZW4gY2FsbGVkP1xuICBzZWxmLl9kZWFjdGl2YXRlZCA9IGZhbHNlO1xuXG4gIC8vIHN0b3AgY2FsbGJhY2tzIHRvIGcvYyB0aGlzIHN1Yi4gIGNhbGxlZCB3LyB6ZXJvIGFyZ3VtZW50cy5cbiAgc2VsZi5fc3RvcENhbGxiYWNrcyA9IFtdO1xuXG4gIC8vIHRoZSBzZXQgb2YgKGNvbGxlY3Rpb24sIGRvY3VtZW50aWQpIHRoYXQgdGhpcyBzdWJzY3JpcHRpb24gaGFzXG4gIC8vIGFuIG9waW5pb24gYWJvdXRcbiAgc2VsZi5fZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuXG4gIC8vIHJlbWVtYmVyIGlmIHdlIGFyZSByZWFkeS5cbiAgc2VsZi5fcmVhZHkgPSBmYWxzZTtcblxuICAvLyBQYXJ0IG9mIHRoZSBwdWJsaWMgQVBJOiB0aGUgdXNlciBvZiB0aGlzIHN1Yi5cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGlkIG9mIHRoZSBsb2dnZWQtaW4gdXNlciwgb3IgYG51bGxgIGlmIG5vIHVzZXIgaXMgbG9nZ2VkIGluLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQG5hbWUgIHVzZXJJZFxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHNlbGYudXNlcklkID0gc2Vzc2lvbi51c2VySWQ7XG5cbiAgLy8gRm9yIG5vdywgdGhlIGlkIGZpbHRlciBpcyBnb2luZyB0byBkZWZhdWx0IHRvXG4gIC8vIHRoZSB0by9mcm9tIEREUCBtZXRob2RzIG9uIE1vbmdvSUQsIHRvXG4gIC8vIHNwZWNpZmljYWxseSBkZWFsIHdpdGggbW9uZ28vbWluaW1vbmdvIE9iamVjdElkcy5cblxuICAvLyBMYXRlciwgeW91IHdpbGwgYmUgYWJsZSB0byBtYWtlIHRoaXMgYmUgXCJyYXdcIlxuICAvLyBpZiB5b3Ugd2FudCB0byBwdWJsaXNoIGEgY29sbGVjdGlvbiB0aGF0IHlvdSBrbm93XG4gIC8vIGp1c3QgaGFzIHN0cmluZ3MgZm9yIGtleXMgYW5kIG5vIGZ1bm55IGJ1c2luZXNzLCB0b1xuICAvLyBhIGRkcCBjb25zdW1lciB0aGF0IGlzbid0IG1pbmltb25nb1xuXG4gIHNlbGYuX2lkRmlsdGVyID0ge1xuICAgIGlkU3RyaW5naWZ5OiBNb25nb0lELmlkU3RyaW5naWZ5LFxuICAgIGlkUGFyc2U6IE1vbmdvSUQuaWRQYXJzZVxuICB9O1xuXG4gIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAxKTtcbn07XG5cbl8uZXh0ZW5kKFN1YnNjcmlwdGlvbi5wcm90b3R5cGUsIHtcbiAgX3J1bkhhbmRsZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBYWFggc2hvdWxkIHdlIHVuYmxvY2soKSBoZXJlPyBFaXRoZXIgYmVmb3JlIHJ1bm5pbmcgdGhlIHB1Ymxpc2hcbiAgICAvLyBmdW5jdGlvbiwgb3IgYmVmb3JlIHJ1bm5pbmcgX3B1Ymxpc2hDdXJzb3IuXG4gICAgLy9cbiAgICAvLyBSaWdodCBub3csIGVhY2ggcHVibGlzaCBmdW5jdGlvbiBibG9ja3MgYWxsIGZ1dHVyZSBwdWJsaXNoZXMgYW5kXG4gICAgLy8gbWV0aG9kcyB3YWl0aW5nIG9uIGRhdGEgZnJvbSBNb25nbyAob3Igd2hhdGV2ZXIgZWxzZSB0aGUgZnVuY3Rpb25cbiAgICAvLyBibG9ja3Mgb24pLiBUaGlzIHByb2JhYmx5IHNsb3dzIHBhZ2UgbG9hZCBpbiBjb21tb24gY2FzZXMuXG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBzZWxmLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgc2VsZi5faGFuZGxlciwgc2VsZiwgRUpTT04uY2xvbmUoc2VsZi5fcGFyYW1zKSxcbiAgICAgICAgICAvLyBJdCdzIE9LIHRoYXQgdGhpcyB3b3VsZCBsb29rIHdlaXJkIGZvciB1bml2ZXJzYWwgc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgaGF2ZSBubyBhcmd1bWVudHMgc28gdGhlcmUgY2FuIG5ldmVyIGJlIGFuXG4gICAgICAgICAgLy8gYXVkaXQtYXJndW1lbnQtY2hlY2tzIGZhaWx1cmUuXG4gICAgICAgICAgXCJwdWJsaXNoZXIgJ1wiICsgc2VsZi5fbmFtZSArIFwiJ1wiXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaWQgdGhlIGhhbmRsZXIgY2FsbCB0aGlzLmVycm9yIG9yIHRoaXMuc3RvcD9cbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgc2VsZi5fcHVibGlzaEhhbmRsZXJSZXN1bHQocmVzKTtcbiAgfSxcblxuICBfcHVibGlzaEhhbmRsZXJSZXN1bHQ6IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAvLyBTUEVDSUFMIENBU0U6IEluc3RlYWQgb2Ygd3JpdGluZyB0aGVpciBvd24gY2FsbGJhY2tzIHRoYXQgaW52b2tlXG4gICAgLy8gdGhpcy5hZGRlZC9jaGFuZ2VkL3JlYWR5L2V0YywgdGhlIHVzZXIgY2FuIGp1c3QgcmV0dXJuIGEgY29sbGVjdGlvblxuICAgIC8vIGN1cnNvciBvciBhcnJheSBvZiBjdXJzb3JzIGZyb20gdGhlIHB1Ymxpc2ggZnVuY3Rpb247IHdlIGNhbGwgdGhlaXJcbiAgICAvLyBfcHVibGlzaEN1cnNvciBtZXRob2Qgd2hpY2ggc3RhcnRzIG9ic2VydmluZyB0aGUgY3Vyc29yIGFuZCBwdWJsaXNoZXMgdGhlXG4gICAgLy8gcmVzdWx0cy4gTm90ZSB0aGF0IF9wdWJsaXNoQ3Vyc29yIGRvZXMgTk9UIGNhbGwgcmVhZHkoKS5cbiAgICAvL1xuICAgIC8vIFhYWCBUaGlzIHVzZXMgYW4gdW5kb2N1bWVudGVkIGludGVyZmFjZSB3aGljaCBvbmx5IHRoZSBNb25nbyBjdXJzb3JcbiAgICAvLyBpbnRlcmZhY2UgcHVibGlzaGVzLiBTaG91bGQgd2UgbWFrZSB0aGlzIGludGVyZmFjZSBwdWJsaWMgYW5kIGVuY291cmFnZVxuICAgIC8vIHVzZXJzIHRvIGltcGxlbWVudCBpdCB0aGVtc2VsdmVzPyBBcmd1YWJseSwgaXQncyB1bm5lY2Vzc2FyeTsgdXNlcnMgY2FuXG4gICAgLy8gYWxyZWFkeSB3cml0ZSB0aGVpciBvd24gZnVuY3Rpb25zIGxpa2VcbiAgICAvLyAgIHZhciBwdWJsaXNoTXlSZWFjdGl2ZVRoaW5neSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgLy8gICAgIE1ldGVvci5wdWJsaXNoKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgICB2YXIgcmVhY3RpdmVUaGluZ3kgPSBoYW5kbGVyKCk7XG4gICAgLy8gICAgICAgcmVhY3RpdmVUaGluZ3kucHVibGlzaE1lKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgfTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXNDdXJzb3IgPSBmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMgJiYgYy5fcHVibGlzaEN1cnNvcjtcbiAgICB9O1xuICAgIGlmIChpc0N1cnNvcihyZXMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXMuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG9ubHkgcmV0dXJucyBhZnRlciB0aGUgaW5pdGlhbCBhZGRlZCBjYWxsYmFja3MgaGF2ZSBydW4uXG4gICAgICAvLyBtYXJrIHN1YnNjcmlwdGlvbiBhcyByZWFkeS5cbiAgICAgIHNlbGYucmVhZHkoKTtcbiAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShyZXMpKSB7XG4gICAgICAvLyBjaGVjayBhbGwgdGhlIGVsZW1lbnRzIGFyZSBjdXJzb3JzXG4gICAgICBpZiAoISBfLmFsbChyZXMsIGlzQ3Vyc29yKSkge1xuICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcIlB1Ymxpc2ggZnVuY3Rpb24gcmV0dXJuZWQgYW4gYXJyYXkgb2Ygbm9uLUN1cnNvcnNcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIGR1cGxpY2F0ZSBjb2xsZWN0aW9uIG5hbWVzXG4gICAgICAvLyBYWFggd2Ugc2hvdWxkIHN1cHBvcnQgb3ZlcmxhcHBpbmcgY3Vyc29ycywgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB0aGVcbiAgICAgIC8vIG1lcmdlIGJveCB0byBhbGxvdyBvdmVybGFwIHdpdGhpbiBhIHN1YnNjcmlwdGlvblxuICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lcyA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNvbGxlY3Rpb25OYW1lID0gcmVzW2ldLl9nZXRDb2xsZWN0aW9uTmFtZSgpO1xuICAgICAgICBpZiAoXy5oYXMoY29sbGVjdGlvbk5hbWVzLCBjb2xsZWN0aW9uTmFtZSkpIHtcbiAgICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBtdWx0aXBsZSBjdXJzb3JzIGZvciBjb2xsZWN0aW9uIFwiICtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbk5hbWUpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sbGVjdGlvbk5hbWVzW2NvbGxlY3Rpb25OYW1lXSA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBfLmVhY2gocmVzLCBmdW5jdGlvbiAoY3VyKSB7XG4gICAgICAgICAgY3VyLl9wdWJsaXNoQ3Vyc29yKHNlbGYpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAocmVzKSB7XG4gICAgICAvLyB0cnV0aHkgdmFsdWVzIG90aGVyIHRoYW4gY3Vyc29ycyBvciBhcnJheXMgYXJlIHByb2JhYmx5IGFcbiAgICAgIC8vIHVzZXIgbWlzdGFrZSAocG9zc2libGUgcmV0dXJuaW5nIGEgTW9uZ28gZG9jdW1lbnQgdmlhLCBzYXksXG4gICAgICAvLyBgY29sbC5maW5kT25lKClgKS5cbiAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiBjYW4gb25seSByZXR1cm4gYSBDdXJzb3Igb3IgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXCJhbiBhcnJheSBvZiBDdXJzb3JzXCIpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhpcyBjYWxscyBhbGwgc3RvcCBjYWxsYmFja3MgYW5kIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gdXBkYXRpbmcgYW55XG4gIC8vIFNlc3Npb25Db2xsZWN0aW9uVmlld3MgZnVydGhlci4gSXQncyB1c2VkIHdoZW4gdGhlIHVzZXIgdW5zdWJzY3JpYmVzIG9yXG4gIC8vIGRpc2Nvbm5lY3RzLCBhcyB3ZWxsIGFzIGR1cmluZyBzZXRVc2VySWQgcmUtcnVucy4gSXQgZG9lcyAqTk9UKiBzZW5kXG4gIC8vIHJlbW92ZWQgbWVzc2FnZXMgZm9yIHRoZSBwdWJsaXNoZWQgb2JqZWN0czsgaWYgdGhhdCBpcyBuZWNlc3NhcnksIGNhbGxcbiAgLy8gX3JlbW92ZUFsbERvY3VtZW50cyBmaXJzdC5cbiAgX2RlYWN0aXZhdGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5fZGVhY3RpdmF0ZWQpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fZGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgIHNlbGYuX2NhbGxTdG9wQ2FsbGJhY2tzKCk7XG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInN1YnNjcmlwdGlvbnNcIiwgLTEpO1xuICB9LFxuXG4gIF9jYWxsU3RvcENhbGxiYWNrczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyB0ZWxsIGxpc3RlbmVycywgc28gdGhleSBjYW4gY2xlYW4gdXBcbiAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5fc3RvcENhbGxiYWNrcztcbiAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG4gICAgXy5lYWNoKGNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNlbmQgcmVtb3ZlIG1lc3NhZ2VzIGZvciBldmVyeSBkb2N1bWVudC5cbiAgX3JlbW92ZUFsbERvY3VtZW50czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29sbGVjdGlvbkRvY3MsIGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgICAgIGNvbGxlY3Rpb25Eb2NzLmZvckVhY2goZnVuY3Rpb24gKHN0cklkKSB7XG4gICAgICAgICAgc2VsZi5yZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBzZWxmLl9pZEZpbHRlci5pZFBhcnNlKHN0cklkKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIG5ldyBTdWJzY3JpcHRpb24gZm9yIHRoZSBzYW1lIHNlc3Npb24gd2l0aCB0aGUgc2FtZVxuICAvLyBpbml0aWFsIGNyZWF0aW9uIHBhcmFtZXRlcnMuIFRoaXMgaXNuJ3QgYSBjbG9uZTogaXQgZG9lc24ndCBoYXZlXG4gIC8vIHRoZSBzYW1lIF9kb2N1bWVudHMgY2FjaGUsIHN0b3BwZWQgc3RhdGUgb3IgY2FsbGJhY2tzOyBtYXkgaGF2ZSBhXG4gIC8vIGRpZmZlcmVudCBfc3Vic2NyaXB0aW9uSGFuZGxlLCBhbmQgZ2V0cyBpdHMgdXNlcklkIGZyb20gdGhlXG4gIC8vIHNlc3Npb24sIG5vdCBmcm9tIHRoaXMgb2JqZWN0LlxuICBfcmVjcmVhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oXG4gICAgICBzZWxmLl9zZXNzaW9uLCBzZWxmLl9oYW5kbGVyLCBzZWxmLl9zdWJzY3JpcHRpb25JZCwgc2VsZi5fcGFyYW1zLFxuICAgICAgc2VsZi5fbmFtZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24sIHRyaWdnZXJpbmcgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblN0b3BgIGNhbGxiYWNrIHBhc3NlZCB0byBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS4gSWYgYGVycm9yYCBpcyBub3QgYSBbYE1ldGVvci5FcnJvcmBdKCNtZXRlb3JfZXJyb3IpLCBpdCB3aWxsIGJlIFtzYW5pdGl6ZWRdKCNtZXRlb3JfZXJyb3IpLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byBwYXNzIHRvIHRoZSBjbGllbnQuXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCwgZXJyb3IpO1xuICB9LFxuXG4gIC8vIE5vdGUgdGhhdCB3aGlsZSBvdXIgRERQIGNsaWVudCB3aWxsIG5vdGljZSB0aGF0IHlvdSd2ZSBjYWxsZWQgc3RvcCgpIG9uIHRoZVxuICAvLyBzZXJ2ZXIgKGFuZCBjbGVhbiB1cCBpdHMgX3N1YnNjcmlwdGlvbnMgdGFibGUpIHdlIGRvbid0IGFjdHVhbGx5IHByb3ZpZGUgYVxuICAvLyBtZWNoYW5pc20gZm9yIGFuIGFwcCB0byBub3RpY2UgdGhpcyAodGhlIHN1YnNjcmliZSBvbkVycm9yIGNhbGxiYWNrIG9ubHlcbiAgLy8gdHJpZ2dlcnMgaWYgdGhlcmUgaXMgYW4gZXJyb3IpLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIFN0b3BzIHRoaXMgY2xpZW50J3Mgc3Vic2NyaXB0aW9uIGFuZCBpbnZva2VzIHRoZSBjbGllbnQncyBgb25TdG9wYCBjYWxsYmFjayB3aXRoIG5vIGVycm9yLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqL1xuICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi5fc2Vzc2lvbi5fc3RvcFN1YnNjcmlwdGlvbihzZWxmLl9zdWJzY3JpcHRpb25JZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBzdG9wcGVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBvblN0b3A6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYWxsYmFjayA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoY2FsbGJhY2ssICdvblN0b3AgY2FsbGJhY2snLCBzZWxmKTtcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgY2FsbGJhY2soKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLl9zdG9wQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWIgaGFzIGJlZW4gZGVhY3RpdmF0ZWQsICpPUiogaWYgdGhlIHNlc3Npb24gd2FzXG4gIC8vIGRlc3Ryb3llZCBidXQgdGhlIGRlZmVycmVkIGNhbGwgdG8gX2RlYWN0aXZhdGVBbGxTdWJzY3JpcHRpb25zIGhhc24ndFxuICAvLyBoYXBwZW5lZCB5ZXQuXG4gIF9pc0RlYWN0aXZhdGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLl9kZWFjdGl2YXRlZCB8fCBzZWxmLl9zZXNzaW9uLmluUXVldWUgPT09IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIG5ldyBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIG5ldyBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGFkZGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBsZXQgaWRzID0gc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSk7XG4gICAgaWYgKGlkcyA9PSBudWxsKSB7XG4gICAgICBpZHMgPSBuZXcgU2V0KCk7XG4gICAgICBzZWxmLl9kb2N1bWVudHMuc2V0KGNvbGxlY3Rpb25OYW1lLCBpZHMpO1xuICAgIH1cbiAgICBpZHMuYWRkKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmFkZGVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhIGRvY3VtZW50IGluIHRoZSByZWNvcmQgc2V0IGhhcyBiZWVuIG1vZGlmaWVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgY2hhbmdlZCBkb2N1bWVudCdzIElELlxuICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRzIFRoZSBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkLCB0b2dldGhlciB3aXRoIHRoZWlyIG5ldyB2YWx1ZXMuICBJZiBhIGZpZWxkIGlzIG5vdCBwcmVzZW50IGluIGBmaWVsZHNgIGl0IHdhcyBsZWZ0IHVuY2hhbmdlZDsgaWYgaXQgaXMgcHJlc2VudCBpbiBgZmllbGRzYCBhbmQgaGFzIGEgdmFsdWUgb2YgYHVuZGVmaW5lZGAgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBJZiBgX2lkYCBpcyBwcmVzZW50IGl0IGlzIGlnbm9yZWQuXG4gICAqL1xuICBjaGFuZ2VkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZCA9IHNlbGYuX2lkRmlsdGVyLmlkU3RyaW5naWZ5KGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLmNoYW5nZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZWNvcmQgc2V0LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIC8vIFdlIGRvbid0IGJvdGhlciB0byBkZWxldGUgc2V0cyBvZiB0aGluZ3MgaW4gYSBjb2xsZWN0aW9uIGlmIHRoZVxuICAgIC8vIGNvbGxlY3Rpb24gaXMgZW1wdHkuICBJdCBjb3VsZCBicmVhayBfcmVtb3ZlQWxsRG9jdW1lbnRzLlxuICAgIHNlbGYuX2RvY3VtZW50cy5nZXQoY29sbGVjdGlvbk5hbWUpLmRlbGV0ZShpZCk7XG4gICAgc2VsZi5fc2Vzc2lvbi5yZW1vdmVkKHNlbGYuX3N1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYW4gaW5pdGlhbCwgY29tcGxldGUgc25hcHNob3Qgb2YgdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gc2VudC4gIFRoaXMgd2lsbCB0cmlnZ2VyIGEgY2FsbCBvbiB0aGUgY2xpZW50IHRvIHRoZSBgb25SZWFkeWAgY2FsbGJhY2sgcGFzc2VkIHRvICBbYE1ldGVvci5zdWJzY3JpYmVgXSgjbWV0ZW9yX3N1YnNjcmliZSksIGlmIGFueS5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgcmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXNlbGYuX3N1YnNjcmlwdGlvbklkKVxuICAgICAgcmV0dXJuOyAgLy8gdW5uZWNlc3NhcnkgYnV0IGlnbm9yZWQgZm9yIHVuaXZlcnNhbCBzdWJcbiAgICBpZiAoIXNlbGYuX3JlYWR5KSB7XG4gICAgICBzZWxmLl9zZXNzaW9uLnNlbmRSZWFkeShbc2VsZi5fc3Vic2NyaXB0aW9uSWRdKTtcbiAgICAgIHNlbGYuX3JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblNlcnZlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBUaGUgZGVmYXVsdCBoZWFydGJlYXQgaW50ZXJ2YWwgaXMgMzAgc2Vjb25kcyBvbiB0aGUgc2VydmVyIGFuZCAzNVxuICAvLyBzZWNvbmRzIG9uIHRoZSBjbGllbnQuICBTaW5jZSB0aGUgY2xpZW50IGRvZXNuJ3QgbmVlZCB0byBzZW5kIGFcbiAgLy8gcGluZyBhcyBsb25nIGFzIGl0IGlzIHJlY2VpdmluZyBwaW5ncywgdGhpcyBtZWFucyB0aGF0IHBpbmdzXG4gIC8vIG5vcm1hbGx5IGdvIGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50LlxuICAvL1xuICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gIHNlbGYub3B0aW9ucyA9IF8uZGVmYXVsdHMob3B0aW9ucyB8fCB7fSwge1xuICAgIGhlYXJ0YmVhdEludGVydmFsOiAxNTAwMCxcbiAgICBoZWFydGJlYXRUaW1lb3V0OiAxNTAwMCxcbiAgICAvLyBGb3IgdGVzdGluZywgYWxsb3cgcmVzcG9uZGluZyB0byBwaW5ncyB0byBiZSBkaXNhYmxlZC5cbiAgICByZXNwb25kVG9QaW5nczogdHJ1ZVxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGNvbWVzIGluIHRvIHRoZVxuICAvLyBzZXJ2ZXIgYW5kIGNvbXBsZXRlcyBERFAgdmVyc2lvbiBuZWdvdGlhdGlvbi4gVXNlIGFuIG9iamVjdCBpbnN0ZWFkXG4gIC8vIG9mIGFuIGFycmF5IHNvIHdlIGNhbiBzYWZlbHkgcmVtb3ZlIG9uZSBmcm9tIHRoZSBsaXN0IHdoaWxlXG4gIC8vIGl0ZXJhdGluZyBvdmVyIGl0LlxuICBzZWxmLm9uQ29ubmVjdGlvbkhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25Db25uZWN0aW9uIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgLy8gTWFwIG9mIGNhbGxiYWNrcyB0byBjYWxsIHdoZW4gYSBuZXcgbWVzc2FnZSBjb21lcyBpbi5cbiAgc2VsZi5vbk1lc3NhZ2VIb29rID0gbmV3IEhvb2soe1xuICAgIGRlYnVnUHJpbnRFeGNlcHRpb25zOiBcIm9uTWVzc2FnZSBjYWxsYmFja1wiXG4gIH0pO1xuXG4gIHNlbGYucHVibGlzaF9oYW5kbGVycyA9IHt9O1xuICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzID0gW107XG5cbiAgc2VsZi5tZXRob2RfaGFuZGxlcnMgPSB7fTtcblxuICBzZWxmLnNlc3Npb25zID0gbmV3IE1hcCgpOyAvLyBtYXAgZnJvbSBpZCB0byBzZXNzaW9uXG5cbiAgc2VsZi5zdHJlYW1fc2VydmVyID0gbmV3IFN0cmVhbVNlcnZlcjtcblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIucmVnaXN0ZXIoZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIHNvY2tldCBpbXBsZW1lbnRzIHRoZSBTb2NrSlNDb25uZWN0aW9uIGludGVyZmFjZVxuICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG5cbiAgICB2YXIgc2VuZEVycm9yID0gZnVuY3Rpb24gKHJlYXNvbiwgb2ZmZW5kaW5nTWVzc2FnZSkge1xuICAgICAgdmFyIG1zZyA9IHttc2c6ICdlcnJvcicsIHJlYXNvbjogcmVhc29ufTtcbiAgICAgIGlmIChvZmZlbmRpbmdNZXNzYWdlKVxuICAgICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH07XG5cbiAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbiAocmF3X21zZykge1xuICAgICAgaWYgKE1ldGVvci5fcHJpbnRSZWNlaXZlZEREUCkge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiUmVjZWl2ZWQgRERQXCIsIHJhd19tc2cpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgbXNnID0gRERQQ29tbW9uLnBhcnNlRERQKHJhd19tc2cpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ1BhcnNlIGVycm9yJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtc2cgPT09IG51bGwgfHwgIW1zZy5tc2cpIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobXNnLm1zZyA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgICAgc2VuZEVycm9yKFwiQWxyZWFkeSBjb25uZWN0ZWRcIiwgbXNnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5faGFuZGxlQ29ubmVjdChzb2NrZXQsIG1zZyk7XG4gICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb2NrZXQuX21ldGVvclNlc3Npb24pIHtcbiAgICAgICAgICBzZW5kRXJyb3IoJ011c3QgY29ubmVjdCBmaXJzdCcsIG1zZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5wcm9jZXNzTWVzc2FnZShtc2cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBYWFggcHJpbnQgc3RhY2sgbmljZWx5XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJJbnRlcm5hbCBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBtZXNzYWdlXCIsIG1zZywgZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIH0pLnJ1bigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbl8uZXh0ZW5kKFNlcnZlci5wcm90b3R5cGUsIHtcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBtYWRlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBERFAgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBvbkNvbm5lY3Rpb246IGZ1bmN0aW9uIChmbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5vbkNvbm5lY3Rpb25Ib29rLnJlZ2lzdGVyKGZuKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIG5ldyBERFAgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uTWVzc2FnZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uTWVzc2FnZUhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIF9oYW5kbGVDb25uZWN0OiBmdW5jdGlvbiAoc29ja2V0LCBtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBUaGUgY29ubmVjdCBtZXNzYWdlIG11c3Qgc3BlY2lmeSBhIHZlcnNpb24gYW5kIGFuIGFycmF5IG9mIHN1cHBvcnRlZFxuICAgIC8vIHZlcnNpb25zLCBhbmQgaXQgbXVzdCBjbGFpbSB0byBzdXBwb3J0IHdoYXQgaXQgaXMgcHJvcG9zaW5nLlxuICAgIGlmICghKHR5cGVvZiAobXNnLnZlcnNpb24pID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIF8uaXNBcnJheShtc2cuc3VwcG9ydCkgJiZcbiAgICAgICAgICBfLmFsbChtc2cuc3VwcG9ydCwgXy5pc1N0cmluZykgJiZcbiAgICAgICAgICBfLmNvbnRhaW5zKG1zZy5zdXBwb3J0LCBtc2cudmVyc2lvbikpKSB7XG4gICAgICBzb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKHttc2c6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OU1swXX0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluIHRoZSBmdXR1cmUsIGhhbmRsZSBzZXNzaW9uIHJlc3VtcHRpb246IHNvbWV0aGluZyBsaWtlOlxuICAgIC8vICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBzZWxmLnNlc3Npb25zW21zZy5zZXNzaW9uXVxuICAgIHZhciB2ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lvbihtc2cuc3VwcG9ydCwgRERQQ29tbW9uLlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMpO1xuXG4gICAgaWYgKG1zZy52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAvLyBUaGUgYmVzdCB2ZXJzaW9uIHRvIHVzZSAoYWNjb3JkaW5nIHRvIHRoZSBjbGllbnQncyBzdGF0ZWQgcHJlZmVyZW5jZXMpXG4gICAgICAvLyBpcyBub3QgdGhlIG9uZSB0aGUgY2xpZW50IGlzIHRyeWluZyB0byB1c2UuIEluZm9ybSB0aGVtIGFib3V0IHRoZSBiZXN0XG4gICAgICAvLyB2ZXJzaW9uIHRvIHVzZS5cbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsIHZlcnNpb246IHZlcnNpb259KSk7XG4gICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBZYXksIHZlcnNpb24gbWF0Y2hlcyEgQ3JlYXRlIGEgbmV3IHNlc3Npb24uXG4gICAgLy8gTm90ZTogVHJvcG9zcGhlcmUgZGVwZW5kcyBvbiB0aGUgYWJpbGl0eSB0byBtdXRhdGVcbiAgICAvLyBNZXRlb3Iuc2VydmVyLm9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCEgVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCdzIGxpZmUuXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbmV3IFNlc3Npb24oc2VsZiwgdmVyc2lvbiwgc29ja2V0LCBzZWxmLm9wdGlvbnMpO1xuICAgIHNlbGYuc2Vzc2lvbnMuc2V0KHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5pZCwgc29ja2V0Ll9tZXRlb3JTZXNzaW9uKTtcbiAgICBzZWxmLm9uQ29ubmVjdGlvbkhvb2suZWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGlmIChzb2NrZXQuX21ldGVvclNlc3Npb24pXG4gICAgICAgIGNhbGxiYWNrKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbi5jb25uZWN0aW9uSGFuZGxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBwdWJsaXNoIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIHtTdHJpbmd9IGlkZW50aWZpZXIgZm9yIHF1ZXJ5XG4gICAqIEBwYXJhbSBoYW5kbGVyIHtGdW5jdGlvbn0gcHVibGlzaCBoYW5kbGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtPYmplY3R9XG4gICAqXG4gICAqIFNlcnZlciB3aWxsIGNhbGwgaGFuZGxlciBmdW5jdGlvbiBvbiBlYWNoIG5ldyBzdWJzY3JpcHRpb24sXG4gICAqIGVpdGhlciB3aGVuIHJlY2VpdmluZyBERFAgc3ViIG1lc3NhZ2UgZm9yIGEgbmFtZWQgc3Vic2NyaXB0aW9uLCBvciBvblxuICAgKiBERFAgY29ubmVjdCBmb3IgYSB1bml2ZXJzYWwgc3Vic2NyaXB0aW9uLlxuICAgKlxuICAgKiBJZiBuYW1lIGlzIG51bGwsIHRoaXMgd2lsbCBiZSBhIHN1YnNjcmlwdGlvbiB0aGF0IGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZWQgYW5kIHBlcm1hbmVudGx5IG9uIGZvciBhbGwgY29ubmVjdGVkXG4gICAqIGNsaWVudCwgaW5zdGVhZCBvZiBhIHN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB0dXJuZWQgb24gYW5kIG9mZlxuICAgKiB3aXRoIHN1YnNjcmliZSgpLlxuICAgKlxuICAgKiBvcHRpb25zIHRvIGNvbnRhaW46XG4gICAqICAtIChtb3N0bHkgaW50ZXJuYWwpIGlzX2F1dG86IHRydWUgaWYgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICogICAgZnJvbSBhbiBhdXRvcHVibGlzaCBob29rLiB0aGlzIGlzIGZvciBjb3NtZXRpYyBwdXJwb3NlcyBvbmx5XG4gICAqICAgIChpdCBsZXRzIHVzIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IGEgd2FybmluZyBzdWdnZXN0aW5nXG4gICAqICAgIHRoYXQgeW91IHR1cm4gb2ZmIGF1dG9wdWJsaXNoLilcbiAgICovXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFB1Ymxpc2ggYSByZWNvcmQgc2V0LlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG5hbWUgSWYgU3RyaW5nLCBuYW1lIG9mIHRoZSByZWNvcmQgc2V0LiAgSWYgT2JqZWN0LCBwdWJsaWNhdGlvbnMgRGljdGlvbmFyeSBvZiBwdWJsaXNoIGZ1bmN0aW9ucyBieSBuYW1lLiAgSWYgYG51bGxgLCB0aGUgc2V0IGhhcyBubyBuYW1lLCBhbmQgdGhlIHJlY29yZCBzZXQgaXMgYXV0b21hdGljYWxseSBzZW50IHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBGdW5jdGlvbiBjYWxsZWQgb24gdGhlIHNlcnZlciBlYWNoIHRpbWUgYSBjbGllbnQgc3Vic2NyaWJlcy4gIEluc2lkZSB0aGUgZnVuY3Rpb24sIGB0aGlzYCBpcyB0aGUgcHVibGlzaCBoYW5kbGVyIG9iamVjdCwgZGVzY3JpYmVkIGJlbG93LiAgSWYgdGhlIGNsaWVudCBwYXNzZWQgYXJndW1lbnRzIHRvIGBzdWJzY3JpYmVgLCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLlxuICAgKi9cbiAgcHVibGlzaDogZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoISBfLmlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKG5hbWUgJiYgbmFtZSBpbiBzZWxmLnB1Ymxpc2hfaGFuZGxlcnMpIHtcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIklnbm9yaW5nIGR1cGxpY2F0ZSBwdWJsaXNoIG5hbWVkICdcIiArIG5hbWUgKyBcIidcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFBhY2thZ2UuYXV0b3B1Ymxpc2ggJiYgIW9wdGlvbnMuaXNfYXV0bykge1xuICAgICAgICAvLyBUaGV5IGhhdmUgYXV0b3B1Ymxpc2ggb24sIHlldCB0aGV5J3JlIHRyeWluZyB0byBtYW51YWxseVxuICAgICAgICAvLyBwaWNraW5nIHN0dWZmIHRvIHB1Ymxpc2guIFRoZXkgcHJvYmFibHkgc2hvdWxkIHR1cm4gb2ZmXG4gICAgICAgIC8vIGF1dG9wdWJsaXNoLiAoVGhpcyBjaGVjayBpc24ndCBwZXJmZWN0IC0tIGlmIHlvdSBjcmVhdGUgYVxuICAgICAgICAvLyBwdWJsaXNoIGJlZm9yZSB5b3UgdHVybiBvbiBhdXRvcHVibGlzaCwgaXQgd29uJ3QgY2F0Y2hcbiAgICAgICAgLy8gaXQuIEJ1dCB0aGlzIHdpbGwgZGVmaW5pdGVseSBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlXG4gICAgICAgIC8vIHlvdSd2ZSBhZGRlZCB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZSB0byB5b3VyIGFwcCwgYW5kIGFyZVxuICAgICAgICAvLyBjYWxsaW5nIHB1Ymxpc2ggZnJvbSB5b3VyIGFwcCBjb2RlLilcbiAgICAgICAgaWYgKCFzZWxmLndhcm5lZF9hYm91dF9hdXRvcHVibGlzaCkge1xuICAgICAgICAgIHNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoID0gdHJ1ZTtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFxuICAgIFwiKiogWW91J3ZlIHNldCB1cCBzb21lIGRhdGEgc3Vic2NyaXB0aW9ucyB3aXRoIE1ldGVvci5wdWJsaXNoKCksIGJ1dFxcblwiICtcbiAgICBcIioqIHlvdSBzdGlsbCBoYXZlIGF1dG9wdWJsaXNoIHR1cm5lZCBvbi4gQmVjYXVzZSBhdXRvcHVibGlzaCBpcyBzdGlsbFxcblwiICtcbiAgICBcIioqIG9uLCB5b3VyIE1ldGVvci5wdWJsaXNoKCkgY2FsbHMgd29uJ3QgaGF2ZSBtdWNoIGVmZmVjdC4gQWxsIGRhdGFcXG5cIiArXG4gICAgXCIqKiB3aWxsIHN0aWxsIGJlIHNlbnQgdG8gYWxsIGNsaWVudHMuXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiBUdXJuIG9mZiBhdXRvcHVibGlzaCBieSByZW1vdmluZyB0aGUgYXV0b3B1Ymxpc2ggcGFja2FnZTpcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqICAgJCBtZXRlb3IgcmVtb3ZlIGF1dG9wdWJsaXNoXFxuXCIgK1xuICAgIFwiKipcXG5cIiArXG4gICAgXCIqKiAuLiBhbmQgbWFrZSBzdXJlIHlvdSBoYXZlIE1ldGVvci5wdWJsaXNoKCkgYW5kIE1ldGVvci5zdWJzY3JpYmUoKSBjYWxsc1xcblwiICtcbiAgICBcIioqIGZvciBlYWNoIGNvbGxlY3Rpb24gdGhhdCB5b3Ugd2FudCBjbGllbnRzIHRvIHNlZS5cXG5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUpXG4gICAgICAgIHNlbGYucHVibGlzaF9oYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXI7XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VsZi51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICAvLyBTcGluIHVwIHRoZSBuZXcgcHVibGlzaGVyIG9uIGFueSBleGlzdGluZyBzZXNzaW9uIHRvby4gUnVuIGVhY2hcbiAgICAgICAgLy8gc2Vzc2lvbidzIHN1YnNjcmlwdGlvbiBpbiBhIG5ldyBGaWJlciwgc28gdGhhdCB0aGVyZSdzIG5vIGNoYW5nZSBmb3JcbiAgICAgICAgLy8gc2VsZi5zZXNzaW9ucyB0byBjaGFuZ2Ugd2hpbGUgd2UncmUgcnVubmluZyB0aGlzIGxvb3AuXG4gICAgICAgIHNlbGYuc2Vzc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIGlmICghc2Vzc2lvbi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3Vicykge1xuICAgICAgICAgICAgRmliZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlc3Npb24uX3N0YXJ0U3Vic2NyaXB0aW9uKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIF8uZWFjaChuYW1lLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHNlbGYucHVibGlzaChrZXksIHZhbHVlLCB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZVNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb24uaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBpbnZva2VkIG92ZXIgdGhlIG5ldHdvcmsgYnkgY2xpZW50cy5cbiAgICogQGxvY3VzIEFueXdoZXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtZXRob2RzIERpY3Rpb25hcnkgd2hvc2Uga2V5cyBhcmUgbWV0aG9kIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGZ1bmN0aW9ucy5cbiAgICogQG1lbWJlck9mIE1ldGVvclxuICAgKiBAaW1wb3J0RnJvbVBhY2thZ2UgbWV0ZW9yXG4gICAqL1xuICBtZXRob2RzOiBmdW5jdGlvbiAobWV0aG9kcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBfLmVhY2gobWV0aG9kcywgZnVuY3Rpb24gKGZ1bmMsIG5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kICdcIiArIG5hbWUgKyBcIicgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgaWYgKHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIG1ldGhvZCBuYW1lZCAnXCIgKyBuYW1lICsgXCInIGlzIGFscmVhZHkgZGVmaW5lZFwiKTtcbiAgICAgIHNlbGYubWV0aG9kX2hhbmRsZXJzW25hbWVdID0gZnVuYztcbiAgICB9KTtcbiAgfSxcblxuICBjYWxsOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHJlc3VsdCBjYWxsYmFjaywgbm90XG4gICAgICAvLyBhIHBhcmFtZXRlciB0byB0aGUgcmVtb3RlIG1ldGhvZC5cbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHkobmFtZSwgYXJncywgY2FsbGJhY2spO1xuICB9LFxuXG4gIC8vIEEgdmVyc2lvbiBvZiB0aGUgY2FsbCBtZXRob2QgdGhhdCBhbHdheXMgcmV0dXJucyBhIFByb21pc2UuXG4gIGNhbGxBc3luYzogZnVuY3Rpb24gKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MpO1xuICB9LFxuXG4gIGFwcGx5OiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAvLyBXZSB3ZXJlIHBhc3NlZCAzIGFyZ3VtZW50cy4gVGhleSBtYXkgYmUgZWl0aGVyIChuYW1lLCBhcmdzLCBvcHRpb25zKVxuICAgIC8vIG9yIChuYW1lLCBhcmdzLCBjYWxsYmFjaylcbiAgICBpZiAoISBjYWxsYmFjayAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5hcHBseUFzeW5jKG5hbWUsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgaW4gd2hpY2hldmVyIHdheSB0aGUgY2FsbGVyIGFza2VkIGZvciBpdC4gTm90ZSB0aGF0IHdlXG4gICAgLy8gZG8gTk9UIGJsb2NrIG9uIHRoZSB3cml0ZSBmZW5jZSBpbiBhbiBhbmFsb2dvdXMgd2F5IHRvIGhvdyB0aGUgY2xpZW50XG4gICAgLy8gYmxvY2tzIG9uIHRoZSByZWxldmFudCBkYXRhIGJlaW5nIHZpc2libGUsIHNvIHlvdSBhcmUgTk9UIGd1YXJhbnRlZWQgdGhhdFxuICAgIC8vIGN1cnNvciBvYnNlcnZlIGNhbGxiYWNrcyBoYXZlIGZpcmVkIHdoZW4geW91ciBjYWxsYmFjayBpcyBpbnZva2VkLiAoV2VcbiAgICAvLyBjYW4gY2hhbmdlIHRoaXMgaWYgdGhlcmUncyBhIHJlYWwgdXNlIGNhc2UuKVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcHJvbWlzZS50aGVuKFxuICAgICAgICByZXN1bHQgPT4gY2FsbGJhY2sodW5kZWZpbmVkLCByZXN1bHQpLFxuICAgICAgICBleGNlcHRpb24gPT4gY2FsbGJhY2soZXhjZXB0aW9uKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb21pc2UuYXdhaXQoKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHBhcmFtIG9wdGlvbnMge09wdGlvbmFsIE9iamVjdH1cbiAgYXBwbHlBc3luYzogZnVuY3Rpb24gKG5hbWUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAvLyBSdW4gdGhlIGhhbmRsZXJcbiAgICB2YXIgaGFuZGxlciA9IHRoaXMubWV0aG9kX2hhbmRsZXJzW25hbWVdO1xuICAgIGlmICghIGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IE1ldGVvci5FcnJvcig0MDQsIGBNZXRob2QgJyR7bmFtZX0nIG5vdCBmb3VuZGApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSBtZXRob2QgY2FsbCBmcm9tIHdpdGhpbiBhbm90aGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLFxuICAgIC8vIGdldCB0aGUgdXNlciBzdGF0ZSBmcm9tIHRoZSBvdXRlciBtZXRob2Qgb3IgcHVibGlzaCBmdW5jdGlvbiwgb3RoZXJ3aXNlXG4gICAgLy8gZG9uJ3QgYWxsb3cgc2V0VXNlcklkIHRvIGJlIGNhbGxlZFxuICAgIHZhciB1c2VySWQgPSBudWxsO1xuICAgIHZhciBzZXRVc2VySWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNhbGwgc2V0VXNlcklkIG9uIGEgc2VydmVyIGluaXRpYXRlZCBtZXRob2QgY2FsbFwiKTtcbiAgICB9O1xuICAgIHZhciBjb25uZWN0aW9uID0gbnVsbDtcbiAgICB2YXIgY3VycmVudE1ldGhvZEludm9jYXRpb24gPSBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uID0gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLmdldCgpO1xuICAgIHZhciByYW5kb21TZWVkID0gbnVsbDtcbiAgICBpZiAoY3VycmVudE1ldGhvZEludm9jYXRpb24pIHtcbiAgICAgIHVzZXJJZCA9IGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudE1ldGhvZEludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICAgIHJhbmRvbVNlZWQgPSBERFBDb21tb24ubWFrZVJwY1NlZWQoY3VycmVudE1ldGhvZEludm9jYXRpb24sIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi51c2VySWQ7XG4gICAgICBzZXRVc2VySWQgPSBmdW5jdGlvbih1c2VySWQpIHtcbiAgICAgICAgY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5fc2Vzc2lvbi5fc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9O1xuICAgICAgY29ubmVjdGlvbiA9IGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgaW52b2NhdGlvbiA9IG5ldyBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvbih7XG4gICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgdXNlcklkLFxuICAgICAgc2V0VXNlcklkLFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIHJhbmRvbVNlZWRcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlc29sdmUoXG4gICAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgaW52b2NhdGlvbixcbiAgICAgICAgKCkgPT4gbWF5YmVBdWRpdEFyZ3VtZW50Q2hlY2tzKFxuICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIEVKU09OLmNsb25lKGFyZ3MpLFxuICAgICAgICAgIFwiaW50ZXJuYWwgY2FsbCB0byAnXCIgKyBuYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkpLnRoZW4oRUpTT04uY2xvbmUpO1xuICB9LFxuXG4gIF91cmxGb3JTZXNzaW9uOiBmdW5jdGlvbiAoc2Vzc2lvbklkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzZXNzaW9uID0gc2VsZi5zZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoc2Vzc2lvbilcbiAgICAgIHJldHVybiBzZXNzaW9uLl9zb2NrZXRVcmw7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG52YXIgY2FsY3VsYXRlVmVyc2lvbiA9IGZ1bmN0aW9uIChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFZlcnNpb25zKSB7XG4gIHZhciBjb3JyZWN0VmVyc2lvbiA9IF8uZmluZChjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucywgZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICByZXR1cm4gXy5jb250YWlucyhzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9ucywgdmVyc2lvbik7XG4gIH0pO1xuICBpZiAoIWNvcnJlY3RWZXJzaW9uKSB7XG4gICAgY29ycmVjdFZlcnNpb24gPSBzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9uc1swXTtcbiAgfVxuICByZXR1cm4gY29ycmVjdFZlcnNpb247XG59O1xuXG5ERFBTZXJ2ZXIuX2NhbGN1bGF0ZVZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uO1xuXG5cbi8vIFwiYmxpbmRcIiBleGNlcHRpb25zIG90aGVyIHRoYW4gdGhvc2UgdGhhdCB3ZXJlIGRlbGliZXJhdGVseSB0aHJvd24gdG8gc2lnbmFsXG4vLyBlcnJvcnMgdG8gdGhlIGNsaWVudFxudmFyIHdyYXBJbnRlcm5hbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGNvbnRleHQpIHtcbiAgaWYgKCFleGNlcHRpb24pIHJldHVybiBleGNlcHRpb247XG5cbiAgLy8gVG8gYWxsb3cgcGFja2FnZXMgdG8gdGhyb3cgZXJyb3JzIGludGVuZGVkIGZvciB0aGUgY2xpZW50IGJ1dCBub3QgaGF2ZSB0b1xuICAvLyBkZXBlbmQgb24gdGhlIE1ldGVvci5FcnJvciBjbGFzcywgYGlzQ2xpZW50U2FmZWAgY2FuIGJlIHNldCB0byB0cnVlIG9uIGFueVxuICAvLyBlcnJvciBiZWZvcmUgaXQgaXMgdGhyb3duLlxuICBpZiAoZXhjZXB0aW9uLmlzQ2xpZW50U2FmZSkge1xuICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE1ldGVvci5FcnJvcikpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTWVzc2FnZSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE1ldGVvci5FcnJvcihleGNlcHRpb24uZXJyb3IsIGV4Y2VwdGlvbi5yZWFzb24sIGV4Y2VwdGlvbi5kZXRhaWxzKTtcbiAgICAgIGV4Y2VwdGlvbi5tZXNzYWdlID0gb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gZXhjZXB0aW9uO1xuICB9XG5cbiAgLy8gVGVzdHMgY2FuIHNldCB0aGUgJ19leHBlY3RlZEJ5VGVzdCcgZmxhZyBvbiBhbiBleGNlcHRpb24gc28gaXQgd29uJ3QgZ28gdG9cbiAgLy8gdGhlIHNlcnZlciBsb2cuXG4gIGlmICghZXhjZXB0aW9uLl9leHBlY3RlZEJ5VGVzdCkge1xuICAgIE1ldGVvci5fZGVidWcoXCJFeGNlcHRpb24gXCIgKyBjb250ZXh0LCBleGNlcHRpb24uc3RhY2spO1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICAgIE1ldGVvci5fZGVidWcoXCJTYW5pdGl6ZWQgYW5kIHJlcG9ydGVkIHRvIHRoZSBjbGllbnQgYXM6XCIsIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcik7XG4gICAgICBNZXRlb3IuX2RlYnVnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlkIHRoZSBlcnJvciBjb250YWluIG1vcmUgZGV0YWlscyB0aGF0IGNvdWxkIGhhdmUgYmVlbiB1c2VmdWwgaWYgY2F1Z2h0IGluXG4gIC8vIHNlcnZlciBjb2RlIChvciBpZiB0aHJvd24gZnJvbSBub24tY2xpZW50LW9yaWdpbmF0ZWQgY29kZSksIGJ1dCBhbHNvXG4gIC8vIHByb3ZpZGVkIGEgXCJzYW5pdGl6ZWRcIiB2ZXJzaW9uIHdpdGggbW9yZSBjb250ZXh0IHRoYW4gNTAwIEludGVybmFsIHNlcnZlclxuICAvLyBlcnJvcj8gVXNlIHRoYXQuXG4gIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IpIHtcbiAgICBpZiAoZXhjZXB0aW9uLnNhbml0aXplZEVycm9yLmlzQ2xpZW50U2FmZSlcbiAgICAgIHJldHVybiBleGNlcHRpb24uc2FuaXRpemVkRXJyb3I7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQgKyBcIiBwcm92aWRlcyBhIHNhbml0aXplZEVycm9yIHRoYXQgXCIgK1xuICAgICAgICAgICAgICAgICAgXCJkb2VzIG5vdCBoYXZlIGlzQ2xpZW50U2FmZSBwcm9wZXJ0eSBzZXQ7IGlnbm9yaW5nXCIpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcIkludGVybmFsIHNlcnZlciBlcnJvclwiKTtcbn07XG5cblxuLy8gQXVkaXQgYXJndW1lbnQgY2hlY2tzLCBpZiB0aGUgYXVkaXQtYXJndW1lbnQtY2hlY2tzIHBhY2thZ2UgZXhpc3RzIChpdCBpcyBhXG4vLyB3ZWFrIGRlcGVuZGVuY3kgb2YgdGhpcyBwYWNrYWdlKS5cbnZhciBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MgPSBmdW5jdGlvbiAoZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pIHtcbiAgYXJncyA9IGFyZ3MgfHwgW107XG4gIGlmIChQYWNrYWdlWydhdWRpdC1hcmd1bWVudC1jaGVja3MnXSkge1xuICAgIHJldHVybiBNYXRjaC5fZmFpbElmQXJndW1lbnRzQXJlTm90QWxsQ2hlY2tlZChcbiAgICAgIGYsIGNvbnRleHQsIGFyZ3MsIGRlc2NyaXB0aW9uKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShjb250ZXh0LCBhcmdzKTtcbn07XG4iLCJ2YXIgRnV0dXJlID0gTnBtLnJlcXVpcmUoJ2ZpYmVycy9mdXR1cmUnKTtcblxuLy8gQSB3cml0ZSBmZW5jZSBjb2xsZWN0cyBhIGdyb3VwIG9mIHdyaXRlcywgYW5kIHByb3ZpZGVzIGEgY2FsbGJhY2tcbi8vIHdoZW4gYWxsIG9mIHRoZSB3cml0ZXMgYXJlIGZ1bGx5IGNvbW1pdHRlZCBhbmQgcHJvcGFnYXRlZCAoYWxsXG4vLyBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIHRoZSB3cml0ZSBhbmQgYWNrbm93bGVkZ2VkIGl0Lilcbi8vXG5ERFBTZXJ2ZXIuX1dyaXRlRmVuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBzZWxmLmFybWVkID0gZmFsc2U7XG4gIHNlbGYuZmlyZWQgPSBmYWxzZTtcbiAgc2VsZi5yZXRpcmVkID0gZmFsc2U7XG4gIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzID0gMDtcbiAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xufTtcblxuLy8gVGhlIGN1cnJlbnQgd3JpdGUgZmVuY2UuIFdoZW4gdGhlcmUgaXMgYSBjdXJyZW50IHdyaXRlIGZlbmNlLCBjb2RlXG4vLyB0aGF0IHdyaXRlcyB0byBkYXRhYmFzZXMgc2hvdWxkIHJlZ2lzdGVyIHRoZWlyIHdyaXRlcyB3aXRoIGl0IHVzaW5nXG4vLyBiZWdpbldyaXRlKCkuXG4vL1xuRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZSA9IG5ldyBNZXRlb3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Xcml0ZUZlbmNlLnByb3RvdHlwZSwge1xuICAvLyBTdGFydCB0cmFja2luZyBhIHdyaXRlLCBhbmQgcmV0dXJuIGFuIG9iamVjdCB0byByZXByZXNlbnQgaXQuIFRoZVxuICAvLyBvYmplY3QgaGFzIGEgc2luZ2xlIG1ldGhvZCwgY29tbWl0dGVkKCkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZVxuICAvLyBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgaXMgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkLiBZb3UgY2FuXG4gIC8vIGNvbnRpbnVlIHRvIGFkZCB3cml0ZXMgdG8gdGhlIFdyaXRlRmVuY2UgdXAgdW50aWwgaXQgaXMgdHJpZ2dlcmVkXG4gIC8vIChjYWxscyBpdHMgY2FsbGJhY2tzIGJlY2F1c2UgYWxsIHdyaXRlcyBoYXZlIGNvbW1pdHRlZC4pXG4gIGJlZ2luV3JpdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZi5yZXRpcmVkKVxuICAgICAgcmV0dXJuIHsgY29tbWl0dGVkOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gYWRkIHdyaXRlc1wiKTtcblxuICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKys7XG4gICAgdmFyIGNvbW1pdHRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbW1pdHRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb21taXR0ZWQgY2FsbGVkIHR3aWNlIG9uIHRoZSBzYW1lIHdyaXRlXCIpO1xuICAgICAgICBjb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuICAgICAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEFybSB0aGUgZmVuY2UuIE9uY2UgdGhlIGZlbmNlIGlzIGFybWVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmVcbiAgLy8gdW5jb21taXR0ZWQgd3JpdGVzLCBpdCB3aWxsIGFjdGl2YXRlLlxuICBhcm06IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYgPT09IEREUFNlcnZlci5fQ3VycmVudFdyaXRlRmVuY2UuZ2V0KCkpXG4gICAgICB0aHJvdyBFcnJvcihcIkNhbid0IGFybSB0aGUgY3VycmVudCBmZW5jZVwiKTtcbiAgICBzZWxmLmFybWVkID0gdHJ1ZTtcbiAgICBzZWxmLl9tYXliZUZpcmUoKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBmaXJpbmcgdGhlIGZlbmNlLlxuICAvLyBDYWxsYmFjayBmdW5jdGlvbiBjYW4gYWRkIG5ldyB3cml0ZXMgdG8gdGhlIGZlbmNlLCBpbiB3aGljaCBjYXNlXG4gIC8vIGl0IHdvbid0IGZpcmUgdW50aWwgdGhvc2Ugd3JpdGVzIGFyZSBkb25lIGFzIHdlbGwuXG4gIG9uQmVmb3JlRmlyZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZW5jZSBmaXJlcy5cbiAgb25BbGxDb21taXR0ZWQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmVuY2UgaGFzIGFscmVhZHkgYWN0aXZhdGVkIC0tIHRvbyBsYXRlIHRvIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcImFkZCBhIGNhbGxiYWNrXCIpO1xuICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfSxcblxuICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbi4gQXJtcyB0aGUgZmVuY2UsIHRoZW4gYmxvY2tzIHVudGlsIGl0IGZpcmVzLlxuICBhcm1BbmRXYWl0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlO1xuICAgIHNlbGYub25BbGxDb21taXR0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgZnV0dXJlWydyZXR1cm4nXSgpO1xuICAgIH0pO1xuICAgIHNlbGYuYXJtKCk7XG4gICAgZnV0dXJlLndhaXQoKTtcbiAgfSxcblxuICBfbWF5YmVGaXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid3JpdGUgZmVuY2UgYWxyZWFkeSBhY3RpdmF0ZWQ/XCIpO1xuICAgIGlmIChzZWxmLmFybWVkICYmICFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2sgKGZ1bmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmdW5jKHNlbGYpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBNZXRlb3IuX2RlYnVnKFwiZXhjZXB0aW9uIGluIHdyaXRlIGZlbmNlIGNhbGxiYWNrXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICAgIHdoaWxlIChzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5iZWZvcmVfZmlyZV9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMtLTtcblxuICAgICAgaWYgKCFzZWxmLm91dHN0YW5kaW5nX3dyaXRlcykge1xuICAgICAgICBzZWxmLmZpcmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3M7XG4gICAgICAgIHNlbGYuY29tcGxldGlvbl9jYWxsYmFja3MgPSBbXTtcbiAgICAgICAgXy5lYWNoKGNhbGxiYWNrcywgaW52b2tlQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyBEZWFjdGl2YXRlIHRoaXMgZmVuY2Ugc28gdGhhdCBhZGRpbmcgbW9yZSB3cml0ZXMgaGFzIG5vIGVmZmVjdC5cbiAgLy8gVGhlIGZlbmNlIG11c3QgaGF2ZSBhbHJlYWR5IGZpcmVkLlxuICByZXRpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJldGlyZSBhIGZlbmNlIHRoYXQgaGFzbid0IGZpcmVkLlwiKTtcbiAgICBzZWxmLnJldGlyZWQgPSB0cnVlO1xuICB9XG59KTtcbiIsIi8vIEEgXCJjcm9zc2JhclwiIGlzIGEgY2xhc3MgdGhhdCBwcm92aWRlcyBzdHJ1Y3R1cmVkIG5vdGlmaWNhdGlvbiByZWdpc3RyYXRpb24uXG4vLyBTZWUgX21hdGNoIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBob3cgYSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIuXG4vLyBBbGwgbm90aWZpY2F0aW9ucyBhbmQgdHJpZ2dlcnMgbXVzdCBoYXZlIGEgc3RyaW5nIGtleSBuYW1lZCAnY29sbGVjdGlvbicuXG5cbkREUFNlcnZlci5fQ3Jvc3NiYXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHNlbGYubmV4dElkID0gMTtcbiAgLy8gbWFwIGZyb20gY29sbGVjdGlvbiBuYW1lIChzdHJpbmcpIC0+IGxpc3RlbmVyIGlkIC0+IG9iamVjdC4gZWFjaCBvYmplY3QgaGFzXG4gIC8vIGtleXMgJ3RyaWdnZXInLCAnY2FsbGJhY2snLiAgQXMgYSBoYWNrLCB0aGUgZW1wdHkgc3RyaW5nIG1lYW5zIFwibm9cbiAgLy8gY29sbGVjdGlvblwiLlxuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiA9IHt9O1xuICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50ID0ge307XG4gIHNlbGYuZmFjdFBhY2thZ2UgPSBvcHRpb25zLmZhY3RQYWNrYWdlIHx8IFwibGl2ZWRhdGFcIjtcbiAgc2VsZi5mYWN0TmFtZSA9IG9wdGlvbnMuZmFjdE5hbWUgfHwgbnVsbDtcbn07XG5cbl8uZXh0ZW5kKEREUFNlcnZlci5fQ3Jvc3NiYXIucHJvdG90eXBlLCB7XG4gIC8vIG1zZyBpcyBhIHRyaWdnZXIgb3IgYSBub3RpZmljYXRpb25cbiAgX2NvbGxlY3Rpb25Gb3JNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghIF8uaGFzKG1zZywgJ2NvbGxlY3Rpb24nKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mKG1zZy5jb2xsZWN0aW9uKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChtc2cuY29sbGVjdGlvbiA9PT0gJycpXG4gICAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgZW1wdHkgY29sbGVjdGlvbiFcIik7XG4gICAgICByZXR1cm4gbXNnLmNvbGxlY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKFwiTWVzc2FnZSBoYXMgbm9uLXN0cmluZyBjb2xsZWN0aW9uIVwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTGlzdGVuIGZvciBub3RpZmljYXRpb24gdGhhdCBtYXRjaCAndHJpZ2dlcicuIEEgbm90aWZpY2F0aW9uXG4gIC8vIG1hdGNoZXMgaWYgaXQgaGFzIHRoZSBrZXktdmFsdWUgcGFpcnMgaW4gdHJpZ2dlciBhcyBhXG4gIC8vIHN1YnNldC4gV2hlbiBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzLCBjYWxsICdjYWxsYmFjaycsIHBhc3NpbmdcbiAgLy8gdGhlIGFjdHVhbCBub3RpZmljYXRpb24uXG4gIC8vXG4gIC8vIFJldHVybnMgYSBsaXN0ZW4gaGFuZGxlLCB3aGljaCBpcyBhbiBvYmplY3Qgd2l0aCBhIG1ldGhvZFxuICAvLyBzdG9wKCkuIENhbGwgc3RvcCgpIHRvIHN0b3AgbGlzdGVuaW5nLlxuICAvL1xuICAvLyBYWFggSXQgc2hvdWxkIGJlIGxlZ2FsIHRvIGNhbGwgZmlyZSgpIGZyb20gaW5zaWRlIGEgbGlzdGVuKClcbiAgLy8gY2FsbGJhY2s/XG4gIGxpc3RlbjogZnVuY3Rpb24gKHRyaWdnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpZCA9IHNlbGYubmV4dElkKys7XG5cbiAgICB2YXIgY29sbGVjdGlvbiA9IHNlbGYuX2NvbGxlY3Rpb25Gb3JNZXNzYWdlKHRyaWdnZXIpO1xuICAgIHZhciByZWNvcmQgPSB7dHJpZ2dlcjogRUpTT04uY2xvbmUodHJpZ2dlciksIGNhbGxiYWNrOiBjYWxsYmFja307XG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSA9IHt9O1xuICAgICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25Db3VudFtjb2xsZWN0aW9uXSA9IDA7XG4gICAgfVxuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dW2lkXSA9IHJlY29yZDtcbiAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dKys7XG5cbiAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICBzZWxmLmZhY3RQYWNrYWdlLCBzZWxmLmZhY3ROYW1lLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5mYWN0TmFtZSAmJiBQYWNrYWdlWydmYWN0cy1iYXNlJ10pIHtcbiAgICAgICAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10uRmFjdHMuaW5jcmVtZW50U2VydmVyRmFjdChcbiAgICAgICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdO1xuICAgICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dLS07XG4gICAgICAgIGlmIChzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dO1xuICAgICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvLyBGaXJlIHRoZSBwcm92aWRlZCAnbm90aWZpY2F0aW9uJyAoYW4gb2JqZWN0IHdob3NlIGF0dHJpYnV0ZVxuICAvLyB2YWx1ZXMgYXJlIGFsbCBKU09OLWNvbXBhdGliaWxlKSAtLSBpbmZvcm0gYWxsIG1hdGNoaW5nIGxpc3RlbmVyc1xuICAvLyAocmVnaXN0ZXJlZCB3aXRoIGxpc3RlbigpKS5cbiAgLy9cbiAgLy8gSWYgZmlyZSgpIGlzIGNhbGxlZCBpbnNpZGUgYSB3cml0ZSBmZW5jZSwgdGhlbiBlYWNoIG9mIHRoZVxuICAvLyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgaW5zaWRlIHRoZSB3cml0ZSBmZW5jZSBhcyB3ZWxsLlxuICAvL1xuICAvLyBUaGUgbGlzdGVuZXJzIG1heSBiZSBpbnZva2VkIGluIHBhcmFsbGVsLCByYXRoZXIgdGhhbiBzZXJpYWxseS5cbiAgZmlyZTogZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2Uobm90aWZpY2F0aW9uKTtcblxuICAgIGlmICghIF8uaGFzKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uID0gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgdmFyIGNhbGxiYWNrSWRzID0gW107XG4gICAgXy5lYWNoKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGZ1bmN0aW9uIChsLCBpZCkge1xuICAgICAgaWYgKHNlbGYuX21hdGNoZXMobm90aWZpY2F0aW9uLCBsLnRyaWdnZXIpKSB7XG4gICAgICAgIGNhbGxiYWNrSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuZXIgY2FsbGJhY2tzIGNhbiB5aWVsZCwgc28gd2UgbmVlZCB0byBmaXJzdCBmaW5kIGFsbCB0aGUgb25lcyB0aGF0XG4gICAgLy8gbWF0Y2ggaW4gYSBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24gKHdoaWNoIGNhbid0XG4gICAgLy8gYmUgbXV0YXRlZCBkdXJpbmcgdGhpcyBpdGVyYXRpb24pLCBhbmQgdGhlbiBpbnZva2UgdGhlIG1hdGNoaW5nXG4gICAgLy8gY2FsbGJhY2tzLCBjaGVja2luZyBiZWZvcmUgZWFjaCBjYWxsIHRvIGVuc3VyZSB0aGV5IGhhdmVuJ3Qgc3RvcHBlZC5cbiAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGF0XG4gICAgLy8gc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl0gc3RpbGwgPT09IGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sXG4gICAgLy8gYmVjYXVzZSB0aGUgb25seSB3YXkgdGhhdCBzdG9wcyBiZWluZyB0cnVlIGlzIGlmIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25cbiAgICAvLyBmaXJzdCBnZXRzIHJlZHVjZWQgZG93biB0byB0aGUgZW1wdHkgb2JqZWN0IChhbmQgdGhlbiBuZXZlciBnZXRzXG4gICAgLy8gaW5jcmVhc2VkIGFnYWluKS5cbiAgICBfLmVhY2goY2FsbGJhY2tJZHMsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKF8uaGFzKGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24sIGlkKSkge1xuICAgICAgICBsaXN0ZW5lcnNGb3JDb2xsZWN0aW9uW2lkXS5jYWxsYmFjayhub3RpZmljYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIEEgbm90aWZpY2F0aW9uIG1hdGNoZXMgYSB0cmlnZ2VyIGlmIGFsbCBrZXlzIHRoYXQgZXhpc3QgaW4gYm90aCBhcmUgZXF1YWwuXG4gIC8vXG4gIC8vIEV4YW1wbGVzOlxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICBub24tdGFyZ2V0ZWQgcXVlcnkpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wifSBtYXRjaGVzIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9XG4gIC8vICAgIChhIG5vbi10YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhXG4gIC8vICAgICB0YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgdGFyZ2V0ZWQgd3JpdGUgdG8gYSBjb2xsZWN0aW9uIG1hdGNoZXMgYSB0YXJnZXRlZCBxdWVyeSB0YXJnZXRlZFxuICAvLyAgICAgYXQgdGhlIHNhbWUgZG9jdW1lbnQpXG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifSBkb2VzIG5vdCBtYXRjaCBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWVwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gZG9lcyBub3QgbWF0Y2ggYSB0YXJnZXRlZCBxdWVyeVxuICAvLyAgICAgdGFyZ2V0ZWQgYXQgYSBkaWZmZXJlbnQgZG9jdW1lbnQpXG4gIF9tYXRjaGVzOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uLCB0cmlnZ2VyKSB7XG4gICAgLy8gTW9zdCBub3RpZmljYXRpb25zIHRoYXQgdXNlIHRoZSBjcm9zc2JhciBoYXZlIGEgc3RyaW5nIGBjb2xsZWN0aW9uYCBhbmRcbiAgICAvLyBtYXliZSBhbiBgaWRgIHRoYXQgaXMgYSBzdHJpbmcgb3IgT2JqZWN0SUQuIFdlJ3JlIGFscmVhZHkgZGl2aWRpbmcgdXBcbiAgICAvLyB0cmlnZ2VycyBieSBjb2xsZWN0aW9uLCBidXQgbGV0J3MgZmFzdC10cmFjayBcIm5vcGUsIGRpZmZlcmVudCBJRFwiIChhbmRcbiAgICAvLyBhdm9pZCB0aGUgb3Zlcmx5IGdlbmVyaWMgRUpTT04uZXF1YWxzKS4gVGhpcyBtYWtlcyBhIG5vdGljZWFibGVcbiAgICAvLyBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlOyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21ldGVvci9tZXRlb3IvcHVsbC8zNjk3XG4gICAgaWYgKHR5cGVvZihub3RpZmljYXRpb24uaWQpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YodHJpZ2dlci5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG5vdGlmaWNhdGlvbi5pZCAhPT0gdHJpZ2dlci5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobm90aWZpY2F0aW9uLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICB0cmlnZ2VyLmlkIGluc3RhbmNlb2YgTW9uZ29JRC5PYmplY3RJRCAmJlxuICAgICAgICAhIG5vdGlmaWNhdGlvbi5pZC5lcXVhbHModHJpZ2dlci5pZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gXy5hbGwodHJpZ2dlciwgZnVuY3Rpb24gKHRyaWdnZXJWYWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm4gIV8uaGFzKG5vdGlmaWNhdGlvbiwga2V5KSB8fFxuICAgICAgICBFSlNPTi5lcXVhbHModHJpZ2dlclZhbHVlLCBub3RpZmljYXRpb25ba2V5XSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBUaGUgXCJpbnZhbGlkYXRpb24gY3Jvc3NiYXJcIiBpcyBhIHNwZWNpZmljIGluc3RhbmNlIHVzZWQgYnkgdGhlIEREUCBzZXJ2ZXIgdG9cbi8vIGltcGxlbWVudCB3cml0ZSBmZW5jZSBub3RpZmljYXRpb25zLiBMaXN0ZW5lciBjYWxsYmFja3Mgb24gdGhpcyBjcm9zc2JhclxuLy8gc2hvdWxkIGNhbGwgYmVnaW5Xcml0ZSBvbiB0aGUgY3VycmVudCB3cml0ZSBmZW5jZSBiZWZvcmUgdGhleSByZXR1cm4sIGlmIHRoZXlcbi8vIHdhbnQgdG8gZGVsYXkgdGhlIHdyaXRlIGZlbmNlIGZyb20gZmlyaW5nIChpZSwgdGhlIEREUCBtZXRob2QtZGF0YS11cGRhdGVkXG4vLyBtZXNzYWdlIGZyb20gYmVpbmcgc2VudCkuXG5ERFBTZXJ2ZXIuX0ludmFsaWRhdGlvbkNyb3NzYmFyID0gbmV3IEREUFNlcnZlci5fQ3Jvc3NiYXIoe1xuICBmYWN0TmFtZTogXCJpbnZhbGlkYXRpb24tY3Jvc3NiYXItbGlzdGVuZXJzXCJcbn0pO1xuIiwiaWYgKHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMKSB7XG4gIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwgPVxuICAgIHByb2Nlc3MuZW52LkREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMO1xufVxuXG5NZXRlb3Iuc2VydmVyID0gbmV3IFNlcnZlcjtcblxuTWV0ZW9yLnJlZnJlc2ggPSBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gIEREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIuZmlyZShub3RpZmljYXRpb24pO1xufTtcblxuLy8gUHJveHkgdGhlIHB1YmxpYyBtZXRob2RzIG9mIE1ldGVvci5zZXJ2ZXIgc28gdGhleSBjYW5cbi8vIGJlIGNhbGxlZCBkaXJlY3RseSBvbiBNZXRlb3IuXG5fLmVhY2goWydwdWJsaXNoJywgJ21ldGhvZHMnLCAnY2FsbCcsICdhcHBseScsICdvbkNvbm5lY3Rpb24nLCAnb25NZXNzYWdlJ10sXG4gICAgICAgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgIE1ldGVvcltuYW1lXSA9IF8uYmluZChNZXRlb3Iuc2VydmVyW25hbWVdLCBNZXRlb3Iuc2VydmVyKTtcbiAgICAgICB9KTtcblxuLy8gTWV0ZW9yLnNlcnZlciB1c2VkIHRvIGJlIGNhbGxlZCBNZXRlb3IuZGVmYXVsdF9zZXJ2ZXIuIFByb3ZpZGVcbi8vIGJhY2tjb21wYXQgYXMgYSBjb3VydGVzeSBldmVuIHRob3VnaCBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZC5cbi8vIFhYWCBDT01QQVQgV0lUSCAwLjYuNFxuTWV0ZW9yLmRlZmF1bHRfc2VydmVyID0gTWV0ZW9yLnNlcnZlcjtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJqc2Vzc2lvbmlkIiwiVVNFX0pTRVNTSU9OSUQiLCJkaXNhYmxlX2NvcnMiLCJESVNBQkxFX1dFQlNPQ0tFVFMiLCJ3ZWJzb2NrZXQiLCJmYXllX3NlcnZlcl9vcHRpb25zIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiV2ViQXBwIiwiaHR0cFNlcnZlciIsInJlbW92ZUxpc3RlbmVyIiwiX3RpbWVvdXRBZGp1c3RtZW50UmVxdWVzdENhbGxiYWNrIiwiaW5zdGFsbEhhbmRsZXJzIiwiYWRkTGlzdGVuZXIiLCJfcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCIsIm9uIiwic29ja2V0Iiwic2V0V2Vic29ja2V0VGltZW91dCIsInRpbWVvdXQiLCJwcm90b2NvbCIsIl9zZXNzaW9uIiwicmVjdiIsImNvbm5lY3Rpb24iLCJzZXRUaW1lb3V0Iiwic2VuZCIsImRhdGEiLCJ3cml0ZSIsIndpdGhvdXQiLCJzdHJpbmdpZnkiLCJzZXJ2ZXJfaWQiLCJlYWNoIiwiY2FsbGJhY2siLCJleHRlbmQiLCJwcm90b3R5cGUiLCJyZWdpc3RlciIsImFsbF9zb2NrZXRzIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIdHRwU2VydmVyTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwic2xpY2UiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJuZXdMaXN0ZW5lciIsInJlcXVlc3QiLCJhcmdzIiwiYXJndW1lbnRzIiwicGFyc2VkVXJsIiwicGF0aG5hbWUiLCJmb3JtYXQiLCJvbGRMaXN0ZW5lciIsImFwcGx5IiwiRERQU2VydmVyIiwiRmliZXIiLCJTZXNzaW9uRG9jdW1lbnRWaWV3IiwiZXhpc3RzSW4iLCJTZXQiLCJkYXRhQnlLZXkiLCJNYXAiLCJfU2Vzc2lvbkRvY3VtZW50VmlldyIsImdldEZpZWxkcyIsInJldCIsImZvckVhY2giLCJwcmVjZWRlbmNlTGlzdCIsImtleSIsInZhbHVlIiwiY2xlYXJGaWVsZCIsInN1YnNjcmlwdGlvbkhhbmRsZSIsImNoYW5nZUNvbGxlY3RvciIsImdldCIsInJlbW92ZWRWYWx1ZSIsInVuZGVmaW5lZCIsImkiLCJsZW5ndGgiLCJwcmVjZWRlbmNlIiwic3BsaWNlIiwiZGVsZXRlIiwiRUpTT04iLCJlcXVhbHMiLCJjaGFuZ2VGaWVsZCIsImlzQWRkIiwiY2xvbmUiLCJoYXMiLCJzZXQiLCJlbHQiLCJmaW5kIiwiU2Vzc2lvbkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbk5hbWUiLCJzZXNzaW9uQ2FsbGJhY2tzIiwiZG9jdW1lbnRzIiwiY2FsbGJhY2tzIiwiX1Nlc3Npb25Db2xsZWN0aW9uVmlldyIsImlzRW1wdHkiLCJzaXplIiwiZGlmZiIsInByZXZpb3VzIiwiRGlmZlNlcXVlbmNlIiwiZGlmZk1hcHMiLCJib3RoIiwiYmluZCIsImRpZmZEb2N1bWVudCIsInJpZ2h0T25seSIsImlkIiwibm93RFYiLCJhZGRlZCIsImxlZnRPbmx5IiwicHJldkRWIiwicmVtb3ZlZCIsImZpZWxkcyIsImRpZmZPYmplY3RzIiwicHJldiIsIm5vdyIsImNoYW5nZWQiLCJkb2NWaWV3IiwiYWRkIiwiY2hhbmdlZFJlc3VsdCIsIkVycm9yIiwiZXJyIiwiU2Vzc2lvbiIsInZlcnNpb24iLCJvcHRpb25zIiwiUmFuZG9tIiwiaW5pdGlhbGl6ZWQiLCJpblF1ZXVlIiwiTWV0ZW9yIiwiX0RvdWJsZUVuZGVkUXVldWUiLCJibG9ja2VkIiwid29ya2VyUnVubmluZyIsIl9uYW1lZFN1YnMiLCJfdW5pdmVyc2FsU3VicyIsInVzZXJJZCIsImNvbGxlY3Rpb25WaWV3cyIsIl9pc1NlbmRpbmciLCJfZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyIsIl9wZW5kaW5nUmVhZHkiLCJfY2xvc2VDYWxsYmFja3MiLCJfc29ja2V0VXJsIiwiX3Jlc3BvbmRUb1BpbmdzIiwicmVzcG9uZFRvUGluZ3MiLCJjb25uZWN0aW9uSGFuZGxlIiwiY2xvc2UiLCJvbkNsb3NlIiwiZm4iLCJjYiIsImJpbmRFbnZpcm9ubWVudCIsImRlZmVyIiwiY2xpZW50QWRkcmVzcyIsIl9jbGllbnRBZGRyZXNzIiwiaHR0cEhlYWRlcnMiLCJoZWFkZXJzIiwibXNnIiwic2Vzc2lvbiIsInN0YXJ0VW5pdmVyc2FsU3VicyIsInJ1biIsImhlYXJ0YmVhdEludGVydmFsIiwiaGVhcnRiZWF0IiwiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiaGVhcnRiZWF0VGltZW91dCIsIm9uVGltZW91dCIsInNlbmRQaW5nIiwic3RhcnQiLCJQYWNrYWdlIiwiRmFjdHMiLCJpbmNyZW1lbnRTZXJ2ZXJGYWN0Iiwic2VuZFJlYWR5Iiwic3Vic2NyaXB0aW9uSWRzIiwic3VicyIsInN1YnNjcmlwdGlvbklkIiwic2VuZEFkZGVkIiwiY29sbGVjdGlvbiIsInNlbmRDaGFuZ2VkIiwic2VuZFJlbW92ZWQiLCJnZXRTZW5kQ2FsbGJhY2tzIiwiZ2V0Q29sbGVjdGlvblZpZXciLCJ2aWV3IiwiaGFuZGxlcnMiLCJ1bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyIsImhhbmRsZXIiLCJfc3RhcnRTdWJzY3JpcHRpb24iLCJzdG9wIiwiX21ldGVvclNlc3Npb24iLCJfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMiLCJfcmVtb3ZlU2Vzc2lvbiIsIl9wcmludFNlbnRERFAiLCJfZGVidWciLCJzdHJpbmdpZnlERFAiLCJzZW5kRXJyb3IiLCJyZWFzb24iLCJvZmZlbmRpbmdNZXNzYWdlIiwicHJvY2Vzc01lc3NhZ2UiLCJtc2dfaW4iLCJtZXNzYWdlUmVjZWl2ZWQiLCJwcm9jZXNzTmV4dCIsInNoaWZ0IiwidW5ibG9jayIsIm9uTWVzc2FnZUhvb2siLCJwcm90b2NvbF9oYW5kbGVycyIsImNhbGwiLCJzdWIiLCJuYW1lIiwicGFyYW1zIiwiQXJyYXkiLCJwdWJsaXNoX2hhbmRsZXJzIiwiZXJyb3IiLCJERFBSYXRlTGltaXRlciIsInJhdGVMaW1pdGVySW5wdXQiLCJ0eXBlIiwiY29ubmVjdGlvbklkIiwiX2luY3JlbWVudCIsInJhdGVMaW1pdFJlc3VsdCIsIl9jaGVjayIsImFsbG93ZWQiLCJnZXRFcnJvck1lc3NhZ2UiLCJ0aW1lVG9SZXNldCIsInVuc3ViIiwiX3N0b3BTdWJzY3JpcHRpb24iLCJtZXRob2QiLCJyYW5kb21TZWVkIiwiZmVuY2UiLCJfV3JpdGVGZW5jZSIsIm9uQWxsQ29tbWl0dGVkIiwicmV0aXJlIiwibWV0aG9kcyIsIm1ldGhvZF9oYW5kbGVycyIsImFybSIsInNldFVzZXJJZCIsIl9zZXRVc2VySWQiLCJpbnZvY2F0aW9uIiwiTWV0aG9kSW52b2NhdGlvbiIsImlzU2ltdWxhdGlvbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9DdXJyZW50V3JpdGVGZW5jZSIsIndpdGhWYWx1ZSIsIkREUCIsIl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsIm1heWJlQXVkaXRBcmd1bWVudENoZWNrcyIsImZpbmlzaCIsInBheWxvYWQiLCJ0aGVuIiwicmVzdWx0IiwiZXhjZXB0aW9uIiwid3JhcEludGVybmFsRXhjZXB0aW9uIiwiX2VhY2hTdWIiLCJmIiwiX2RpZmZDb2xsZWN0aW9uVmlld3MiLCJiZWZvcmVDVnMiLCJsZWZ0VmFsdWUiLCJyaWdodFZhbHVlIiwiZG9jIiwiX2RlYWN0aXZhdGUiLCJvbGROYW1lZFN1YnMiLCJuZXdTdWIiLCJfcmVjcmVhdGUiLCJfcnVuSGFuZGxlciIsIl9ub1lpZWxkc0FsbG93ZWQiLCJzdWJJZCIsIlN1YnNjcmlwdGlvbiIsInN1Yk5hbWUiLCJtYXliZVN1YiIsIl9uYW1lIiwiX3JlbW92ZUFsbERvY3VtZW50cyIsInJlc3BvbnNlIiwiaHR0cEZvcndhcmRlZENvdW50IiwicGFyc2VJbnQiLCJyZW1vdGVBZGRyZXNzIiwiZm9yd2FyZGVkRm9yIiwiaXNTdHJpbmciLCJ0cmltIiwic3BsaXQiLCJfaGFuZGxlciIsIl9zdWJzY3JpcHRpb25JZCIsIl9wYXJhbXMiLCJfc3Vic2NyaXB0aW9uSGFuZGxlIiwiX2RlYWN0aXZhdGVkIiwiX3N0b3BDYWxsYmFja3MiLCJfZG9jdW1lbnRzIiwiX3JlYWR5IiwiX2lkRmlsdGVyIiwiaWRTdHJpbmdpZnkiLCJNb25nb0lEIiwiaWRQYXJzZSIsInJlcyIsIl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIiwiZSIsIl9pc0RlYWN0aXZhdGVkIiwiX3B1Ymxpc2hIYW5kbGVyUmVzdWx0IiwiaXNDdXJzb3IiLCJjIiwiX3B1Ymxpc2hDdXJzb3IiLCJyZWFkeSIsImlzQXJyYXkiLCJhbGwiLCJjb2xsZWN0aW9uTmFtZXMiLCJfZ2V0Q29sbGVjdGlvbk5hbWUiLCJjdXIiLCJfY2FsbFN0b3BDYWxsYmFja3MiLCJjb2xsZWN0aW9uRG9jcyIsInN0cklkIiwib25TdG9wIiwiaWRzIiwiU2VydmVyIiwiZGVmYXVsdHMiLCJvbkNvbm5lY3Rpb25Ib29rIiwiSG9vayIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwic2Vzc2lvbnMiLCJzdHJlYW1fc2VydmVyIiwicmF3X21zZyIsIl9wcmludFJlY2VpdmVkRERQIiwicGFyc2VERFAiLCJfaGFuZGxlQ29ubmVjdCIsIm9uQ29ubmVjdGlvbiIsIm9uTWVzc2FnZSIsInN1cHBvcnQiLCJjb250YWlucyIsIlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMiLCJjYWxjdWxhdGVWZXJzaW9uIiwicHVibGlzaCIsImlzT2JqZWN0IiwiYXV0b3B1Ymxpc2giLCJpc19hdXRvIiwid2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoIiwiZnVuYyIsInBvcCIsImNhbGxBc3luYyIsImFwcGx5QXN5bmMiLCJhd2FpdCIsImN1cnJlbnRNZXRob2RJbnZvY2F0aW9uIiwiY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsIm1ha2VScGNTZWVkIiwiX3VybEZvclNlc3Npb24iLCJzZXNzaW9uSWQiLCJjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyIsInNlcnZlclN1cHBvcnRlZFZlcnNpb25zIiwiY29ycmVjdFZlcnNpb24iLCJfY2FsY3VsYXRlVmVyc2lvbiIsImNvbnRleHQiLCJpc0NsaWVudFNhZmUiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtZXNzYWdlIiwiZGV0YWlscyIsIl9leHBlY3RlZEJ5VGVzdCIsInN0YWNrIiwic2FuaXRpemVkRXJyb3IiLCJkZXNjcmlwdGlvbiIsIk1hdGNoIiwiX2ZhaWxJZkFyZ3VtZW50c0FyZU5vdEFsbENoZWNrZWQiLCJGdXR1cmUiLCJhcm1lZCIsImZpcmVkIiwicmV0aXJlZCIsIm91dHN0YW5kaW5nX3dyaXRlcyIsImJlZm9yZV9maXJlX2NhbGxiYWNrcyIsImNvbXBsZXRpb25fY2FsbGJhY2tzIiwiRW52aXJvbm1lbnRWYXJpYWJsZSIsImJlZ2luV3JpdGUiLCJjb21taXR0ZWQiLCJfbWF5YmVGaXJlIiwib25CZWZvcmVGaXJlIiwiYXJtQW5kV2FpdCIsImZ1dHVyZSIsIndhaXQiLCJpbnZva2VDYWxsYmFjayIsIl9Dcm9zc2JhciIsIm5leHRJZCIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbiIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50IiwiZmFjdFBhY2thZ2UiLCJmYWN0TmFtZSIsIl9jb2xsZWN0aW9uRm9yTWVzc2FnZSIsImxpc3RlbiIsInRyaWdnZXIiLCJyZWNvcmQiLCJmaXJlIiwibm90aWZpY2F0aW9uIiwibGlzdGVuZXJzRm9yQ29sbGVjdGlvbiIsImNhbGxiYWNrSWRzIiwibCIsIl9tYXRjaGVzIiwiT2JqZWN0SUQiLCJ0cmlnZ2VyVmFsdWUiLCJfSW52YWxpZGF0aW9uQ3Jvc3NiYXIiLCJERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCIsInJlZnJlc2giLCJkZWZhdWx0X3NlcnZlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsR0FBRyxHQUFHQyxHQUFHLENBQUNDLE9BQUosQ0FBWSxLQUFaLENBQVYsQyxDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLG1CQUFtQixHQUFHQyxDQUFDLENBQUNDLElBQUYsQ0FBTyxZQUFZO0FBQzNDLE1BQUlDLFVBQVUsR0FBRyxFQUFqQjtBQUVBLE1BQUlDLDBCQUEwQixHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQVosR0FDN0JDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQXZCLENBRDZCLEdBQzBCLEVBRDNEOztBQUVBLE1BQUlILDBCQUFKLEVBQWdDO0FBQzlCRCxjQUFVLENBQUNPLElBQVgsQ0FBZ0JaLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLG9CQUFaLEVBQWtDWSxTQUFsQyxDQUNkUCwwQkFEYyxD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QUFnQixJQUFJeVMsTUFBSixFQUFoQjs7QUFFQXBMLE1BQU0sQ0FBQ3VRLE9BQVAsR0FBaUIsVUFBVVQsWUFBVixFQUF3QjtBQUN2Q3RVLFdBQVMsQ0FBQzZVLHFCQUFWLENBQWdDUixJQUFoQyxDQUFxQ0MsWUFBckM7QUFDRCxDQUZELEMsQ0FJQTtBQUNBOzs7QUFDQW5aLENBQUMsQ0FBQ3dELElBQUYsQ0FBTyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCLE9BQS9CLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELENBQVAsRUFDTyxVQUFVeUssSUFBVixFQUFnQjtBQUNkNUUsUUFBTSxDQUFDNEUsSUFBRCxDQUFOLEdBQWVqTyxDQUFDLENBQUM0SCxJQUFGLENBQU95QixNQUFNLENBQUNySCxNQUFQLENBQWNpTSxJQUFkLENBQVAsRUFBNEI1RSxNQUFNLENBQUNySCxNQUFuQyxDQUFmO0FBQ0QsQ0FIUixFLENBS0E7QUFDQTtBQUNBOzs7QUFDQXFILE1BQU0sQ0FBQ3dRLGNBQVAsR0FBd0J4USxNQUFNLENBQUNySCxNQUEvQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9kZHAtc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHVybCA9IE5wbS5yZXF1aXJlKCd1cmwnKTtcblxuLy8gQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBwZXJtZXNzYWdlLWRlZmxhdGUgZXh0ZW5zaW9uIHdpdGggZGVmYXVsdFxuLy8gY29uZmlndXJhdGlvbi4gSWYgJFNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04gaXMgc2V0LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRcbi8vIEpTT04uIElmIGl0IHJlcHJlc2VudHMgYSBmYWxzZXkgdmFsdWUsIHRoZW4gd2UgZG8gbm90IHVzZSBwZXJtZXNzYWdlLWRlZmxhdGVcbi8vIGF0IGFsbDsgb3RoZXJ3aXNlLCB0aGUgSlNPTiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGRlZmxhdGUnc1xuLy8gY29uZmlndXJlIG1ldGhvZDsgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmF5ZS9wZXJtZXNzYWdlLWRlZmxhdGUtbm9kZS9ibG9iL21hc3Rlci9SRUFETUUubWRcbi8vXG4vLyAoV2UgZG8gdGhpcyBpbiBhbiBfLm9uY2UgaW5zdGVhZCBvZiBhdCBzdGFydHVwLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG9cbi8vIGNyYXNoIHRoZSB0b29sIGR1cmluZyBpc29wYWNrZXQgbG9hZCBpZiB5b3VyIEpTT04gZG9lc24ndCBwYXJzZS4gVGhpcyBpcyBvbmx5XG4vLyBhIHByb2JsZW0gYmVjYXVzZSB0aGUgdG9vbCBoYXMgdG8gbG9hZCB0aGUgRERQIHNlcnZlciBjb2RlIGp1c3QgaW4gb3JkZXIgdG9cbi8vIGJlIGEgRERQIGNsaWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRlb3IvbWV0ZW9yL2lzc3Vlcy8zNDUyIC4pXG52YXIgd2Vic29ja2V0RXh0ZW5zaW9ucyA9IF8ub25jZShmdW5jdGlvbiAoKSB7XG4gIHZhciBleHRlbnNpb25zID0gW107XG5cbiAgdmFyIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnID0gcHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTlxuICAgID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5TRVJWRVJfV0VCU09DS0VUX0NPTVBSRVNTSU9OKSA6IHt9O1xuICBpZiAod2Vic29ja2V0Q29tcHJlc3Npb25Db25maWcpIHtcbiAgICBleHRlbnNpb25zLnB1c2goTnBtLnJlcXVpcmUoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpLmNvbmZpZ3VyZShcbiAgICAgIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnXG4gICAgKSk7XG4gIH1cblxuICByZXR1cm4gZXh0ZW5zaW9ucztcbn0pO1xuXG52YXIgcGF0aFByZWZpeCA9IF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVggfHwgXCJcIjtcblxuU3RyZWFtU2VydmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVnaXN0cmF0aW9uX2NhbGxiYWNrcyA9IFtdO1xuICBzZWxmLm9wZW5fc29ja2V0cyA9IFtdO1xuXG4gIC8vIEJlY2F1c2Ugd2UgYXJlIGluc3RhbGxpbmcgZGlyZWN0bHkgb250byBXZWJBcHAuaHR0cFNlcnZlciBpbnN0ZWFkIG9mIHVzaW5nXG4gIC8vIFdlYkFwcC5hcHAsIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGUgcGF0aCBwcmVmaXggb3Vyc2VsdmVzLlxuICBzZWxmLnByZWZpeCA9IHBhdGhQcmVmaXggKyAnL3NvY2tqcyc7XG4gIFJvdXRlUG9saWN5LmRlY2xhcmUoc2VsZi5wcmVmaXggKyAnLycsICduZXR3b3JrJyk7XG5cbiAgLy8gc2V0IHVwIHNvY2tqc1xuICB2YXIgc29ja2pzID0gTnBtLnJlcXVpcmUoJ3NvY2tqcycpO1xuICB2YXIgc2VydmVyT3B0aW9ucyA9IHtcbiAgICBwcmVmaXg6IHNlbGYucHJlZml4LFxuICAgIGxvZzogZnVuY3Rpb24gKCkgeyB9LFxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBjb2RlIGl0IGV4cGxpY2l0bHkgYmVjYXVzZSB3ZSBkZXBlbmRcbiAgICAvLyBvbiBpdCBpbiBzdHJlYW1fY2xpZW50OkhFQVJUQkVBVF9USU1FT1VUXG4gICAgaGVhcnRiZWF0X2RlbGF5OiA0NTAwMCxcbiAgICAvLyBUaGUgZGVmYXVsdCBkaXNjb25uZWN0X2RlbGF5IGlzIDUgc2Vjb25kcywgYnV0IGlmIHRoZSBzZXJ2ZXIgZW5kcyB1cCBDUFVcbiAgICAvLyBib3VuZCBmb3IgdGhhdCBtdWNoIHRpbWUsIFNvY2tKUyBtaWdodCBub3Qgbm90aWNlIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgLy8gcmVjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdGltZXIgKG9mIGRpc2Nvbm5lY3RfZGVsYXkgbXMpIGNhbiBmaXJlIGJlZm9yZVxuICAgIC8vIFNvY2tKUyBwcm9jZXNzZXMgdGhlIG5ldyBjb25uZWN0aW9uLiBFdmVudHVhbGx5IHdlJ2xsIGZpeCB0aGlzIGJ5IG5vdFxuICAgIC8vIGNvbWJpbmluZyBDUFUtaGVhdnkgcHJvY2Vzc2luZyB3aXRoIFNvY2tKUyB0ZXJtaW5hdGlvbiAoZWcgYSBwcm94eSB3aGljaFxuICAgIC8vIGNvbnZlcnRzIHRvIFVuaXggc29ja2V0cykgYnV0IGZvciBub3csIHJhaXNlIHRoZSBkZWxheS5cbiAgICBkaXNjb25uZWN0X2RlbGF5OiA2MCAqIDEwMDAsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklELFxuICAgIC8vIOemgeeUqGNvcnPvvIzpmLLmraLor7fmsYJyZXNwb25zZei/lOWbnkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjoqXG4gICAgZGlzYWJsZV9jb3JzOiB0cnVlXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICYmIHNvY2tldC5fc2Vzc2lvbi5yZWN2KSB7XG4gICAgICAgIHNvY2tldC5fc2Vzc2lvbi5yZWN2LmNvbm5lY3Rpb24uc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDQ1ICogMTAwMCk7XG5cbiAgICBzb2NrZXQuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBzb2NrZXQud3JpdGUoZGF0YSk7XG4gICAgfTtcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vcGVuX3NvY2tldHMgPSBfLndpdGhvdXQoc2VsZi5vcGVuX3NvY2tldHMsIHNvY2tldCk7XG4gICAgfSk7XG4gICAgc2VsZi5vcGVuX3NvY2tldHMucHVzaChzb2NrZXQpO1xuXG4gICAgLy8gWFhYIENPTVBBVCBXSVRIIDAuNi42LiBTZW5kIHRoZSBvbGQgc3R5bGUgd2VsY29tZSBtZXNzYWdlLCB3aGljaFxuICAgIC8vIHdpbGwgZm9yY2Ugb2xkIGNsaWVudHMgdG8gcmVsb2FkLiBSZW1vdmUgdGhpcyBvbmNlIHdlJ3JlIG5vdFxuICAgIC8vIGNvbmNlcm5lZCBhYm91dCBwZW9wbGUgdXBncmFkaW5nIGZyb20gYSBwcmUtMC43LjAgcmVsZWFzZS4gQWxzbyxcbiAgICAvLyByZW1vdmUgdGhlIGNsYXVzZSBpbiB0aGUgY2xpZW50IHRoYXQgaWdub3JlcyB0aGUgd2VsY29tZSBtZXNzYWdlXG4gICAgLy8gKGxpdmVkYXRhX2Nvbm5lY3Rpb24uanMpXG4gICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBzZXJ2ZXJfaWQ6IFwiMFwiIH0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgdXNlIGEgY29ubmVjdCBtaWRkbGV3YXJlIGhlcmUgc2luY2VcbiAgICAvLyBzb2NranMgaW5zdGFsbHMgaXRzZWxmIHByaW9yIHRvIGFsbCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAvLyAobWVhbmluZyBwcmlvciB0byBhbnkgY29ubmVjdCBtaWRkbGV3YXJlcykgc28gd2UgbmVlZCB0byB0YWtlXG4gICAgLy8gYW4gYXBwcm9hY2ggc2ltaWxhciB0byBvdmVyc2hhZG93TGlzdGVuZXJzIGluXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NvY2tqcy9zb2NranMtbm9kZS9ibG9iL2NmODIwYzU1YWY2YTk5NTNlMTY1NTg1NTVhMzFkZWNlYTU1NGY3MGUvc3JjL3V0aWxzLmNvZmZlZVxuICAgIF8uZWFjaChbJ3JlcXVlc3QnLCAndXBncmFkZSddLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBodHRwU2VydmVyID0gV2ViQXBwLmh0dHBTZXJ2ZXI7XG4gICAgICB2YXIgb2xkSHR0cFNlcnZlckxpc3RlbmVycyA9IGh0dHBTZXJ2ZXIubGlzdGVuZXJzKGV2ZW50KS5zbGljZSgwKTtcbiAgICAgIGh0dHBTZXJ2ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KTtcblxuICAgICAgLy8gcmVxdWVzdCBhbmQgdXBncmFkZSBoYXZlIGRpZmZlcmVudCBhcmd1bWVudHMgcGFzc2VkIGJ1dFxuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCBvbmUgd2hpY2ggaXMgYWx3YXlzIHJlcXVlc3RcbiAgICAgIHZhciBuZXdMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQvJykge1xuICAgICAgICAgIHBhcnNlZFVybC5wYXRobmFtZSA9IHNlbGYucHJlZml4ICsgJy93ZWJzb2NrZXQnO1xuICAgICAgICAgIHJlcXVlc3QudXJsID0gdXJsLmZvcm1hdChwYXJzZWRVcmwpO1xuICAgICAgICB9XG4gICAgICAgIF8uZWFjaChvbGRIdHRwU2VydmVyTGlzdGVuZXJzLCBmdW5jdGlvbiAob2xkTGlzdGVuZXIpIHtcbiAgICAgICAgICBvbGRMaXN0ZW5lci5hcHBseShodHRwU2VydmVyLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihldmVudCwgbmV3TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIkREUFNlcnZlciA9IHt9O1xuXG52YXIgRmliZXIgPSBOcG0ucmVxdWlyZSgnZmliZXJzJyk7XG5cbi8vIFRoaXMgZmlsZSBjb250YWlucyBjbGFzc2VzOlxuLy8gKiBTZXNzaW9uIC0gVGhlIHNlcnZlcidzIGNvbm5lY3Rpb24gdG8gYSBzaW5nbGUgRERQIGNsaWVudFxuLy8gKiBTdWJzY3JpcHRpb24gLSBBIHNpbmdsZSBzdWJzY3JpcHRpb24gZm9yIGEgc2luZ2xlIGNsaWVudFxuLy8gKiBTZXJ2ZXIgLSBBbiBlbnRpcmUgc2VydmVyIHRoYXQgbWF5IHRhbGsgdG8gPiAxIGNsaWVudC4gQSBERFAgZW5kcG9pbnQuXG4vL1xuLy8gU2Vzc2lvbiBhbmQgU3Vic2NyaXB0aW9uIGFyZSBmaWxlIHNjb3BlLiBGb3Igbm93LCB1bnRpbCB3ZSBmcmVlemVcbi8vIHRoZSBpbnRlcmZhY2UsIFNlcnZlciBpcyBwYWNrYWdlIHNjb3BlIChpbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBiZVxuLy8gZXhwb3J0ZWQuKVxuXG4vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGRvY3VtZW50IGluIGEgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG52YXIgU2Vzc2lvbkRvY3VtZW50VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmV4aXN0c0luID0gbmV3IFNldCgpOyAvLyBzZXQgb2Ygc3Vic2NyaXB0aW9uSGFuZGxlXG4gIHNlbGYuZGF0YUJ5S2V5ID0gbmV3IE1hcCgpOyAvLyBrZXktPiBbIHtzdWJzY3JpcHRpb25IYW5kbGUsIHZhbHVlfSBieSBwcmVjZWRlbmNlXVxufTtcblxuRERQU2VydmVyLl9TZXNzaW9uRG9jdW1lbnRWaWV3ID0gU2Vzc2lvbkRvY3VtZW50VmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uRG9jdW1lbnRWaWV3LnByb3RvdHlwZSwge1xuXG4gIGdldEZpZWxkczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0ge307XG4gICAgc2VsZi5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgcmV0W2tleV0gPSBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGNsZWFyRmllbGQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlQ29sbGVjdG9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcblxuICAgIC8vIEl0J3Mgb2theSB0byBjbGVhciBmaWVsZHMgdGhhdCBkaWRuJ3QgZXhpc3QuIE5vIG5lZWQgdG8gdGhyb3dcbiAgICAvLyBhbiBlcnJvci5cbiAgICBpZiAoIXByZWNlZGVuY2VMaXN0KVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJlbW92ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWNlZGVuY2VMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJlY2VkZW5jZSA9IHByZWNlZGVuY2VMaXN0W2ldO1xuICAgICAgaWYgKHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGUpIHtcbiAgICAgICAgLy8gVGhlIHZpZXcncyB2YWx1ZSBjYW4gb25seSBjaGFuZ2UgaWYgdGhpcyBzdWJzY3JpcHRpb24gaXMgdGhlIG9uZSB0aGF0XG4gICAgICAgIC8vIHVzZWQgdG8gaGF2ZSBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoaSA9PT0gMClcbiAgICAgICAgICByZW1vdmVkVmFsdWUgPSBwcmVjZWRlbmNlLnZhbHVlO1xuICAgICAgICBwcmVjZWRlbmNlTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJlY2VkZW5jZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5kZWxldGUoa2V5KTtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlZFZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICFFSlNPTi5lcXVhbHMocmVtb3ZlZFZhbHVlLCBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZSkpIHtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZUZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUNvbGxlY3RvciwgaXNBZGQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gUHVibGlzaCBBUEkgaWdub3JlcyBfaWQgaWYgcHJlc2VudCBpbiBmaWVsZHNcbiAgICBpZiAoa2V5ID09PSBcIl9pZFwiKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gRG9uJ3Qgc2hhcmUgc3RhdGUgd2l0aCB0aGUgZGF0YSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuXG4gICAgdmFsdWUgPSBFSlNPTi5jbG9uZSh2YWx1ZSk7XG5cbiAgICBpZiAoIXNlbGYuZGF0YUJ5S2V5LmhhcyhrZXkpKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5zZXQoa2V5LCBbe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWV9XSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcbiAgICB2YXIgZWx0O1xuICAgIGlmICghaXNBZGQpIHtcbiAgICAgIGVsdCA9IHByZWNlZGVuY2VMaXN0LmZpbmQoZnVuY3Rpb24gKHByZWNlZGVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gcHJlY2VkZW5jZS5zdWJzY3JpcHRpb25IYW5kbGUgPT09IHN1YnNjcmlwdGlvbkhhbmRsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbHQpIHtcbiAgICAgIGlmIChlbHQgPT09IHByZWNlZGVuY2VMaXN0WzBdICYmICFFSlNPTi5lcXVhbHModmFsdWUsIGVsdC52YWx1ZSkpIHtcbiAgICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuXG4gICAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBlbHQudmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgbmV3bHkgY2FyaW5nIGFib3V0IHRoaXMgZmllbGRcbiAgICAgIHByZWNlZGVuY2VMaXN0LnB1c2goe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZTogdmFsdWV9KTtcbiAgICB9XG5cbiAgfVxufSk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNsaWVudCdzIHZpZXcgb2YgYSBzaW5nbGUgY29sbGVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaXQgcmVwcmVzZW50c1xuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBzZXNzaW9uQ2FsbGJhY2tzIFRoZSBjYWxsYmFja3MgZm9yIGFkZGVkLCBjaGFuZ2VkLCByZW1vdmVkXG4gKiBAY2xhc3MgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG4gKi9cbnZhciBTZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHNlc3Npb25DYWxsYmFja3MpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7XG4gIHNlbGYuZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuICBzZWxmLmNhbGxiYWNrcyA9IHNlc3Npb25DYWxsYmFja3M7XG59O1xuXG5ERFBTZXJ2ZXIuX1Nlc3Npb25Db2xsZWN0aW9uVmlldyA9IFNlc3Npb25Db2xsZWN0aW9uVmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uQ29sbGVjdGlvblZpZXcucHJvdG90eXBlLCB7XG5cbiAgaXNFbXB0eTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5kb2N1bWVudHMuc2l6ZSA9PT0gMDtcbiAgfSxcblxuICBkaWZmOiBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZNYXBzKHByZXZpb3VzLmRvY3VtZW50cywgc2VsZi5kb2N1bWVudHMsIHtcbiAgICAgIGJvdGg6IF8uYmluZChzZWxmLmRpZmZEb2N1bWVudCwgc2VsZiksXG5cbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGlkLCBub3dEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgbm93RFYuZ2V0RmllbGRzKCkpO1xuICAgICAgfSxcblxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uIChpZCwgcHJldkRWKSB7XG4gICAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGRpZmZEb2N1bWVudDogZnVuY3Rpb24gKGlkLCBwcmV2RFYsIG5vd0RWKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmaWVsZHMgPSB7fTtcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk9iamVjdHMocHJldkRWLmdldEZpZWxkcygpLCBub3dEVi5nZXRGaWVsZHMoKSwge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGtleSwgcHJldiwgbm93KSB7XG4gICAgICAgIGlmICghRUpTT04uZXF1YWxzKHByZXYsIG5vdykpXG4gICAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoa2V5LCBub3cpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uKGtleSwgcHJldikge1xuICAgICAgICBmaWVsZHNba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIGFkZGVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICB2YXIgYWRkZWQgPSBmYWxzZTtcbiAgICBpZiAoIWRvY1ZpZXcpIHtcbiAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgIGRvY1ZpZXcgPSBuZXcgU2Vzc2lvbkRvY3VtZW50VmlldygpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuc2V0KGlkLCBkb2NWaWV3KTtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5hZGQoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICB2YXIgY2hhbmdlQ29sbGVjdG9yID0ge307XG4gICAgXy5lYWNoKGZpZWxkcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoXG4gICAgICAgIHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlQ29sbGVjdG9yLCB0cnVlKTtcbiAgICB9KTtcbiAgICBpZiAoYWRkZWQpXG4gICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VDb2xsZWN0b3IpO1xuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBjaGFuZ2VkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFuZ2VkUmVzdWx0ID0ge307XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGVsZW1lbnQgd2l0aCBpZCBcIiArIGlkICsgXCIgdG8gY2hhbmdlXCIpO1xuICAgIF8uZWFjaChjaGFuZ2VkLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIGRvY1ZpZXcuY2xlYXJGaWVsZChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgICBlbHNlXG4gICAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLCBjaGFuZ2VkUmVzdWx0KTtcbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkUmVzdWx0KTtcbiAgfSxcblxuICByZW1vdmVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiUmVtb3ZlZCBub25leGlzdGVudCBkb2N1bWVudCBcIiArIGlkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5kZWxldGUoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICBpZiAoZG9jVmlldy5leGlzdHNJbi5zaXplID09PSAwKSB7XG4gICAgICAvLyBpdCBpcyBnb25lIGZyb20gZXZlcnlvbmVcbiAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuZGVsZXRlKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNoYW5nZWQgPSB7fTtcbiAgICAgIC8vIHJlbW92ZSB0aGlzIHN1YnNjcmlwdGlvbiBmcm9tIGV2ZXJ5IHByZWNlZGVuY2UgbGlzdFxuICAgICAgLy8gYW5kIHJlY29yZCB0aGUgY2hhbmdlc1xuICAgICAgZG9jVmlldy5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlbGYuY2FsbGJhY2tzLmNoYW5nZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZWQpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIFNlc3Npb24gPSBmdW5jdGlvbiAoc2VydmVyLCB2ZXJzaW9uLCBzb2NrZXQsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmlkID0gUmFuZG9tLmlkKCk7XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHNlbGYudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgc2VsZi5pbml0aWFsaXplZCA9IGZhbHNlO1xuICBzZWxmLnNvY2tldCA9IHNvY2tldDtcblxuICAvLyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGRlc3Ryb3llZC4gbXVsdGlwbGUgcGxhY2VzIGJlbG93XG4gIC8vIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBpcyBhbGl2ZSBvciBub3QuXG4gIHNlbGYuaW5RdWV1ZSA9IG5ldyBNZXRlb3IuX0RvdWJsZUVuZGVkUXVldWUoKTtcblxuICBzZWxmLmJsb2NrZWQgPSBmYWxzZTtcbiAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG5cbiAgLy8gU3ViIG9iamVjdHMgZm9yIGFjdGl2ZSBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gIHNlbGYudXNlcklkID0gbnVsbDtcblxuICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcblxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSB0byBub3Qgc2VuZCBtZXNzYWdlcyB3aGVuIGNvbGxlY3Rpb25WaWV3cyBhcmVcbiAgLy8gbW9kaWZpZWQuIFRoaXMgaXMgZG9uZSB3aGVuIHJlcnVubmluZyBzdWJzIGluIF9zZXRVc2VySWQgYW5kIHRob3NlIG1lc3NhZ2VzXG4gIC8vIGFyZSBjYWxjdWxhdGVkIHZpYSBhIGRpZmYgaW5zdGVhZC5cbiAgc2VsZi5faXNTZW5kaW5nID0gdHJ1ZTtcblxuICAvLyBJZiB0aGlzIGlzIHRydWUsIGRvbid0IHN0YXJ0IGEgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgcHVibGlzaGVyIG9uIHRoaXNcbiAgLy8gc2Vzc2lvbi4gVGhlIHNlc3Npb24gd2lsbCB0YWtlIGNhcmUgb2Ygc3RhcnRpbmcgaXQgd2hlbiBhcHByb3ByaWF0ZS5cbiAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gd2UgYXJlIHJlcnVubmluZyBzdWJzY3JpcHRpb25zLCBhbnkgcmVhZHkgbWVzc2FnZXNcbiAgLy8gd2Ugd2FudCB0byBidWZmZXIgdXAgZm9yIHdoZW4gd2UgYXJlIGRvbmUgcmVydW5uaW5nIHN1YnNjcmlwdGlvbnNcbiAgc2VsZi5fcGVuZGluZ1JlYWR5ID0gW107XG5cbiAgLy8gTGlzdCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIHRoaXMgY29ubmVjdGlvbiBpcyBjbG9zZWQuXG4gIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzID0gW107XG5cblxuICAvLyBYWFggSEFDSzogSWYgYSBzb2NranMgY29ubmVjdGlvbiwgc2F2ZSBvZmYgdGhlIFVSTC4gVGhpcyBpc1xuICAvLyB0ZW1wb3JhcnkgYW5kIHdpbGwgZ28gYXdheSBpbiB0aGUgbmVhciBmdXR1cmUuXG4gIHNlbGYuX3NvY2tldFVybCA9IHNvY2tldC51cmw7XG5cbiAgLy8gQWxsb3cgdGVzdHMgdG8gZGlzYWJsZSByZXNwb25kaW5nIHRvIHBpbmdzLlxuICBzZWxmLl9yZXNwb25kVG9QaW5ncyA9IG9wdGlvbnMucmVzcG9uZFRvUGluZ3M7XG5cbiAgLy8gVGhpcyBvYmplY3QgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIHNlc3Npb24uIEluIHRoZSBwdWJsaWNcbiAgLy8gQVBJLCBpdCBpcyBjYWxsZWQgdGhlIGBjb25uZWN0aW9uYCBvYmplY3QuICBJbnRlcm5hbGx5IHdlIGNhbGwgaXRcbiAgLy8gYSBgY29ubmVjdGlvbkhhbmRsZWAgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICBzZWxmLmNvbm5lY3Rpb25IYW5kbGUgPSB7XG4gICAgaWQ6IHNlbGYuaWQsXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICB9LFxuICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIChmbikge1xuICAgICAgdmFyIGNiID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmbiwgXCJjb25uZWN0aW9uIG9uQ2xvc2UgY2FsbGJhY2tcIik7XG4gICAgICBpZiAoc2VsZi5pblF1ZXVlKSB7XG4gICAgICAgIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBjbG9zZWQsIGNhbGwgdGhlIGNhbGxiYWNrLlxuICAgICAgICBNZXRlb3IuZGVmZXIoY2IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xpZW50QWRkcmVzczogc2VsZi5fY2xpZW50QWRkcmVzcygpLFxuICAgIGh0dHBIZWFkZXJzOiBzZWxmLnNvY2tldC5oZWFkZXJzXG4gIH07XG5cbiAgc2VsZi5zZW5kKHsgbXNnOiAnY29ubmVjdGVkJywgc2Vzc2lvbjogc2VsZi5pZCB9KTtcblxuICAvLyBPbiBpbml0aWFsIGNvbm5lY3QsIHNwaW4gdXAgYWxsIHRoZSB1bml2ZXJzYWwgcHVibGlzaGVycy5cbiAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gIH0pLnJ1bigpO1xuXG4gIGlmICh2ZXJzaW9uICE9PSAncHJlMScgJiYgb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCAhPT0gMCkge1xuICAgIC8vIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBsb3cgbGV2ZWwgdGltZW91dCBiZWNhdXNlIHdlIGhhdmUgaGVhcnRiZWF0aW5nLlxuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDApO1xuXG4gICAgc2VsZi5oZWFydGJlYXQgPSBuZXcgRERQQ29tbW9uLkhlYXJ0YmVhdCh7XG4gICAgICBoZWFydGJlYXRJbnRlcnZhbDogb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCxcbiAgICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCxcbiAgICAgIG9uVGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgc2VuZFBpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6ICdwaW5nJ30pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYuaGVhcnRiZWF0LnN0YXJ0KCk7XG4gIH1cblxuICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU2Vzc2lvbi5wcm90b3R5cGUsIHtcblxuICBzZW5kUmVhZHk6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlYWR5XCIsIHN1YnM6IHN1YnNjcmlwdGlvbklkc30pO1xuICAgIGVsc2Uge1xuICAgICAgXy5lYWNoKHN1YnNjcmlwdGlvbklkcywgZnVuY3Rpb24gKHN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeS5wdXNoKHN1YnNjcmlwdGlvbklkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzZW5kQWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKVxuICAgICAgc2VsZi5zZW5kKHttc2c6IFwiYWRkZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZCwgZmllbGRzOiBmaWVsZHN9KTtcbiAgfSxcblxuICBzZW5kQ2hhbmdlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChfLmlzRW1wdHkoZmllbGRzKSlcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpIHtcbiAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgIG1zZzogXCJjaGFuZ2VkXCIsXG4gICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZFJlbW92ZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlbW92ZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZH0pO1xuICB9LFxuXG4gIGdldFNlbmRDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGVkOiBfLmJpbmQoc2VsZi5zZW5kQWRkZWQsIHNlbGYpLFxuICAgICAgY2hhbmdlZDogXy5iaW5kKHNlbGYuc2VuZENoYW5nZWQsIHNlbGYpLFxuICAgICAgcmVtb3ZlZDogXy5iaW5kKHNlbGYuc2VuZFJlbW92ZWQsIHNlbGYpXG4gICAgfTtcbiAgfSxcblxuICBnZXRDb2xsZWN0aW9uVmlldzogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXQgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cy5nZXQoY29sbGVjdGlvbk5hbWUpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICByZXQgPSBuZXcgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0U2VuZENhbGxiYWNrcygpKTtcbiAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLnNldChjb2xsZWN0aW9uTmFtZSwgcmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHZpZXcgPSBzZWxmLmdldENvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lKTtcbiAgICB2aWV3LmFkZGVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5yZW1vdmVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpO1xuICAgIGlmICh2aWV3LmlzRW1wdHkoKSkge1xuICAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLmRlbGV0ZShjb2xsZWN0aW9uTmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5jaGFuZ2VkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgc3RhcnRVbml2ZXJzYWxTdWJzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgdGhlIHNldCBvZiB1bml2ZXJzYWwgaGFuZGxlcnMgYW5kIHN0YXJ0IHRoZW0uIElmXG4gICAgLy8gYWRkaXRpb25hbCB1bml2ZXJzYWwgcHVibGlzaGVycyBzdGFydCB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoZW0gKGR1ZSB0b1xuICAgIC8vIHlpZWxkaW5nKSwgdGhleSB3aWxsIHJ1biBzZXBhcmF0ZWx5IGFzIHBhcnQgb2YgU2VydmVyLnB1Ymxpc2guXG4gICAgdmFyIGhhbmRsZXJzID0gXy5jbG9uZShzZWxmLnNlcnZlci51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyk7XG4gICAgXy5lYWNoKGhhbmRsZXJzLCBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24gYW5kIHVucmVnaXN0ZXIgaXQgYXQgdGhlIHNlcnZlci5cbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBEZXN0cm95IHRoaXMgc2Vzc2lvbiwgZXZlbiBpZiBpdCdzIG5vdCByZWdpc3RlcmVkIGF0IHRoZVxuICAgIC8vIHNlcnZlci4gU3RvcCBhbGwgcHJvY2Vzc2luZyBhbmQgdGVhciBldmVyeXRoaW5nIGRvd24uIElmIGEgc29ja2V0XG4gICAgLy8gd2FzIGF0dGFjaGVkLCBjbG9zZSBpdC5cblxuICAgIC8vIEFscmVhZHkgZGVzdHJveWVkLlxuICAgIGlmICghIHNlbGYuaW5RdWV1ZSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERyb3AgdGhlIG1lcmdlIGJveCBkYXRhIGltbWVkaWF0ZWx5LlxuICAgIHNlbGYuaW5RdWV1ZSA9IG51bGw7XG4gICAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoc2VsZi5oZWFydGJlYXQpIHtcbiAgICAgIHNlbGYuaGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIHNlbGYuaGVhcnRiZWF0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5zb2NrZXQpIHtcbiAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCk7XG4gICAgICBzZWxmLnNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIC0xKTtcblxuICAgIE1ldGVvci5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdG9wIGNhbGxiYWNrcyBjYW4geWllbGQsIHNvIHdlIGRlZmVyIHRoaXMgb24gY2xvc2UuXG4gICAgICAvLyBzdWIuX2lzRGVhY3RpdmF0ZWQoKSBkZXRlY3RzIHRoYXQgd2Ugc2V0IGluUXVldWUgdG8gbnVsbCBhbmRcbiAgICAgIC8vIHRyZWF0cyBpdCBhcyBzZW1pLWRlYWN0aXZhdGVkIChpdCB3aWxsIGlnbm9yZSBpbmNvbWluZyBjYWxsYmFja3MsIGV0YykuXG4gICAgICBzZWxmLl9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9ucygpO1xuXG4gICAgICAvLyBEZWZlciBjYWxsaW5nIHRoZSBjbG9zZSBjYWxsYmFja3MsIHNvIHRoYXQgdGhlIGNhbGxlciBjbG9zaW5nXG4gICAgICAvLyB0aGUgc2Vzc2lvbiBpc24ndCB3YWl0aW5nIGZvciBhbGwgdGhlIGNhbGxiYWNrcyB0byBjb21wbGV0ZS5cbiAgICAgIF8uZWFjaChzZWxmLl9jbG9zZUNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFVucmVnaXN0ZXIgdGhlIHNlc3Npb24uXG4gICAgc2VsZi5zZXJ2ZXIuX3JlbW92ZVNlc3Npb24oc2VsZik7XG4gIH0sXG5cbiAgLy8gU2VuZCBhIG1lc3NhZ2UgKGRvaW5nIG5vdGhpbmcgaWYgbm8gc29ja2V0IGlzIGNvbm5lY3RlZCByaWdodCBub3cuKVxuICAvLyBJdCBzaG91bGQgYmUgYSBKU09OIG9iamVjdCAoaXQgd2lsbCBiZSBzdHJpbmdpZmllZC4pXG4gIHNlbmQ6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFNlbnRERFApXG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJTZW50IEREUFwiLCBERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgICAgc2VsZi5zb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZW5kIGEgY29ubmVjdGlvbiBlcnJvci5cbiAgc2VuZEVycm9yOiBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBtc2cgPSB7bXNnOiAnZXJyb3InLCByZWFzb246IHJlYXNvbn07XG4gICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgc2VsZi5zZW5kKG1zZyk7XG4gIH0sXG5cbiAgLy8gUHJvY2VzcyAnbXNnJyBhcyBhbiBpbmNvbWluZyBtZXNzYWdlLiAoQnV0IGFzIGEgZ3VhcmQgYWdhaW5zdFxuICAvLyByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJlY29ubmVjdGlvbiwgaWdub3JlIHRoZSBtZXNzYWdlIGlmXG4gIC8vICdzb2NrZXQnIGlzIG5vdCB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBzb2NrZXQuKVxuICAvL1xuICAvLyBXZSBydW4gdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCBvbmUgYXQgYSB0aW1lLCBpbiB0aGUgb3JkZXJcbiAgLy8gZ2l2ZW4gYnkgdGhlIGNsaWVudC4gVGhlIG1lc3NhZ2UgaGFuZGxlciBpcyBwYXNzZWQgYW4gaWRlbXBvdGVudFxuICAvLyBmdW5jdGlvbiAndW5ibG9jaycgd2hpY2ggaXQgbWF5IGNhbGwgdG8gYWxsb3cgb3RoZXIgbWVzc2FnZXMgdG9cbiAgLy8gYmVnaW4gcnVubmluZyBpbiBwYXJhbGxlbCBpbiBhbm90aGVyIGZpYmVyIChmb3IgZXhhbXBsZSwgYSBtZXRob2RcbiAgLy8gdGhhdCB3YW50cyB0byB5aWVsZC4pIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseSB1bmJsb2NrZWRcbiAgLy8gd2hlbiBpdCByZXR1cm5zLlxuICAvL1xuICAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgaGF2ZSB0byAndG90YWxseSBvcmRlcicgdGhlIG1lc3NhZ2VzIGluIHRoaXNcbiAgLy8gd2F5LCBidXQgaXQncyB0aGUgZWFzaWVzdCB0aGluZyB0aGF0J3MgY29ycmVjdC4gKHVuc3ViIG5lZWRzIHRvXG4gIC8vIGJlIG9yZGVyZWQgYWdhaW5zdCBzdWIsIG1ldGhvZHMgbmVlZCB0byBiZSBvcmRlcmVkIGFnYWluc3QgZWFjaFxuICAvLyBvdGhlci4pXG4gIHByb2Nlc3NNZXNzYWdlOiBmdW5jdGlvbiAobXNnX2luKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5pblF1ZXVlKSAvLyB3ZSBoYXZlIGJlZW4gZGVzdHJveWVkLlxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gUmVzcG9uZCB0byBwaW5nIGFuZCBwb25nIG1lc3NhZ2VzIGltbWVkaWF0ZWx5IHdpdGhvdXQgcXVldWluZy5cbiAgICAvLyBJZiB0aGUgbmVnb3RpYXRlZCBERFAgdmVyc2lvbiBpcyBcInByZTFcIiB3aGljaCBkaWRuJ3Qgc3VwcG9ydFxuICAgIC8vIHBpbmdzLCBwcmVzZXJ2ZSB0aGUgXCJwcmUxXCIgYmVoYXZpb3Igb2YgcmVzcG9uZGluZyB3aXRoIGEgXCJiYWRcbiAgICAvLyByZXF1ZXN0XCIgZm9yIHRoZSB1bmtub3duIG1lc3NhZ2VzLlxuICAgIC8vXG4gICAgLy8gRmliZXJzIGFyZSBuZWVkZWQgYmVjYXVzZSBoZWFydGJlYXQgdXNlcyBNZXRlb3Iuc2V0VGltZW91dCwgd2hpY2hcbiAgICAvLyBuZWVkcyBhIEZpYmVyLiBXZSBjb3VsZCBhY3R1YWxseSB1c2UgcmVndWxhciBzZXRUaW1lb3V0IGFuZCBhdm9pZFxuICAgIC8vIHRoZXNlIG5ldyBmaWJlcnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8ganVzdCBtYWtlIGV2ZXJ5dGhpbmcgdXNlXG4gICAgLy8gTWV0ZW9yLnNldFRpbWVvdXQgYW5kIG5vdCB0aGluayB0b28gaGFyZC5cbiAgICAvL1xuICAgIC8vIEFueSBtZXNzYWdlIGNvdW50cyBhcyByZWNlaXZpbmcgYSBwb25nLCBhcyBpdCBkZW1vbnN0cmF0ZXMgdGhhdFxuICAgIC8vIHRoZSBjbGllbnQgaXMgc3RpbGwgYWxpdmUuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuaGVhcnRiZWF0Lm1lc3NhZ2VSZWNlaXZlZCgpO1xuICAgICAgfSkucnVuKCk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwaW5nJykge1xuICAgICAgaWYgKHNlbGYuX3Jlc3BvbmRUb1BpbmdzKVxuICAgICAgICBzZWxmLnNlbmQoe21zZzogXCJwb25nXCIsIGlkOiBtc2dfaW4uaWR9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwb25nJykge1xuICAgICAgLy8gU2luY2UgZXZlcnl0aGluZyBpcyBhIHBvbmcsIG5vdGhpbmcgdG8gZG9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmluUXVldWUucHVzaChtc2dfaW4pO1xuICAgIGlmIChzZWxmLndvcmtlclJ1bm5pbmcpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi53b3JrZXJSdW5uaW5nID0gdHJ1ZTtcblxuICAgIHZhciBwcm9jZXNzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBtc2cgPSBzZWxmLmluUXVldWUgJiYgc2VsZi5pblF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAoIW1zZykge1xuICAgICAgICBzZWxmLndvcmtlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBibG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWJsb2NrZWQpXG4gICAgICAgICAgICByZXR1cm47IC8vIGlkZW1wb3RlbnRcbiAgICAgICAgICBibG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgcHJvY2Vzc05leHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZWxmLnNlcnZlci5vbk1lc3NhZ2VIb29rLmVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2sobXNnLCBzZWxmKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF8uaGFzKHNlbGYucHJvdG9jb2xfaGFuZGxlcnMsIG1zZy5tc2cpKVxuICAgICAgICAgIHNlbGYucHJvdG9jb2xfaGFuZGxlcnNbbXNnLm1zZ10uY2FsbChzZWxmLCBtc2csIHVuYmxvY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc2VsZi5zZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgdW5ibG9jaygpOyAvLyBpbiBjYXNlIHRoZSBoYW5kbGVyIGRpZG4ndCBhbHJlYWR5IGRvIGl0XG4gICAgICB9KS5ydW4oKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzc05leHQoKTtcbiAgfSxcblxuICBwcm90b2NvbF9oYW5kbGVyczoge1xuICAgIHN1YjogZnVuY3Rpb24gKG1zZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyByZWplY3QgbWFsZm9ybWVkIG1lc3NhZ2VzXG4gICAgICBpZiAodHlwZW9mIChtc2cuaWQpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgdHlwZW9mIChtc2cubmFtZSkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBzdWJzY3JpcHRpb25cIiwgbXNnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNlbGYuc2VydmVyLnB1Ymxpc2hfaGFuZGxlcnNbbXNnLm5hbWVdKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYFN1YnNjcmlwdGlvbiAnJHttc2cubmFtZX0nIG5vdCBmb3VuZGApfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX25hbWVkU3Vicy5oYXMobXNnLmlkKSlcbiAgICAgICAgLy8gc3VicyBhcmUgaWRlbXBvdGVudCwgb3IgcmF0aGVyLCB0aGV5IGFyZSBpZ25vcmVkIGlmIGEgc3ViXG4gICAgICAgIC8vIHdpdGggdGhhdCBpZCBhbHJlYWR5IGV4aXN0cy4gdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nXG4gICAgICAgIC8vIHJlY29ubmVjdC5cbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAvLyBYWFggSXQnZCBiZSBtdWNoIGJldHRlciBpZiB3ZSBoYWQgZ2VuZXJpYyBob29rcyB3aGVyZSBhbnkgcGFja2FnZSBjYW5cbiAgICAgIC8vIGhvb2sgaW50byBzdWJzY3JpcHRpb24gaGFuZGxpbmcsIGJ1dCBpbiB0aGUgbWVhbiB3aGlsZSB3ZSBzcGVjaWFsIGNhc2VcbiAgICAgIC8vIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZS4gVGhpcyBpcyBhbHNvIGRvbmUgZm9yIHdlYWsgcmVxdWlyZW1lbnRzIHRvXG4gICAgICAvLyBhZGQgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSBpbiBjYXNlIHdlIGRvbid0IGhhdmUgQWNjb3VudHMuIEFcbiAgICAgIC8vIHVzZXIgdHJ5aW5nIHRvIHVzZSB0aGUgZGRwLXJhdGUtbGltaXRlciBtdXN0IGV4cGxpY2l0bHkgcmVxdWlyZSBpdC5cbiAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICB2YXIgcmF0ZUxpbWl0ZXJJbnB1dCA9IHtcbiAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgIHR5cGU6IFwic3Vic2NyaXB0aW9uXCIsXG4gICAgICAgICAgbmFtZTogbXNnLm5hbWUsXG4gICAgICAgICAgY29ubmVjdGlvbklkOiBzZWxmLmlkXG4gICAgICAgIH07XG5cbiAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgICBtc2c6ICdub3N1YicsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcihcbiAgICAgICAgICAgICAgJ3Rvby1tYW55LXJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXTtcblxuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlciwgbXNnLmlkLCBtc2cucGFyYW1zLCBtc2cubmFtZSk7XG5cbiAgICB9LFxuXG4gICAgdW5zdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgc2VsZi5fc3RvcFN1YnNjcmlwdGlvbihtc2cuaWQpO1xuICAgIH0sXG5cbiAgICBtZXRob2Q6IGZ1bmN0aW9uIChtc2csIHVuYmxvY2spIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgLy8gRm9yIG5vdywgd2Ugc2lsZW50bHkgaWdub3JlIHVua25vd24gYXR0cmlidXRlcyxcbiAgICAgIC8vIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm1ldGhvZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB8fFxuICAgICAgICAgICgoJ3JhbmRvbVNlZWQnIGluIG1zZykgJiYgKHR5cGVvZiBtc2cucmFuZG9tU2VlZCAhPT0gXCJzdHJpbmdcIikpKSB7XG4gICAgICAgIHNlbGYuc2VuZEVycm9yKFwiTWFsZm9ybWVkIG1ldGhvZCBpbnZvY2F0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhbmRvbVNlZWQgPSBtc2cucmFuZG9tU2VlZCB8fCBudWxsO1xuXG4gICAgICAvLyBzZXQgdXAgdG8gbWFyayB0aGUgbWV0aG9kIGFzIHNhdGlzZmllZCBvbmNlIGFsbCBvYnNlcnZlcnNcbiAgICAgIC8vIChhbmQgc3Vic2NyaXB0aW9ucykgaGF2ZSByZWFjdGVkIHRvIGFueSB3cml0ZXMgdGhhdCB3ZXJlXG4gICAgICAvLyBkb25lLlxuICAgICAgdmFyIGZlbmNlID0gbmV3IEREUFNlcnZlci5fV3JpdGVGZW5jZTtcbiAgICAgIGZlbmNlLm9uQWxsQ29tbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0aXJlIHRoZSBmZW5jZSBzbyB0aGF0IGZ1dHVyZSB3cml0ZXMgYXJlIGFsbG93ZWQuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBjYWxsYmFja3MgbGlrZSB0aW1lcnMgYXJlIGZyZWUgdG8gdXNlXG4gICAgICAgIC8vIHRoZSBmZW5jZSwgYW5kIGlmIHRoZXkgZmlyZSBiZWZvcmUgaXQncyBhcm1lZCAoZm9yXG4gICAgICAgIC8vIGV4YW1wbGUsIGJlY2F1c2UgdGhlIG1ldGhvZCB3YWl0cyBmb3IgdGhlbSkgdGhlaXJcbiAgICAgICAgLy8gd3JpdGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZlbmNlLlxuICAgICAgICBmZW5jZS5yZXRpcmUoKTtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICd1cGRhdGVkJywgbWV0aG9kczogW21zZy5pZF19KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmaW5kIHRoZSBoYW5kbGVyXG4gICAgICB2YXIgaGFuZGxlciA9IHNlbGYuc2VydmVyLm1ldGhvZF9oYW5kbGVyc1ttc2cubWV0aG9kXTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ3Jlc3VsdCcsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoNDA0LCBgTWV0aG9kICcke21zZy5tZXRob2R9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICBmZW5jZS5hcm0oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIHNlbGYuX3NldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGludm9jYXRpb24gPSBuZXcgRERQQ29tbW9uLk1ldGhvZEludm9jYXRpb24oe1xuICAgICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICBzZXRVc2VySWQ6IHNldFVzZXJJZCxcbiAgICAgICAgdW5ibG9jazogdW5ibG9jayxcbiAgICAgICAgY29ubmVjdGlvbjogc2VsZi5jb25uZWN0aW9uSGFuZGxlLFxuICAgICAgICByYW5kb21TZWVkOiByYW5kb21TZWVkXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gWFhYIEl0J2QgYmUgYmV0dGVyIGlmIHdlIGNvdWxkIGhvb2sgaW50byBtZXRob2QgaGFuZGxlcnMgYmV0dGVyIGJ1dFxuICAgICAgICAvLyBmb3Igbm93LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZHAtcmF0ZS1saW1pdGVyIGV4aXN0cyBzaW5jZSB3ZVxuICAgICAgICAvLyBoYXZlIGEgd2VhayByZXF1aXJlbWVudCBmb3IgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSB0byBiZSBhZGRlZFxuICAgICAgICAvLyB0byBvdXIgYXBwbGljYXRpb24uXG4gICAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgICB2YXIgRERQUmF0ZUxpbWl0ZXIgPSBQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10uRERQUmF0ZUxpbWl0ZXI7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgICAgY2xpZW50QWRkcmVzczogc2VsZi5jb25uZWN0aW9uSGFuZGxlLmNsaWVudEFkZHJlc3MsXG4gICAgICAgICAgICB0eXBlOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgbmFtZTogbXNnLm1ldGhvZCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICAgIH07XG4gICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgICB2YXIgcmF0ZUxpbWl0UmVzdWx0ID0gRERQUmF0ZUxpbWl0ZXIuX2NoZWNrKHJhdGVMaW1pdGVySW5wdXQpXG4gICAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgIFwidG9vLW1hbnktcmVxdWVzdHNcIixcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fVxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlLndpdGhWYWx1ZShcbiAgICAgICAgICBmZW5jZSxcbiAgICAgICAgICAoKSA9PiBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgICAgIGludm9jYXRpb24sXG4gICAgICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIG1zZy5wYXJhbXMsXG4gICAgICAgICAgICAgIFwiY2FsbCB0byAnXCIgKyBtc2cubWV0aG9kICsgXCInXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHVuYmxvY2soKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbXNnOiBcInJlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkXG4gICAgICB9O1xuXG4gICAgICBwcm9taXNlLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGF5bG9hZC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZW5kKHBheWxvYWQpO1xuICAgICAgfSwgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgcGF5bG9hZC5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgICBleGNlcHRpb24sXG4gICAgICAgICAgYHdoaWxlIGludm9raW5nIG1ldGhvZCAnJHttc2cubWV0aG9kfSdgXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfZWFjaFN1YjogZnVuY3Rpb24gKGYpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5fbmFtZWRTdWJzLmZvckVhY2goZik7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGYpO1xuICB9LFxuXG4gIF9kaWZmQ29sbGVjdGlvblZpZXdzOiBmdW5jdGlvbiAoYmVmb3JlQ1ZzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhiZWZvcmVDVnMsIHNlbGYuY29sbGVjdGlvblZpZXdzLCB7XG4gICAgICBib3RoOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRpZmYobGVmdFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NWaWV3LCBpZCkge1xuICAgICAgICAgIHNlbGYuc2VuZEFkZGVkKGNvbGxlY3Rpb25OYW1lLCBpZCwgZG9jVmlldy5nZXRGaWVsZHMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSkge1xuICAgICAgICBsZWZ0VmFsdWUuZG9jdW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvYywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgdXNlciBpZCBpbiBhbGwgYXBwcm9wcmlhdGUgY29udGV4dHMgYW5kIHJlcnVuc1xuICAvLyBhbGwgc3Vic2NyaXB0aW9uc1xuICBfc2V0VXNlcklkOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodXNlcklkICE9PSBudWxsICYmIHR5cGVvZiB1c2VySWQgIT09IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXRVc2VySWQgbXVzdCBiZSBjYWxsZWQgb24gc3RyaW5nIG9yIG51bGwsIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHVzZXJJZCk7XG5cbiAgICAvLyBQcmV2ZW50IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnNjcmlwdGlvbnMgZnJvbSBiZWluZyBhZGRlZCB0byBvdXJcbiAgICAvLyBzZXNzaW9uOyB0aGV5IHdpbGwgYmUgZm91bmQgYmVsb3cgd2hlbiB3ZSBjYWxsIHN0YXJ0VW5pdmVyc2FsU3Vicy5cbiAgICAvL1xuICAgIC8vIChXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG5hbWVkIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2Ugd2Ugb25seSBhZGRcbiAgICAvLyB0aGVtIHdoZW4gd2UgcHJvY2VzcyBhICdzdWInIG1lc3NhZ2UuIFdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBhXG4gICAgLy8gJ21ldGhvZCcgbWVzc2FnZSwgYW5kIHRoZSBtZXRob2QgZGlkIG5vdCB1bmJsb2NrLCBiZWNhdXNlIGl0IGlzIGlsbGVnYWxcbiAgICAvLyB0byBjYWxsIHNldFVzZXJJZCBhZnRlciB1bmJsb2NrLiBUaHVzIHdlIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgYWRkaW5nIGFcbiAgICAvLyBuZXcgbmFtZWQgc3Vic2NyaXB0aW9uLilcbiAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gdHJ1ZTtcblxuICAgIC8vIFByZXZlbnQgY3VycmVudCBzdWJzIGZyb20gdXBkYXRpbmcgb3VyIGNvbGxlY3Rpb25WaWV3cyBhbmQgY2FsbCB0aGVpclxuICAgIC8vIHN0b3AgY2FsbGJhY2tzLiBUaGlzIG1heSB5aWVsZC5cbiAgICBzZWxmLl9lYWNoU3ViKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gQWxsIHN1YnMgc2hvdWxkIG5vdyBiZSBkZWFjdGl2YXRlZC4gU3RvcCBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQsXG4gICAgLy8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHB1Ymxpc2hlZCBjb2xsZWN0aW9ucywgcmVzZXQgdG8gYW4gZW1wdHkgdmlldywgYW5kXG4gICAgLy8gdXBkYXRlIHRoZSB1c2VySWQuXG4gICAgc2VsZi5faXNTZW5kaW5nID0gZmFsc2U7XG4gICAgdmFyIGJlZm9yZUNWcyA9IHNlbGYuY29sbGVjdGlvblZpZXdzO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuICAgIHNlbGYudXNlcklkID0gdXNlcklkO1xuXG4gICAgLy8gX3NldFVzZXJJZCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSBhIE1ldGVvciBtZXRob2Qgd2l0aFxuICAgIC8vIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gc2V0LiBCdXQgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiBpcyBub3RcbiAgICAvLyBleHBlY3RlZCB0byBiZSBzZXQgaW5zaWRlIGEgcHVibGlzaCBmdW5jdGlvbiwgc28gd2UgdGVtcG9yYXJ5IHVuc2V0IGl0LlxuICAgIC8vIEluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIGlzIHNldC5cbiAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZSh1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNhdmUgdGhlIG9sZCBuYW1lZCBzdWJzLCBhbmQgcmVzZXQgdG8gaGF2aW5nIG5vIHN1YnNjcmlwdGlvbnMuXG4gICAgICB2YXIgb2xkTmFtZWRTdWJzID0gc2VsZi5fbmFtZWRTdWJzO1xuICAgICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuICAgICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gICAgICBvbGROYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICB2YXIgbmV3U3ViID0gc3ViLl9yZWNyZWF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YnNjcmlwdGlvbklkLCBuZXdTdWIpO1xuICAgICAgICAvLyBuYjogaWYgdGhlIGhhbmRsZXIgdGhyb3dzIG9yIGNhbGxzIHRoaXMuZXJyb3IoKSwgaXQgd2lsbCBpbiBmYWN0XG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IHNlbmQgaXRzICdub3N1YicuIFRoaXMgaXMgT0ssIHRob3VnaC5cbiAgICAgICAgbmV3U3ViLl9ydW5IYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3cgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgc3VicyB0byBiZSBzdGFydGVkIG9uIG91ciBjb25uZWN0aW9uIGluXG4gICAgICAvLyBwYXJhbGxlbCB3aXRoIHRoZSBvbmVzIHdlJ3JlIHNwaW5uaW5nIHVwIGhlcmUsIGFuZCBzcGluIHVwIHVuaXZlcnNhbFxuICAgICAgLy8gc3Vicy5cbiAgICAgIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcbiAgICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBzZW5kaW5nIG1lc3NhZ2VzIGFnYWluLCBiZWdpbm5pbmcgd2l0aCB0aGUgZGlmZiBmcm9tIHRoZSBwcmV2aW91c1xuICAgIC8vIHN0YXRlIG9mIHRoZSB3b3JsZCB0byB0aGUgY3VycmVudCBzdGF0ZS4gTm8geWllbGRzIGFyZSBhbGxvd2VkIGR1cmluZ1xuICAgIC8vIHRoaXMgZGlmZiwgc28gdGhhdCBvdGhlciBjaGFuZ2VzIGNhbm5vdCBpbnRlcmxlYXZlLlxuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG4gICAgICBzZWxmLl9kaWZmQ29sbGVjdGlvblZpZXdzKGJlZm9yZUNWcyk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxmLl9wZW5kaW5nUmVhZHkpKSB7XG4gICAgICAgIHNlbGYuc2VuZFJlYWR5KHNlbGYuX3BlbmRpbmdSZWFkeSk7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIF9zdGFydFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViID0gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYsIGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpO1xuICAgIGlmIChzdWJJZClcbiAgICAgIHNlbGYuX25hbWVkU3Vicy5zZXQoc3ViSWQsIHN1Yik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5wdXNoKHN1Yik7XG5cbiAgICBzdWIuX3J1bkhhbmRsZXIoKTtcbiAgfSxcblxuICAvLyB0ZWFyIGRvd24gc3BlY2lmaWVkIHN1YnNjcmlwdGlvblxuICBfc3RvcFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKHN1YklkLCBlcnJvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBzdWJOYW1lID0gbnVsbDtcbiAgICBpZiAoc3ViSWQpIHtcbiAgICAgIHZhciBtYXliZVN1YiA9IHNlbGYuX25hbWVkU3Vicy5nZXQoc3ViSWQpO1xuICAgICAgaWYgKG1heWJlU3ViKSB7XG4gICAgICAgIHN1Yk5hbWUgPSBtYXliZVN1Yi5fbmFtZTtcbiAgICAgICAgbWF5YmVTdWIuX3JlbW92ZUFsbERvY3VtZW50cygpO1xuICAgICAgICBtYXliZVN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuZGVsZXRlKHN1YklkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2UgPSB7bXNnOiAnbm9zdWInLCBpZDogc3ViSWR9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXNwb25zZS5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHN1Yk5hbWUgPyAoXCJmcm9tIHN1YiBcIiArIHN1Yk5hbWUgKyBcIiBpZCBcIiArIHN1YklkKVxuICAgICAgICAgIDogKFwiZnJvbSBzdWIgaWQgXCIgKyBzdWJJZCkpO1xuICAgIH1cblxuICAgIHNlbGYuc2VuZChyZXNwb25zZSk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIGFsbCBzdWJzY3JpcHRpb25zLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBzZW5kIHJlbW92ZWQgb3Igbm9zdWJcbiAgLy8gbWVzc2FnZXMsIHNpbmNlIHdlIGFzc3VtZSB0aGUgY2xpZW50IGlzIGdvbmUuXG4gIF9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9uczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIsIGlkKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcbiAgICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG5cbiAgICBzZWxmLl91bml2ZXJzYWxTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yikge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuICB9LFxuXG4gIC8vIERldGVybWluZSB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MsIGJhc2VkIG9uIHRoZVxuICAvLyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXByZXNlbnRpbmcgaG93IG1hbnlcbiAgLy8gcHJveGllcyB0aGUgc2VydmVyIGlzIGJlaGluZC5cbiAgX2NsaWVudEFkZHJlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBGb3IgdGhlIHJlcG9ydGVkIGNsaWVudCBhZGRyZXNzIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgY29ycmVjdCxcbiAgICAvLyB0aGUgZGV2ZWxvcGVyIG11c3Qgc2V0IHRoZSBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudFxuICAgIC8vIHZhcmlhYmxlIHRvIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgaG9wcyB0aGV5XG4gICAgLy8gZXhwZWN0IGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIuIEUuZy4sIHNldCB0byBcIjFcIiBpZiB0aGVcbiAgICAvLyBzZXJ2ZXIgaXMgYmVoaW5kIG9uZSBwcm94eS5cbiAgICAvL1xuICAgIC8vIFRoaXMgY291bGQgYmUgY29tcHV0ZWQgb25jZSBhdCBzdGFydHVwIGluc3RlYWQgb2YgZXZlcnkgdGltZS5cbiAgICB2YXIgaHR0cEZvcndhcmRlZENvdW50ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnZbJ0hUVFBfRk9SV0FSREVEX0NPVU5UJ10pIHx8IDA7XG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LnJlbW90ZUFkZHJlc3M7XG5cbiAgICB2YXIgZm9yd2FyZGVkRm9yID0gc2VsZi5zb2NrZXQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWZvclwiXTtcbiAgICBpZiAoISBfLmlzU3RyaW5nKGZvcndhcmRlZEZvcikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3J3YXJkZWRGb3IgPSBmb3J3YXJkZWRGb3IudHJpbSgpLnNwbGl0KC9cXHMqLFxccyovKTtcblxuICAgIC8vIFR5cGljYWxseSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGB4LWZvcndhcmRlZC1mb3JgIGhlYWRlciBpc1xuICAgIC8vIHRoZSBvcmlnaW5hbCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgY29ubmVjdGluZyB0byB0aGUgZmlyc3RcbiAgICAvLyBwcm94eS4gIEhvd2V2ZXIsIHRoZSBlbmQgdXNlciBjYW4gZWFzaWx5IHNwb29mIHRoZSBoZWFkZXIsIGluXG4gICAgLy8gd2hpY2ggY2FzZSB0aGUgZmlyc3QgdmFsdWUocykgd2lsbCBiZSB0aGUgZmFrZSBJUCBhZGRyZXNzIGZyb21cbiAgICAvLyB0aGUgdXNlciBwcmV0ZW5kaW5nIHRvIGJlIGEgcHJveHkgcmVwb3J0aW5nIHRoZSBvcmlnaW5hbCBJUFxuICAgIC8vIGFkZHJlc3MgdmFsdWUuICBCeSBjb3VudGluZyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBiYWNrIGZyb20gdGhlXG4gICAgLy8gZW5kIG9mIHRoZSBsaXN0LCB3ZSBlbnN1cmUgdGhhdCB3ZSBnZXQgdGhlIElQIGFkZHJlc3MgYmVpbmdcbiAgICAvLyByZXBvcnRlZCBieSAqb3VyKiBmaXJzdCBwcm94eS5cblxuICAgIGlmIChodHRwRm9yd2FyZGVkQ291bnQgPCAwIHx8IGh0dHBGb3J3YXJkZWRDb3VudCA+IGZvcndhcmRlZEZvci5sZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBmb3J3YXJkZWRGb3JbZm9yd2FyZGVkRm9yLmxlbmd0aCAtIGh0dHBGb3J3YXJkZWRDb3VudF07XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU3Vic2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIGN0b3IgZm9yIGEgc3ViIGhhbmRsZTogdGhlIGlucHV0IHRvIGVhY2ggcHVibGlzaCBmdW5jdGlvblxuXG4vLyBJbnN0YW5jZSBuYW1lIGlzIHRoaXMgYmVjYXVzZSBpdCdzIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgdGhpcyBpbnNpZGUgYVxuLy8gcHVibGlzaFxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgc2VydmVyJ3Mgc2lkZSBvZiBhIHN1YnNjcmlwdGlvblxuICogQGNsYXNzIFN1YnNjcmlwdGlvblxuICogQGluc3RhbmNlTmFtZSB0aGlzXG4gKiBAc2hvd0luc3RhbmNlTmFtZSB0cnVlXG4gKi9cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG4gICAgc2Vzc2lvbiwgaGFuZGxlciwgc3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgbmFtZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uOyAvLyB0eXBlIGlzIFNlc3Npb25cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGluY29taW5nIFtjb25uZWN0aW9uXSgjbWV0ZW9yX29uY29ubmVjdGlvbikgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBuYW1lICBjb25uZWN0aW9uXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBzZWxmLmNvbm5lY3Rpb24gPSBzZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGU7IC8vIHB1YmxpYyBBUEkgb2JqZWN0XG5cbiAgc2VsZi5faGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgLy8gbXkgc3Vic2NyaXB0aW9uIElEIChnZW5lcmF0ZWQgYnkgY2xpZW50LCB1bmRlZmluZWQgZm9yIHVuaXZlcnNhbCBzdWJzKS5cbiAgc2VsZi5fc3Vic2NyaXB0aW9uSWQgPSBzdWJzY3JpcHRpb25JZDtcbiAgLy8gdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3Vic1xuICBzZWxmLl9uYW1lID0gbmFtZTtcblxuICBzZWxmLl9wYXJhbXMgPSBwYXJhbXMgfHwgW107XG5cbiAgLy8gT25seSBuYW1lZCBzdWJzY3JpcHRpb25zIGhhdmUgSURzLCBidXQgd2UgbmVlZCBzb21lIHNvcnQgb2Ygc3RyaW5nXG4gIC8vIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhbGwgc3Vic2NyaXB0aW9ucyBpbnNpZGVcbiAgLy8gU2Vzc2lvbkRvY3VtZW50Vmlld3MuIFdlIHVzZSB0aGlzIHN1YnNjcmlwdGlvbkhhbmRsZSBmb3IgdGhhdC5cbiAgaWYgKHNlbGYuX3N1YnNjcmlwdGlvbklkKSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ04nICsgc2VsZi5fc3Vic2NyaXB0aW9uSWQ7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ1UnICsgUmFuZG9tLmlkKCk7XG4gIH1cblxuICAvLyBoYXMgX2RlYWN0aXZhdGUgYmVlbiBjYWxsZWQ/XG4gIHNlbGYuX2RlYWN0aXZhdGVkID0gZmFsc2U7XG5cbiAgLy8gc3RvcCBjYWxsYmFja3MgdG8gZy9jIHRoaXMgc3ViLiAgY2FsbGVkIHcvIHplcm8gYXJndW1lbnRzLlxuICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG5cbiAgLy8gdGhlIHNldCBvZiAoY29sbGVjdGlvbiwgZG9jdW1lbnRpZCkgdGhhdCB0aGlzIHN1YnNjcmlwdGlvbiBoYXNcbiAgLy8gYW4gb3BpbmlvbiBhYm91dFxuICBzZWxmLl9kb2N1bWVudHMgPSBuZXcgTWFwKCk7XG5cbiAgLy8gcmVtZW1iZXIgaWYgd2UgYXJlIHJlYWR5LlxuICBzZWxmLl9yZWFkeSA9IGZhbHNlO1xuXG4gIC8vIFBhcnQgb2YgdGhlIHB1YmxpYyBBUEk6IHRoZSB1c2VyIG9mIHRoaXMgc3ViLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBY2Nlc3MgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiBUaGUgaWQgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyLCBvciBgbnVsbGAgaWYgbm8gdXNlciBpcyBsb2dnZWQgaW4uXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAbmFtZSAgdXNlcklkXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi51c2VySWQgPSBzZXNzaW9uLnVzZXJJZDtcblxuICAvLyBGb3Igbm93LCB0aGUgaWQgZmlsdGVyIGlzIGdvaW5nIHRvIGRlZmF1bHQgdG9cbiAgLy8gdGhlIHRvL2Zyb20gRERQIG1ldGhvZHMgb24gTW9uZ29JRCwgdG9cbiAgLy8gc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCBtb25nby9taW5pbW9uZ28gT2JqZWN0SWRzLlxuXG4gIC8vIExhdGVyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpcyBiZSBcInJhd1wiXG4gIC8vIGlmIHlvdSB3YW50IHRvIHB1Ymxpc2ggYSBjb2xsZWN0aW9uIHRoYXQgeW91IGtub3dcbiAgLy8ganVzdCBoYXMgc3RyaW5ncyBmb3Iga2V5cyBhbmQgbm8gZnVubnkgYnVzaW5lc3MsIHRvXG4gIC8vIGEgZGRwIGNvbnN1bWVyIHRoYXQgaXNuJ3QgbWluaW1vbmdvXG5cbiAgc2VsZi5faWRGaWx0ZXIgPSB7XG4gICAgaWRTdHJpbmdpZnk6IE1vbmdvSUQuaWRTdHJpbmdpZnksXG4gICAgaWRQYXJzZTogTW9uZ29JRC5pZFBhcnNlXG4gIH07XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzdWJzY3JpcHRpb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU3Vic2NyaXB0aW9uLnByb3RvdHlwZSwge1xuICBfcnVuSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuICAgIC8vIFhYWCBzaG91bGQgd2UgdW5ibG9jaygpIGhlcmU/IEVpdGhlciBiZWZvcmUgcnVubmluZyB0aGUgcHVibGlzaFxuICAgIC8vIGZ1bmN0aW9uLCBvciBiZWZvcmUgcnVubmluZyBfcHVibGlzaEN1cnNvci5cbiAgICAvL1xuICAgIC8vIFJpZ2h0IG5vdywgZWFjaCBwdWJsaXNoIGZ1bmN0aW9uIGJsb2NrcyBhbGwgZnV0dXJlIHB1Ymxpc2hlcyBhbmRcbiAgICAvLyBtZXRob2RzIHdhaXRpbmcgb24gZGF0YSBmcm9tIE1vbmdvIChvciB3aGF0ZXZlciBlbHNlIHRoZSBmdW5jdGlvblxuICAgIC8vIGJsb2NrcyBvbikuIFRoaXMgcHJvYmFibHkgc2xvd3MgcGFnZSBsb2FkIGluIGNvbW1vbiBjYXNlcy5cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgICgpID0+IG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyhcbiAgICAgICAgICBzZWxmLl9oYW5kbGVyLCBzZWxmLCBFSlNPTi5jbG9uZShzZWxmLl9wYXJhbXMpLFxuICAgICAgICAgIC8vIEl0J3MgT0sgdGhhdCB0aGlzIHdvdWxkIGxvb2sgd2VpcmQgZm9yIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zLFxuICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBoYXZlIG5vIGFyZ3VtZW50cyBzbyB0aGVyZSBjYW4gbmV2ZXIgYmUgYW5cbiAgICAgICAgICAvLyBhdWRpdC1hcmd1bWVudC1jaGVja3MgZmFpbHVyZS5cbiAgICAgICAgICBcInB1Ymxpc2hlciAnXCIgKyBzZWxmLl9uYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpZCB0aGUgaGFuZGxlciBjYWxsIHRoaXMuZXJyb3Igb3IgdGhpcy5zdG9wP1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWxmLl9wdWJsaXNoSGFuZGxlclJlc3VsdChyZXMpO1xuICB9LFxuXG4gIF9wdWJsaXNoSGFuZGxlclJlc3VsdDogZnVuY3Rpb24gKHJlcykge1xuICAgIC8vIFNQRUNJQUwgQ0FTRTogSW5zdGVhZCBvZiB3cml0aW5nIHRoZWlyIG93biBjYWxsYmFja3MgdGhhdCBpbnZva2VcbiAgICAvLyB0aGlzLmFkZGVkL2NoYW5nZWQvcmVhZHkvZXRjLCB0aGUgdXNlciBjYW4ganVzdCByZXR1cm4gYSBjb2xsZWN0aW9uXG4gICAgLy8gY3Vyc29yIG9yIGFycmF5IG9mIGN1cnNvcnMgZnJvbSB0aGUgcHVibGlzaCBmdW5jdGlvbjsgd2UgY2FsbCB0aGVpclxuICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG1ldGhvZCB3aGljaCBzdGFydHMgb2JzZXJ2aW5nIHRoZSBjdXJzb3IgYW5kIHB1Ymxpc2hlcyB0aGVcbiAgICAvLyByZXN1bHRzLiBOb3RlIHRoYXQgX3B1Ymxpc2hDdXJzb3IgZG9lcyBOT1QgY2FsbCByZWFkeSgpLlxuICAgIC8vXG4gICAgLy8gWFhYIFRoaXMgdXNlcyBhbiB1bmRvY3VtZW50ZWQgaW50ZXJmYWNlIHdoaWNoIG9ubHkgdGhlIE1vbmdvIGN1cnNvclxuICAgIC8vIGludGVyZmFjZSBwdWJsaXNoZXMuIFNob3VsZCB3ZSBtYWtlIHRoaXMgaW50ZXJmYWNlIHB1YmxpYyBhbmQgZW5jb3VyYWdlXG4gICAgLy8gdXNlcnMgdG8gaW1wbGVtZW50IGl0IHRoZW1zZWx2ZXM/IEFyZ3VhYmx5LCBpdCdzIHVubmVjZXNzYXJ5OyB1c2VycyBjYW5cbiAgICAvLyBhbHJlYWR5IHdyaXRlIHRoZWlyIG93biBmdW5jdGlvbnMgbGlrZVxuICAgIC8vICAgdmFyIHB1Ymxpc2hNeVJlYWN0aXZlVGhpbmd5ID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICAvLyAgICAgTWV0ZW9yLnB1Ymxpc2gobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICAgIHZhciByZWFjdGl2ZVRoaW5neSA9IGhhbmRsZXIoKTtcbiAgICAvLyAgICAgICByZWFjdGl2ZVRoaW5neS5wdWJsaXNoTWUoKTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpc0N1cnNvciA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYyAmJiBjLl9wdWJsaXNoQ3Vyc29yO1xuICAgIH07XG4gICAgaWYgKGlzQ3Vyc29yKHJlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcy5fcHVibGlzaEN1cnNvcihzZWxmKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gX3B1Ymxpc2hDdXJzb3Igb25seSByZXR1cm5zIGFmdGVyIHRoZSBpbml0aWFsIGFkZGVkIGNhbGxiYWNrcyBoYXZlIHJ1bi5cbiAgICAgIC8vIG1hcmsgc3Vic2NyaXB0aW9uIGFzIHJlYWR5LlxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHJlcykpIHtcbiAgICAgIC8vIGNoZWNrIGFsbCB0aGUgZWxlbWVudHMgYXJlIGN1cnNvcnNcbiAgICAgIGlmICghIF8uYWxsKHJlcywgaXNDdXJzb3IpKSB7XG4gICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBhbiBhcnJheSBvZiBub24tQ3Vyc29yc1wiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgZHVwbGljYXRlIGNvbGxlY3Rpb24gbmFtZXNcbiAgICAgIC8vIFhYWCB3ZSBzaG91bGQgc3VwcG9ydCBvdmVybGFwcGluZyBjdXJzb3JzLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHRoZVxuICAgICAgLy8gbWVyZ2UgYm94IHRvIGFsbG93IG92ZXJsYXAgd2l0aGluIGEgc3Vic2NyaXB0aW9uXG4gICAgICB2YXIgY29sbGVjdGlvbk5hbWVzID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY29sbGVjdGlvbk5hbWUgPSByZXNbaV0uX2dldENvbGxlY3Rpb25OYW1lKCk7XG4gICAgICAgIGlmIChfLmhhcyhjb2xsZWN0aW9uTmFtZXMsIGNvbGxlY3Rpb25OYW1lKSkge1xuICAgICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFxuICAgICAgICAgICAgXCJQdWJsaXNoIGZ1bmN0aW9uIHJldHVybmVkIG11bHRpcGxlIGN1cnNvcnMgZm9yIGNvbGxlY3Rpb24gXCIgK1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uTmFtZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0aW9uTmFtZXNbY29sbGVjdGlvbk5hbWVdID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIF8uZWFjaChyZXMsIGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgICAgICBjdXIuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxmLnJlYWR5KCk7XG4gICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgIC8vIHRydXRoeSB2YWx1ZXMgb3RoZXIgdGhhbiBjdXJzb3JzIG9yIGFycmF5cyBhcmUgcHJvYmFibHkgYVxuICAgICAgLy8gdXNlciBtaXN0YWtlIChwb3NzaWJsZSByZXR1cm5pbmcgYSBNb25nbyBkb2N1bWVudCB2aWEsIHNheSxcbiAgICAgIC8vIGBjb2xsLmZpbmRPbmUoKWApLlxuICAgICAgc2VsZi5lcnJvcihuZXcgRXJyb3IoXCJQdWJsaXNoIGZ1bmN0aW9uIGNhbiBvbmx5IHJldHVybiBhIEN1cnNvciBvciBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBcImFuIGFycmF5IG9mIEN1cnNvcnNcIikpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaGlzIGNhbGxzIGFsbCBzdG9wIGNhbGxiYWNrcyBhbmQgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSB1cGRhdGluZyBhbnlcbiAgLy8gU2Vzc2lvbkNvbGxlY3Rpb25WaWV3cyBmdXJ0aGVyLiBJdCdzIHVzZWQgd2hlbiB0aGUgdXNlciB1bnN1YnNjcmliZXMgb3JcbiAgLy8gZGlzY29ubmVjdHMsIGFzIHdlbGwgYXMgZHVyaW5nIHNldFVzZXJJZCByZS1ydW5zLiBJdCBkb2VzICpOT1QqIHNlbmRcbiAgLy8gcmVtb3ZlZCBtZXNzYWdlcyBmb3IgdGhlIHB1Ymxpc2hlZCBvYmplY3RzOyBpZiB0aGF0IGlzIG5lY2Vzc2FyeSwgY2FsbFxuICAvLyBfcmVtb3ZlQWxsRG9jdW1lbnRzIGZpcnN0LlxuICBfZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9kZWFjdGl2YXRlZClcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9kZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgc2VsZi5fY2FsbFN0b3BDYWxsYmFja3MoKTtcbiAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAtMSk7XG4gIH0sXG5cbiAgX2NhbGxTdG9wQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIHRlbGwgbGlzdGVuZXJzLCBzbyB0aGV5IGNhbiBjbGVhbiB1cFxuICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLl9zdG9wQ2FsbGJhY2tzO1xuICAgIHNlbGYuX3N0b3BDYWxsYmFja3MgPSBbXTtcbiAgICBfLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gU2VuZCByZW1vdmUgbWVzc2FnZXMgZm9yIGV2ZXJ5IGRvY3VtZW50LlxuICBfcmVtb3ZlQWxsRG9jdW1lbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xsZWN0aW9uRG9jcywgY29sbGVjdGlvbk5hbWUpIHtcbiAgICAgICAgY29sbGVjdGlvbkRvY3MuZm9yRWFjaChmdW5jdGlvbiAoc3RySWQpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHNlbGYuX2lkRmlsdGVyLmlkUGFyc2Uoc3RySWQpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgbmV3IFN1YnNjcmlwdGlvbiBmb3IgdGhlIHNhbWUgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lXG4gIC8vIGluaXRpYWwgY3JlYXRpb24gcGFyYW1ldGVycy4gVGhpcyBpc24ndCBhIGNsb25lOiBpdCBkb2Vzbid0IGhhdmVcbiAgLy8gdGhlIHNhbWUgX2RvY3VtZW50cyBjYWNoZSwgc3RvcHBlZCBzdGF0ZSBvciBjYWxsYmFja3M7IG1heSBoYXZlIGFcbiAgLy8gZGlmZmVyZW50IF9zdWJzY3JpcHRpb25IYW5kbGUsIGFuZCBnZXRzIGl0cyB1c2VySWQgZnJvbSB0aGVcbiAgLy8gc2Vzc2lvbiwgbm90IGZyb20gdGhpcyBvYmplY3QuXG4gIF9yZWNyZWF0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYuX3Nlc3Npb24sIHNlbGYuX2hhbmRsZXIsIHNlbGYuX3N1YnNjcmlwdGlvbklkLCBzZWxmLl9wYXJhbXMsXG4gICAgICBzZWxmLl9uYW1lKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBTdG9wcyB0aGlzIGNsaWVudCdzIHN1YnNjcmlwdGlvbiwgdHJpZ2dlcmluZyBhIGNhbGwgb24gdGhlIGNsaWVudCB0byB0aGUgYG9uU3RvcGAgY2FsbGJhY2sgcGFzc2VkIHRvIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LiBJZiBgZXJyb3JgIGlzIG5vdCBhIFtgTWV0ZW9yLkVycm9yYF0oI21ldGVvcl9lcnJvciksIGl0IHdpbGwgYmUgW3Nhbml0aXplZF0oI21ldGVvcl9lcnJvcikuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgVGhlIGVycm9yIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkLCBlcnJvcik7XG4gIH0sXG5cbiAgLy8gTm90ZSB0aGF0IHdoaWxlIG91ciBERFAgY2xpZW50IHdpbGwgbm90aWNlIHRoYXQgeW91J3ZlIGNhbGxlZCBzdG9wKCkgb24gdGhlXG4gIC8vIHNlcnZlciAoYW5kIGNsZWFuIHVwIGl0cyBfc3Vic2NyaXB0aW9ucyB0YWJsZSkgd2UgZG9uJ3QgYWN0dWFsbHkgcHJvdmlkZSBhXG4gIC8vIG1lY2hhbmlzbSBmb3IgYW4gYXBwIHRvIG5vdGljZSB0aGlzICh0aGUgc3Vic2NyaWJlIG9uRXJyb3IgY2FsbGJhY2sgb25seVxuICAvLyB0cmlnZ2VycyBpZiB0aGVyZSBpcyBhbiBlcnJvcikuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24gYW5kIGludm9rZXMgdGhlIGNsaWVudCdzIGBvblN0b3BgIGNhbGxiYWNrIHdpdGggbm8gZXJyb3IuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIHN0b3BwZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG9uU3RvcDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNhbGxiYWNrID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChjYWxsYmFjaywgJ29uU3RvcCBjYWxsYmFjaycsIHNlbGYpO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICBjYWxsYmFjaygpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3N0b3BDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHN1YiBoYXMgYmVlbiBkZWFjdGl2YXRlZCwgKk9SKiBpZiB0aGUgc2Vzc2lvbiB3YXNcbiAgLy8gZGVzdHJveWVkIGJ1dCB0aGUgZGVmZXJyZWQgY2FsbCB0byBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMgaGFzbid0XG4gIC8vIGhhcHBlbmVkIHlldC5cbiAgX2lzRGVhY3RpdmF0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuX2RlYWN0aXZhdGVkIHx8IHNlbGYuX3Nlc3Npb24uaW5RdWV1ZSA9PT0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcmVjb3JkIHNldC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29sbGVjdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgbmV3IGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgbmV3IGRvY3VtZW50LiAgSWYgYF9pZGAgaXMgcHJlc2VudCBpdCBpcyBpZ25vcmVkLlxuICAgKi9cbiAgYWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIGxldCBpZHMgPSBzZWxmLl9kb2N1bWVudHMuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoaWRzID09IG51bGwpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoKTtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5zZXQoY29sbGVjdGlvbk5hbWUsIGlkcyk7XG4gICAgfVxuICAgIGlkcy5hZGQoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uYWRkZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaW4gdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gbW9kaWZpZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBjaGFuZ2VkIGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgdGhhdCBoYXZlIGNoYW5nZWQsIHRvZ2V0aGVyIHdpdGggdGhlaXIgbmV3IHZhbHVlcy4gIElmIGEgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gYGZpZWxkc2AgaXQgd2FzIGxlZnQgdW5jaGFuZ2VkOyBpZiBpdCBpcyBwcmVzZW50IGluIGBmaWVsZHNgIGFuZCBoYXMgYSB2YWx1ZSBvZiBgdW5kZWZpbmVkYCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uY2hhbmdlZChzZWxmLl9zdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgaWQgPSBzZWxmLl9pZEZpbHRlci5pZFN0cmluZ2lmeShpZCk7XG4gICAgLy8gV2UgZG9uJ3QgYm90aGVyIHRvIGRlbGV0ZSBzZXRzIG9mIHRoaW5ncyBpbiBhIGNvbGxlY3Rpb24gaWYgdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpcyBlbXB0eS4gIEl0IGNvdWxkIGJyZWFrIF9yZW1vdmVBbGxEb2N1bWVudHMuXG4gICAgc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSkuZGVsZXRlKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLnJlbW92ZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhbiBpbml0aWFsLCBjb21wbGV0ZSBzbmFwc2hvdCBvZiB0aGUgcmVjb3JkIHNldCBoYXMgYmVlbiBzZW50LiAgVGhpcyB3aWxsIHRyaWdnZXIgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblJlYWR5YCBjYWxsYmFjayBwYXNzZWQgdG8gIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICByZWFkeTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghc2VsZi5fc3Vic2NyaXB0aW9uSWQpXG4gICAgICByZXR1cm47ICAvLyB1bm5lY2Vzc2FyeSBidXQgaWdub3JlZCBmb3IgdW5pdmVyc2FsIHN1YlxuICAgIGlmICghc2VsZi5fcmVhZHkpIHtcbiAgICAgIHNlbGYuX3Nlc3Npb24uc2VuZFJlYWR5KFtzZWxmLl9zdWJzY3JpcHRpb25JZF0pO1xuICAgICAgc2VsZi5fcmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuU2VydmVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIFRoZSBkZWZhdWx0IGhlYXJ0YmVhdCBpbnRlcnZhbCBpcyAzMCBzZWNvbmRzIG9uIHRoZSBzZXJ2ZXIgYW5kIDM1XG4gIC8vIHNlY29uZHMgb24gdGhlIGNsaWVudC4gIFNpbmNlIHRoZSBjbGllbnQgZG9lc24ndCBuZWVkIHRvIHNlbmQgYVxuICAvLyBwaW5nIGFzIGxvbmcgYXMgaXQgaXMgcmVjZWl2aW5nIHBpbmdzLCB0aGlzIG1lYW5zIHRoYXQgcGluZ3NcbiAgLy8gbm9ybWFsbHkgZ28gZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuXG4gIC8vXG4gIC8vIE5vdGU6IFRyb3Bvc3BoZXJlIGRlcGVuZHMgb24gdGhlIGFiaWxpdHkgdG8gbXV0YXRlXG4gIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgc2VsZi5vcHRpb25zID0gXy5kZWZhdWx0cyhvcHRpb25zIHx8IHt9LCB7XG4gICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDE1MDAwLFxuICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IDE1MDAwLFxuICAgIC8vIEZvciB0ZXN0aW5nLCBhbGxvdyByZXNwb25kaW5nIHRvIHBpbmdzIHRvIGJlIGRpc2FibGVkLlxuICAgIHJlc3BvbmRUb1BpbmdzOiB0cnVlXG4gIH0pO1xuXG4gIC8vIE1hcCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gY29tZXMgaW4gdG8gdGhlXG4gIC8vIHNlcnZlciBhbmQgY29tcGxldGVzIEREUCB2ZXJzaW9uIG5lZ290aWF0aW9uLiBVc2UgYW4gb2JqZWN0IGluc3RlYWRcbiAgLy8gb2YgYW4gYXJyYXkgc28gd2UgY2FuIHNhZmVseSByZW1vdmUgb25lIGZyb20gdGhlIGxpc3Qgd2hpbGVcbiAgLy8gaXRlcmF0aW5nIG92ZXIgaXQuXG4gIHNlbGYub25Db25uZWN0aW9uSG9vayA9IG5ldyBIb29rKHtcbiAgICBkZWJ1Z1ByaW50RXhjZXB0aW9uczogXCJvbkNvbm5lY3Rpb24gY2FsbGJhY2tcIlxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGNvbWVzIGluLlxuICBzZWxmLm9uTWVzc2FnZUhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25NZXNzYWdlIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzID0ge307XG4gIHNlbGYudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMgPSBbXTtcblxuICBzZWxmLm1ldGhvZF9oYW5kbGVycyA9IHt9O1xuXG4gIHNlbGYuc2Vzc2lvbnMgPSBuZXcgTWFwKCk7IC8vIG1hcCBmcm9tIGlkIHRvIHNlc3Npb25cblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIgPSBuZXcgU3RyZWFtU2VydmVyO1xuXG4gIHNlbGYuc3RyZWFtX3NlcnZlci5yZWdpc3RlcihmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgLy8gc29ja2V0IGltcGxlbWVudHMgdGhlIFNvY2tKU0Nvbm5lY3Rpb24gaW50ZXJmYWNlXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbnVsbDtcblxuICAgIHZhciBzZW5kRXJyb3IgPSBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICAgIG1zZy5vZmZlbmRpbmdNZXNzYWdlID0gb2ZmZW5kaW5nTWVzc2FnZTtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAobXNnKSk7XG4gICAgfTtcblxuICAgIHNvY2tldC5vbignZGF0YScsIGZ1bmN0aW9uIChyYXdfbXNnKSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFJlY2VpdmVkRERQKSB7XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJSZWNlaXZlZCBERFBcIiwgcmF3X21zZyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBtc2cgPSBERFBDb21tb24ucGFyc2VERFAocmF3X21zZyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNlbmRFcnJvcignUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zZyA9PT0gbnVsbCB8fCAhbXNnLm1zZykge1xuICAgICAgICAgIHNlbmRFcnJvcignQmFkIHJlcXVlc3QnLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtc2cubXNnID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgICAgICBzZW5kRXJyb3IoXCJBbHJlYWR5IGNvbm5lY3RlZFwiLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9oYW5kbGVDb25uZWN0KHNvY2tldCwgbXNnKTtcbiAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgIHNlbmRFcnJvcignTXVzdCBjb25uZWN0IGZpcnN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLnByb2Nlc3NNZXNzYWdlKG1zZyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFhYWCBwcmludCBzdGFjayBuaWNlbHlcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIkludGVybmFsIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIG1lc3NhZ2VcIiwgbXNnLCBlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzb2NrZXQuX21ldGVvclNlc3Npb24uY2xvc2UoKTtcbiAgICAgICAgfSkucnVuKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuXy5leHRlbmQoU2VydmVyLnByb3RvdHlwZSwge1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhlIHNlcnZlci5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uQ29ubmVjdGlvbjogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uQ29ubmVjdGlvbkhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBuZXcgRERQIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKi9cbiAgb25NZXNzYWdlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYub25NZXNzYWdlSG9vay5yZWdpc3Rlcihmbik7XG4gIH0sXG5cbiAgX2hhbmRsZUNvbm5lY3Q6IGZ1bmN0aW9uIChzb2NrZXQsIG1zZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFRoZSBjb25uZWN0IG1lc3NhZ2UgbXVzdCBzcGVjaWZ5IGEgdmVyc2lvbiBhbmQgYW4gYXJyYXkgb2Ygc3VwcG9ydGVkXG4gICAgLy8gdmVyc2lvbnMsIGFuZCBpdCBtdXN0IGNsYWltIHRvIHN1cHBvcnQgd2hhdCBpdCBpcyBwcm9wb3NpbmcuXG4gICAgaWYgKCEodHlwZW9mIChtc2cudmVyc2lvbikgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgXy5pc0FycmF5KG1zZy5zdXBwb3J0KSAmJlxuICAgICAgICAgIF8uYWxsKG1zZy5zdXBwb3J0LCBfLmlzU3RyaW5nKSAmJlxuICAgICAgICAgIF8uY29udGFpbnMobXNnLnN1cHBvcnQsIG1zZy52ZXJzaW9uKSkpIHtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IEREUENvbW1vbi5TVVBQT1JURURfRERQX1ZFUlNJT05TWzBdfSkpO1xuICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSwgaGFuZGxlIHNlc3Npb24gcmVzdW1wdGlvbjogc29tZXRoaW5nIGxpa2U6XG4gICAgLy8gIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IHNlbGYuc2Vzc2lvbnNbbXNnLnNlc3Npb25dXG4gICAgdmFyIHZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uKG1zZy5zdXBwb3J0LCBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OUyk7XG5cbiAgICBpZiAobXNnLnZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgIC8vIFRoZSBiZXN0IHZlcnNpb24gdG8gdXNlIChhY2NvcmRpbmcgdG8gdGhlIGNsaWVudCdzIHN0YXRlZCBwcmVmZXJlbmNlcylcbiAgICAgIC8vIGlzIG5vdCB0aGUgb25lIHRoZSBjbGllbnQgaXMgdHJ5aW5nIHRvIHVzZS4gSW5mb3JtIHRoZW0gYWJvdXQgdGhlIGJlc3RcbiAgICAgIC8vIHZlcnNpb24gdG8gdXNlLlxuICAgICAgc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUCh7bXNnOiAnZmFpbGVkJywgdmVyc2lvbjogdmVyc2lvbn0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFlheSwgdmVyc2lvbiBtYXRjaGVzISBDcmVhdGUgYSBuZXcgc2Vzc2lvbi5cbiAgICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAgIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBuZXcgU2Vzc2lvbihzZWxmLCB2ZXJzaW9uLCBzb2NrZXQsIHNlbGYub3B0aW9ucyk7XG4gICAgc2VsZi5zZXNzaW9ucy5zZXQoc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmlkLCBzb2NrZXQuX21ldGVvclNlc3Npb24pO1xuICAgIHNlbGYub25Db25uZWN0aW9uSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbilcbiAgICAgICAgY2FsbGJhY2soc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHB1Ymxpc2ggaGFuZGxlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUge1N0cmluZ30gaWRlbnRpZmllciBmb3IgcXVlcnlcbiAgICogQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSBwdWJsaXNoIGhhbmRsZXJcbiAgICogQHBhcmFtIG9wdGlvbnMge09iamVjdH1cbiAgICpcbiAgICogU2VydmVyIHdpbGwgY2FsbCBoYW5kbGVyIGZ1bmN0aW9uIG9uIGVhY2ggbmV3IHN1YnNjcmlwdGlvbixcbiAgICogZWl0aGVyIHdoZW4gcmVjZWl2aW5nIEREUCBzdWIgbWVzc2FnZSBmb3IgYSBuYW1lZCBzdWJzY3JpcHRpb24sIG9yIG9uXG4gICAqIEREUCBjb25uZWN0IGZvciBhIHVuaXZlcnNhbCBzdWJzY3JpcHRpb24uXG4gICAqXG4gICAqIElmIG5hbWUgaXMgbnVsbCwgdGhpcyB3aWxsIGJlIGEgc3Vic2NyaXB0aW9uIHRoYXQgaXNcbiAgICogYXV0b21hdGljYWxseSBlc3RhYmxpc2hlZCBhbmQgcGVybWFuZW50bHkgb24gZm9yIGFsbCBjb25uZWN0ZWRcbiAgICogY2xpZW50LCBpbnN0ZWFkIG9mIGEgc3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiBhbmQgb2ZmXG4gICAqIHdpdGggc3Vic2NyaWJlKCkuXG4gICAqXG4gICAqIG9wdGlvbnMgdG8gY29udGFpbjpcbiAgICogIC0gKG1vc3RseSBpbnRlcm5hbCkgaXNfYXV0bzogdHJ1ZSBpZiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKiAgICBmcm9tIGFuIGF1dG9wdWJsaXNoIGhvb2suIHRoaXMgaXMgZm9yIGNvc21ldGljIHB1cnBvc2VzIG9ubHlcbiAgICogICAgKGl0IGxldHMgdXMgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcHJpbnQgYSB3YXJuaW5nIHN1Z2dlc3RpbmdcbiAgICogICAgdGhhdCB5b3UgdHVybiBvZmYgYXV0b3B1Ymxpc2guKVxuICAgKi9cblxuICAvKipcbiAgICogQHN1bW1hcnkgUHVibGlzaCBhIHJlY29yZCBzZXQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbmFtZSBJZiBTdHJpbmcsIG5hbWUgb2YgdGhlIHJlY29yZCBzZXQuICBJZiBPYmplY3QsIHB1YmxpY2F0aW9ucyBEaWN0aW9uYXJ5IG9mIHB1Ymxpc2ggZnVuY3Rpb25zIGJ5IG5hbWUuICBJZiBgbnVsbGAsIHRoZSBzZXQgaGFzIG5vIG5hbWUsIGFuZCB0aGUgcmVjb3JkIHNldCBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgdG8gYWxsIGNvbm5lY3RlZCBjbGllbnRzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIEZ1bmN0aW9uIGNhbGxlZCBvbiB0aGUgc2VydmVyIGVhY2ggdGltZSBhIGNsaWVudCBzdWJzY3JpYmVzLiAgSW5zaWRlIHRoZSBmdW5jdGlvbiwgYHRoaXNgIGlzIHRoZSBwdWJsaXNoIGhhbmRsZXIgb2JqZWN0LCBkZXNjcmliZWQgYmVsb3cuICBJZiB0aGUgY2xpZW50IHBhc3NlZCBhcmd1bWVudHMgdG8gYHN1YnNjcmliZWAsIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaXNoOiBmdW5jdGlvbiAobmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghIF8uaXNPYmplY3QobmFtZSkpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lIGluIHNlbGYucHVibGlzaF9oYW5kbGVycykge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiSWdub3JpbmcgZHVwbGljYXRlIHB1Ymxpc2ggbmFtZWQgJ1wiICsgbmFtZSArIFwiJ1wiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoUGFja2FnZS5hdXRvcHVibGlzaCAmJiAhb3B0aW9ucy5pc19hdXRvKSB7XG4gICAgICAgIC8vIFRoZXkgaGF2ZSBhdXRvcHVibGlzaCBvbiwgeWV0IHRoZXkncmUgdHJ5aW5nIHRvIG1hbnVhbGx5XG4gICAgICAgIC8vIHBpY2tpbmcgc3R1ZmYgdG8gcHVibGlzaC4gVGhleSBwcm9iYWJseSBzaG91bGQgdHVybiBvZmZcbiAgICAgICAgLy8gYXV0b3B1Ymxpc2guIChUaGlzIGNoZWNrIGlzbid0IHBlcmZlY3QgLS0gaWYgeW91IGNyZWF0ZSBhXG4gICAgICAgIC8vIHB1Ymxpc2ggYmVmb3JlIHlvdSB0dXJuIG9uIGF1dG9wdWJsaXNoLCBpdCB3b24ndCBjYXRjaFxuICAgICAgICAvLyBpdC4gQnV0IHRoaXMgd2lsbCBkZWZpbml0ZWx5IGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmVcbiAgICAgICAgLy8geW91J3ZlIGFkZGVkIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlIHRvIHlvdXIgYXBwLCBhbmQgYXJlXG4gICAgICAgIC8vIGNhbGxpbmcgcHVibGlzaCBmcm9tIHlvdXIgYXBwIGNvZGUuKVxuICAgICAgICBpZiAoIXNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoKSB7XG4gICAgICAgICAgc2VsZi53YXJuZWRfYWJvdXRfYXV0b3B1Ymxpc2ggPSB0cnVlO1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXG4gICAgXCIqKiBZb3UndmUgc2V0IHVwIHNvbWUgZGF0YSBzdWJzY3JpcHRpb25zIHdpdGggTWV0ZW9yLnB1Ymxpc2goKSwgYnV0XFxuXCIgK1xuICAgIFwiKiogeW91IHN0aWxsIGhhdmUgYXV0b3B1Ymxpc2ggdHVybmVkIG9uLiBCZWNhdXNlIGF1dG9wdWJsaXNoIGlzIHN0aWxsXFxuXCIgK1xuICAgIFwiKiogb24sIHlvdXIgTWV0ZW9yLnB1Ymxpc2goKSBjYWxscyB3b24ndCBoYXZlIG11Y2ggZWZmZWN0LiBBbGwgZGF0YVxcblwiICtcbiAgICBcIioqIHdpbGwgc3RpbGwgYmUgc2VudCB0byBhbGwgY2xpZW50cy5cXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIFR1cm4gb2ZmIGF1dG9wdWJsaXNoIGJ5IHJlbW92aW5nIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlOlxcblwiICtcbiAgICBcIioqXFxuXCIgK1xuICAgIFwiKiogICAkIG1ldGVvciByZW1vdmUgYXV0b3B1Ymxpc2hcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIC4uIGFuZCBtYWtlIHN1cmUgeW91IGhhdmUgTWV0ZW9yLnB1Ymxpc2goKSBhbmQgTWV0ZW9yLnN1YnNjcmliZSgpIGNhbGxzXFxuXCIgK1xuICAgIFwiKiogZm9yIGVhY2ggY29sbGVjdGlvbiB0aGF0IHlvdSB3YW50IGNsaWVudHMgdG8gc2VlLlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSlcbiAgICAgICAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzW25hbWVdID0gaGFuZGxlcjtcbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIC8vIFNwaW4gdXAgdGhlIG5ldyBwdWJsaXNoZXIgb24gYW55IGV4aXN0aW5nIHNlc3Npb24gdG9vLiBSdW4gZWFjaFxuICAgICAgICAvLyBzZXNzaW9uJ3Mgc3Vic2NyaXB0aW9uIGluIGEgbmV3IEZpYmVyLCBzbyB0aGF0IHRoZXJlJ3Mgbm8gY2hhbmdlIGZvclxuICAgICAgICAvLyBzZWxmLnNlc3Npb25zIHRvIGNoYW5nZSB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoaXMgbG9vcC5cbiAgICAgICAgc2VsZi5zZXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzKSB7XG4gICAgICAgICAgICBGaWJlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgXy5lYWNoKG5hbWUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgc2VsZi5wdWJsaXNoKGtleSwgdmFsdWUsIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfcmVtb3ZlU2Vzc2lvbjogZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5zZXNzaW9ucy5kZWxldGUoc2Vzc2lvbi5pZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGludm9rZWQgb3ZlciB0aGUgbmV0d29yayBieSBjbGllbnRzLlxuICAgKiBAbG9jdXMgQW55d2hlcmVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgRGljdGlvbmFyeSB3aG9zZSBrZXlzIGFyZSBtZXRob2QgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZnVuY3Rpb25zLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG1ldGhvZHM6IGZ1bmN0aW9uIChtZXRob2RzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIF8uZWFjaChtZXRob2RzLCBmdW5jdGlvbiAoZnVuYywgbmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2QgJ1wiICsgbmFtZSArIFwiJyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICBpZiAoc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgbWV0aG9kIG5hbWVkICdcIiArIG5hbWUgKyBcIicgaXMgYWxyZWFkeSBkZWZpbmVkXCIpO1xuICAgICAgc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0gPSBmdW5jO1xuICAgIH0pO1xuICB9LFxuXG4gIGNhbGw6IGZ1bmN0aW9uIChuYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoICYmIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcmVzdWx0IGNhbGxiYWNrLCBub3RcbiAgICAgIC8vIGEgcGFyYW1ldGVyIHRvIHRoZSByZW1vdGUgbWV0aG9kLlxuICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseShuYW1lLCBhcmdzLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gQSB2ZXJzaW9uIG9mIHRoZSBjYWxsIG1ldGhvZCB0aGF0IGFsd2F5cyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgY2FsbEFzeW5jOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncyk7XG4gIH0sXG5cbiAgYXBwbHk6IGZ1bmN0aW9uIChuYW1lLCBhcmdzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIC8vIFdlIHdlcmUgcGFzc2VkIDMgYXJndW1lbnRzLiBUaGV5IG1heSBiZSBlaXRoZXIgKG5hbWUsIGFyZ3MsIG9wdGlvbnMpXG4gICAgLy8gb3IgKG5hbWUsIGFyZ3MsIGNhbGxiYWNrKVxuICAgIGlmICghIGNhbGxiYWNrICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncywgb3B0aW9ucyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpbiB3aGljaGV2ZXIgd2F5IHRoZSBjYWxsZXIgYXNrZWQgZm9yIGl0LiBOb3RlIHRoYXQgd2VcbiAgICAvLyBkbyBOT1QgYmxvY2sgb24gdGhlIHdyaXRlIGZlbmNlIGluIGFuIGFuYWxvZ291cyB3YXkgdG8gaG93IHRoZSBjbGllbnRcbiAgICAvLyBibG9ja3Mgb24gdGhlIHJlbGV2YW50IGRhdGEgYmVpbmcgdmlzaWJsZSwgc28geW91IGFyZSBOT1QgZ3VhcmFudGVlZCB0aGF0XG4gICAgLy8gY3Vyc29yIG9ic2VydmUgY2FsbGJhY2tzIGhhdmUgZmlyZWQgd2hlbiB5b3VyIGNhbGxiYWNrIGlzIGludm9rZWQuIChXZVxuICAgIC8vIGNhbiBjaGFuZ2UgdGhpcyBpZiB0aGVyZSdzIGEgcmVhbCB1c2UgY2FzZS4pXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwcm9taXNlLnRoZW4oXG4gICAgICAgIHJlc3VsdCA9PiBjYWxsYmFjayh1bmRlZmluZWQsIHJlc3VsdCksXG4gICAgICAgIGV4Y2VwdGlvbiA9PiBjYWxsYmFjayhleGNlcHRpb24pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS5hd2FpdCgpO1xuICAgIH1cbiAgfSxcblxuICAvLyBAcGFyYW0gb3B0aW9ucyB7T3B0aW9uYWwgT2JqZWN0fVxuICBhcHBseUFzeW5jOiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFJ1biB0aGUgaGFuZGxlclxuICAgIHZhciBoYW5kbGVyID0gdGhpcy5tZXRob2RfaGFuZGxlcnNbbmFtZV07XG4gICAgaWYgKCEgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHtuYW1lfScgbm90IGZvdW5kYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIG1ldGhvZCBjYWxsIGZyb20gd2l0aGluIGFub3RoZXIgbWV0aG9kIG9yIHB1Ymxpc2ggZnVuY3Rpb24sXG4gICAgLy8gZ2V0IHRoZSB1c2VyIHN0YXRlIGZyb20gdGhlIG91dGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLCBvdGhlcndpc2VcbiAgICAvLyBkb24ndCBhbGxvdyBzZXRVc2VySWQgdG8gYmUgY2FsbGVkXG4gICAgdmFyIHVzZXJJZCA9IG51bGw7XG4gICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY2FsbCBzZXRVc2VySWQgb24gYSBzZXJ2ZXIgaW5pdGlhdGVkIG1ldGhvZCBjYWxsXCIpO1xuICAgIH07XG4gICAgdmFyIGNvbm5lY3Rpb24gPSBudWxsO1xuICAgIHZhciBjdXJyZW50TWV0aG9kSW52b2NhdGlvbiA9IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24gPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIHJhbmRvbVNlZWQgPSBudWxsO1xuICAgIGlmIChjdXJyZW50TWV0aG9kSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudE1ldGhvZEludm9jYXRpb24udXNlcklkO1xuICAgICAgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnNldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcbiAgICAgIGNvbm5lY3Rpb24gPSBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgICAgcmFuZG9tU2VlZCA9IEREUENvbW1vbi5tYWtlUnBjU2VlZChjdXJyZW50TWV0aG9kSW52b2NhdGlvbiwgbmFtZSk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uKSB7XG4gICAgICB1c2VySWQgPSBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLl9zZXNzaW9uLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgIGlzU2ltdWxhdGlvbjogZmFsc2UsXG4gICAgICB1c2VySWQsXG4gICAgICBzZXRVc2VySWQsXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgcmFuZG9tU2VlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVzb2x2ZShcbiAgICAgIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgaGFuZGxlciwgaW52b2NhdGlvbiwgRUpTT04uY2xvbmUoYXJncyksXG4gICAgICAgICAgXCJpbnRlcm5hbCBjYWxsIHRvICdcIiArIG5hbWUgKyBcIidcIlxuICAgICAgICApXG4gICAgICApXG4gICAgKSkudGhlbihFSlNPTi5jbG9uZSk7XG4gIH0sXG5cbiAgX3VybEZvclNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uSWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNlc3Npb24gPSBzZWxmLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChzZXNzaW9uKVxuICAgICAgcmV0dXJuIHNlc3Npb24uX3NvY2tldFVybDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbnZhciBjYWxjdWxhdGVWZXJzaW9uID0gZnVuY3Rpb24gKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgdmFyIGNvcnJlY3RWZXJzaW9uID0gXy5maW5kKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLCBmdW5jdGlvbiAodmVyc2lvbikge1xuICAgIHJldHVybiBfLmNvbnRhaW5zKHNlcnZlclN1cHBvcnRlZFZlcnNpb25zLCB2ZXJzaW9uKTtcbiAgfSk7XG4gIGlmICghY29ycmVjdFZlcnNpb24pIHtcbiAgICBjb3JyZWN0VmVyc2lvbiA9IHNlcnZlclN1cHBvcnRlZFZlcnNpb25zWzBdO1xuICB9XG4gIHJldHVybiBjb3JyZWN0VmVyc2lvbjtcbn07XG5cbkREUFNlcnZlci5fY2FsY3VsYXRlVmVyc2lvbiA9IGNhbGN1bGF0ZVZlcnNpb247XG5cblxuLy8gXCJibGluZFwiIGV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0aG9zZSB0aGF0IHdlcmUgZGVsaWJlcmF0ZWx5IHRocm93biB0byBzaWduYWxcbi8vIGVycm9ycyB0byB0aGUgY2xpZW50XG52YXIgd3JhcEludGVybmFsRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgY29udGV4dCkge1xuICBpZiAoIWV4Y2VwdGlvbikgcmV0dXJuIGV4Y2VwdGlvbjtcblxuICAvLyBUbyBhbGxvdyBwYWNrYWdlcyB0byB0aHJvdyBlcnJvcnMgaW50ZW5kZWQgZm9yIHRoZSBjbGllbnQgYnV0IG5vdCBoYXZlIHRvXG4gIC8vIGRlcGVuZCBvbiB0aGUgTWV0ZW9yLkVycm9yIGNsYXNzLCBgaXNDbGllbnRTYWZlYCBjYW4gYmUgc2V0IHRvIHRydWUgb24gYW55XG4gIC8vIGVycm9yIGJlZm9yZSBpdCBpcyB0aHJvd24uXG4gIGlmIChleGNlcHRpb24uaXNDbGllbnRTYWZlKSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgTWV0ZW9yLkVycm9yKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTWV0ZW9yLkVycm9yKGV4Y2VwdGlvbi5lcnJvciwgZXhjZXB0aW9uLnJlYXNvbiwgZXhjZXB0aW9uLmRldGFpbHMpO1xuICAgICAgZXhjZXB0aW9uLm1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG4gIH1cblxuICAvLyBUZXN0cyBjYW4gc2V0IHRoZSAnX2V4cGVjdGVkQnlUZXN0JyBmbGFnIG9uIGFuIGV4Y2VwdGlvbiBzbyBpdCB3b24ndCBnbyB0b1xuICAvLyB0aGUgc2VydmVyIGxvZy5cbiAgaWYgKCFleGNlcHRpb24uX2V4cGVjdGVkQnlUZXN0KSB7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQsIGV4Y2VwdGlvbi5zdGFjayk7XG4gICAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIlNhbml0aXplZCBhbmQgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCBhczpcIiwgZXhjZXB0aW9uLnNhbml0aXplZEVycm9yKTtcbiAgICAgIE1ldGVvci5fZGVidWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBEaWQgdGhlIGVycm9yIGNvbnRhaW4gbW9yZSBkZXRhaWxzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHVzZWZ1bCBpZiBjYXVnaHQgaW5cbiAgLy8gc2VydmVyIGNvZGUgKG9yIGlmIHRocm93biBmcm9tIG5vbi1jbGllbnQtb3JpZ2luYXRlZCBjb2RlKSwgYnV0IGFsc29cbiAgLy8gcHJvdmlkZWQgYSBcInNhbml0aXplZFwiIHZlcnNpb24gd2l0aCBtb3JlIGNvbnRleHQgdGhhbiA1MDAgSW50ZXJuYWwgc2VydmVyXG4gIC8vIGVycm9yPyBVc2UgdGhhdC5cbiAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IuaXNDbGllbnRTYWZlKVxuICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcjtcbiAgICBNZXRlb3IuX2RlYnVnKFwiRXhjZXB0aW9uIFwiICsgY29udGV4dCArIFwiIHByb3ZpZGVzIGEgc2FuaXRpemVkRXJyb3IgdGhhdCBcIiArXG4gICAgICAgICAgICAgICAgICBcImRvZXMgbm90IGhhdmUgaXNDbGllbnRTYWZlIHByb3BlcnR5IHNldDsgaWdub3JpbmdcIik7XG4gIH1cblxuICByZXR1cm4gbmV3IE1ldGVvci5FcnJvcig1MDAsIFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIpO1xufTtcblxuXG4vLyBBdWRpdCBhcmd1bWVudCBjaGVja3MsIGlmIHRoZSBhdWRpdC1hcmd1bWVudC1jaGVja3MgcGFja2FnZSBleGlzdHMgKGl0IGlzIGFcbi8vIHdlYWsgZGVwZW5kZW5jeSBvZiB0aGlzIHBhY2thZ2UpLlxudmFyIG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyA9IGZ1bmN0aW9uIChmLCBjb250ZXh0LCBhcmdzLCBkZXNjcmlwdGlvbikge1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgaWYgKFBhY2thZ2VbJ2F1ZGl0LWFyZ3VtZW50LWNoZWNrcyddKSB7XG4gICAgcmV0dXJuIE1hdGNoLl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkKFxuICAgICAgZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pO1xuICB9XG4gIHJldHVybiBmLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xufTtcbiIsInZhciBGdXR1cmUgPSBOcG0ucmVxdWlyZSgnZmliZXJzL2Z1dHVyZScpO1xuXG4vLyBBIHdyaXRlIGZlbmNlIGNvbGxlY3RzIGEgZ3JvdXAgb2Ygd3JpdGVzLCBhbmQgcHJvdmlkZXMgYSBjYWxsYmFja1xuLy8gd2hlbiBhbGwgb2YgdGhlIHdyaXRlcyBhcmUgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkIChhbGxcbi8vIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQgb2YgdGhlIHdyaXRlIGFuZCBhY2tub3dsZWRnZWQgaXQuKVxuLy9cbkREUFNlcnZlci5fV3JpdGVGZW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuYXJtZWQgPSBmYWxzZTtcbiAgc2VsZi5maXJlZCA9IGZhbHNlO1xuICBzZWxmLnJldGlyZWQgPSBmYWxzZTtcbiAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMgPSAwO1xuICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICBzZWxmLmNvbXBsZXRpb25fY2FsbGJhY2tzID0gW107XG59O1xuXG4vLyBUaGUgY3VycmVudCB3cml0ZSBmZW5jZS4gV2hlbiB0aGVyZSBpcyBhIGN1cnJlbnQgd3JpdGUgZmVuY2UsIGNvZGVcbi8vIHRoYXQgd3JpdGVzIHRvIGRhdGFiYXNlcyBzaG91bGQgcmVnaXN0ZXIgdGhlaXIgd3JpdGVzIHdpdGggaXQgdXNpbmdcbi8vIGJlZ2luV3JpdGUoKS5cbi8vXG5ERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlID0gbmV3IE1ldGVvci5FbnZpcm9ubWVudFZhcmlhYmxlO1xuXG5fLmV4dGVuZChERFBTZXJ2ZXIuX1dyaXRlRmVuY2UucHJvdG90eXBlLCB7XG4gIC8vIFN0YXJ0IHRyYWNraW5nIGEgd3JpdGUsIGFuZCByZXR1cm4gYW4gb2JqZWN0IHRvIHJlcHJlc2VudCBpdC4gVGhlXG4gIC8vIG9iamVjdCBoYXMgYSBzaW5nbGUgbWV0aG9kLCBjb21taXR0ZWQoKS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlXG4gIC8vIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBpcyBmdWxseSBjb21taXR0ZWQgYW5kIHByb3BhZ2F0ZWQuIFlvdSBjYW5cbiAgLy8gY29udGludWUgdG8gYWRkIHdyaXRlcyB0byB0aGUgV3JpdGVGZW5jZSB1cCB1bnRpbCBpdCBpcyB0cmlnZ2VyZWRcbiAgLy8gKGNhbGxzIGl0cyBjYWxsYmFja3MgYmVjYXVzZSBhbGwgd3JpdGVzIGhhdmUgY29tbWl0dGVkLilcbiAgYmVnaW5Xcml0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmIChzZWxmLnJldGlyZWQpXG4gICAgICByZXR1cm4geyBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHt9IH07XG5cbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBhZGQgd3JpdGVzXCIpO1xuXG4gICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICB2YXIgY29tbWl0dGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1pdHRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29tbWl0dGVkKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbW1pdHRlZCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUgd3JpdGVcIik7XG4gICAgICAgIGNvbW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzLS07XG4gICAgICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgLy8gQXJtIHRoZSBmZW5jZS4gT25jZSB0aGUgZmVuY2UgaXMgYXJtZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZVxuICAvLyB1bmNvbW1pdHRlZCB3cml0ZXMsIGl0IHdpbGwgYWN0aXZhdGUuXG4gIGFybTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZiA9PT0gRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS5nZXQoKSlcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgYXJtIHRoZSBjdXJyZW50IGZlbmNlXCIpO1xuICAgIHNlbGYuYXJtZWQgPSB0cnVlO1xuICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGZpcmluZyB0aGUgZmVuY2UuXG4gIC8vIENhbGxiYWNrIGZ1bmN0aW9uIGNhbiBhZGQgbmV3IHdyaXRlcyB0byB0aGUgZmVuY2UsIGluIHdoaWNoIGNhc2VcbiAgLy8gaXQgd29uJ3QgZmlyZSB1bnRpbCB0aG9zZSB3cml0ZXMgYXJlIGRvbmUgYXMgd2VsbC5cbiAgb25CZWZvcmVGaXJlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJhZGQgYSBjYWxsYmFja1wiKTtcbiAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlbmNlIGZpcmVzLlxuICBvbkFsbENvbW1pdHRlZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uLiBBcm1zIHRoZSBmZW5jZSwgdGhlbiBibG9ja3MgdW50aWwgaXQgZmlyZXMuXG4gIGFybUFuZFdhaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmU7XG4gICAgc2VsZi5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICBmdXR1cmVbJ3JldHVybiddKCk7XG4gICAgfSk7XG4gICAgc2VsZi5hcm0oKTtcbiAgICBmdXR1cmUud2FpdCgpO1xuICB9LFxuXG4gIF9tYXliZUZpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSBmZW5jZSBhbHJlYWR5IGFjdGl2YXRlZD9cIik7XG4gICAgaWYgKHNlbGYuYXJtZWQgJiYgIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICBmdW5jdGlvbiBpbnZva2VDYWxsYmFjayAoZnVuYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZ1bmMoc2VsZik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXCJleGNlcHRpb24gaW4gd3JpdGUgZmVuY2UgY2FsbGJhY2tcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcysrO1xuICAgICAgd2hpbGUgKHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzO1xuICAgICAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuXG4gICAgICBpZiAoIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICAgIHNlbGYuZmlyZWQgPSB0cnVlO1xuICAgICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIERlYWN0aXZhdGUgdGhpcyBmZW5jZSBzbyB0aGF0IGFkZGluZyBtb3JlIHdyaXRlcyBoYXMgbm8gZWZmZWN0LlxuICAvLyBUaGUgZmVuY2UgbXVzdCBoYXZlIGFscmVhZHkgZmlyZWQuXG4gIHJldGlyZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoISBzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmV0aXJlIGEgZmVuY2UgdGhhdCBoYXNuJ3QgZmlyZWQuXCIpO1xuICAgIHNlbGYucmV0aXJlZCA9IHRydWU7XG4gIH1cbn0pO1xuIiwiLy8gQSBcImNyb3NzYmFyXCIgaXMgYSBjbGFzcyB0aGF0IHByb3ZpZGVzIHN0cnVjdHVyZWQgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbi5cbi8vIFNlZSBfbWF0Y2ggZm9yIHRoZSBkZWZpbml0aW9uIG9mIGhvdyBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzIGEgdHJpZ2dlci5cbi8vIEFsbCBub3RpZmljYXRpb25zIGFuZCB0cmlnZ2VycyBtdXN0IGhhdmUgYSBzdHJpbmcga2V5IG5hbWVkICdjb2xsZWN0aW9uJy5cblxuRERQU2VydmVyLl9Dcm9zc2JhciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgc2VsZi5uZXh0SWQgPSAxO1xuICAvLyBtYXAgZnJvbSBjb2xsZWN0aW9uIG5hbWUgKHN0cmluZykgLT4gbGlzdGVuZXIgaWQgLT4gb2JqZWN0LiBlYWNoIG9iamVjdCBoYXNcbiAgLy8ga2V5cyAndHJpZ2dlcicsICdjYWxsYmFjaycuICBBcyBhIGhhY2ssIHRoZSBlbXB0eSBzdHJpbmcgbWVhbnMgXCJub1xuICAvLyBjb2xsZWN0aW9uXCIuXG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uID0ge307XG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnQgPSB7fTtcbiAgc2VsZi5mYWN0UGFja2FnZSA9IG9wdGlvbnMuZmFjdFBhY2thZ2UgfHwgXCJsaXZlZGF0YVwiO1xuICBzZWxmLmZhY3ROYW1lID0gb3B0aW9ucy5mYWN0TmFtZSB8fCBudWxsO1xufTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Dcm9zc2Jhci5wcm90b3R5cGUsIHtcbiAgLy8gbXNnIGlzIGEgdHJpZ2dlciBvciBhIG5vdGlmaWNhdGlvblxuICBfY29sbGVjdGlvbkZvck1lc3NhZ2U6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgXy5oYXMobXNnLCAnY29sbGVjdGlvbicpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YobXNnLmNvbGxlY3Rpb24pID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG1zZy5jb2xsZWN0aW9uID09PSAnJylcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBlbXB0eSBjb2xsZWN0aW9uIVwiKTtcbiAgICAgIHJldHVybiBtc2cuY29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBub24tc3RyaW5nIGNvbGxlY3Rpb24hXCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBMaXN0ZW4gZm9yIG5vdGlmaWNhdGlvbiB0aGF0IG1hdGNoICd0cmlnZ2VyJy4gQSBub3RpZmljYXRpb25cbiAgLy8gbWF0Y2hlcyBpZiBpdCBoYXMgdGhlIGtleS12YWx1ZSBwYWlycyBpbiB0cmlnZ2VyIGFzIGFcbiAgLy8gc3Vic2V0LiBXaGVuIGEgbm90aWZpY2F0aW9uIG1hdGNoZXMsIGNhbGwgJ2NhbGxiYWNrJywgcGFzc2luZ1xuICAvLyB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbi5cbiAgLy9cbiAgLy8gUmV0dXJucyBhIGxpc3RlbiBoYW5kbGUsIHdoaWNoIGlzIGFuIG9iamVjdCB3aXRoIGEgbWV0aG9kXG4gIC8vIHN0b3AoKS4gQ2FsbCBzdG9wKCkgdG8gc3RvcCBsaXN0ZW5pbmcuXG4gIC8vXG4gIC8vIFhYWCBJdCBzaG91bGQgYmUgbGVnYWwgdG8gY2FsbCBmaXJlKCkgZnJvbSBpbnNpZGUgYSBsaXN0ZW4oKVxuICAvLyBjYWxsYmFjaz9cbiAgbGlzdGVuOiBmdW5jdGlvbiAodHJpZ2dlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGlkID0gc2VsZi5uZXh0SWQrKztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2UodHJpZ2dlcik7XG4gICAgdmFyIHJlY29yZCA9IHt0cmlnZ2VyOiBFSlNPTi5jbG9uZSh0cmlnZ2VyKSwgY2FsbGJhY2s6IGNhbGxiYWNrfTtcbiAgICBpZiAoISBfLmhhcyhzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiwgY29sbGVjdGlvbikpIHtcbiAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dID0ge307XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID0gMDtcbiAgICB9XG4gICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdID0gcmVjb3JkO1xuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0rKztcblxuICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICAgICAgc2VsZi5mYWN0UGFja2FnZSwgc2VsZi5mYWN0TmFtZSwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXVtpZF07XG4gICAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0tLTtcbiAgICAgICAgaWYgKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0gPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEZpcmUgdGhlIHByb3ZpZGVkICdub3RpZmljYXRpb24nIChhbiBvYmplY3Qgd2hvc2UgYXR0cmlidXRlXG4gIC8vIHZhbHVlcyBhcmUgYWxsIEpTT04tY29tcGF0aWJpbGUpIC0tIGluZm9ybSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzXG4gIC8vIChyZWdpc3RlcmVkIHdpdGggbGlzdGVuKCkpLlxuICAvL1xuICAvLyBJZiBmaXJlKCkgaXMgY2FsbGVkIGluc2lkZSBhIHdyaXRlIGZlbmNlLCB0aGVuIGVhY2ggb2YgdGhlXG4gIC8vIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBpbnNpZGUgdGhlIHdyaXRlIGZlbmNlIGFzIHdlbGwuXG4gIC8vXG4gIC8vIFRoZSBsaXN0ZW5lcnMgbWF5IGJlIGludm9rZWQgaW4gcGFyYWxsZWwsIHJhdGhlciB0aGFuIHNlcmlhbGx5LlxuICBmaXJlOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIGNvbGxlY3Rpb24gPSBzZWxmLl9jb2xsZWN0aW9uRm9yTWVzc2FnZShub3RpZmljYXRpb24pO1xuXG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24gPSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXTtcbiAgICB2YXIgY2FsbGJhY2tJZHMgPSBbXTtcbiAgICBfLmVhY2gobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgZnVuY3Rpb24gKGwsIGlkKSB7XG4gICAgICBpZiAoc2VsZi5fbWF0Y2hlcyhub3RpZmljYXRpb24sIGwudHJpZ2dlcikpIHtcbiAgICAgICAgY2FsbGJhY2tJZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW5lciBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBuZWVkIHRvIGZpcnN0IGZpbmQgYWxsIHRoZSBvbmVzIHRoYXRcbiAgICAvLyBtYXRjaCBpbiBhIHNpbmdsZSBpdGVyYXRpb24gb3ZlciBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiAod2hpY2ggY2FuJ3RcbiAgICAvLyBiZSBtdXRhdGVkIGR1cmluZyB0aGlzIGl0ZXJhdGlvbiksIGFuZCB0aGVuIGludm9rZSB0aGUgbWF0Y2hpbmdcbiAgICAvLyBjYWxsYmFja3MsIGNoZWNraW5nIGJlZm9yZSBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoZXkgaGF2ZW4ndCBzdG9wcGVkLlxuICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoYXRcbiAgICAvLyBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSBzdGlsbCA9PT0gbGlzdGVuZXJzRm9yQ29sbGVjdGlvbixcbiAgICAvLyBiZWNhdXNlIHRoZSBvbmx5IHdheSB0aGF0IHN0b3BzIGJlaW5nIHRydWUgaXMgaWYgbGlzdGVuZXJzRm9yQ29sbGVjdGlvblxuICAgIC8vIGZpcnN0IGdldHMgcmVkdWNlZCBkb3duIHRvIHRoZSBlbXB0eSBvYmplY3QgKGFuZCB0aGVuIG5ldmVyIGdldHNcbiAgICAvLyBpbmNyZWFzZWQgYWdhaW4pLlxuICAgIF8uZWFjaChjYWxsYmFja0lkcywgZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoXy5oYXMobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgaWQpKSB7XG4gICAgICAgIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25baWRdLmNhbGxiYWNrKG5vdGlmaWNhdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gQSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIgaWYgYWxsIGtleXMgdGhhdCBleGlzdCBpbiBib3RoIGFyZSBlcXVhbC5cbiAgLy9cbiAgLy8gRXhhbXBsZXM6XG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGEgbm9uLXRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIHRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIHRhcmdldGVkIHF1ZXJ5IHRhcmdldGVkXG4gIC8vICAgICBhdCB0aGUgc2FtZSBkb2N1bWVudClcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IGRvZXMgbm90IG1hdGNoIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJZXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhIHRhcmdldGVkIHF1ZXJ5XG4gIC8vICAgICB0YXJnZXRlZCBhdCBhIGRpZmZlcmVudCBkb2N1bWVudClcbiAgX21hdGNoZXM6IGZ1bmN0aW9uIChub3RpZmljYXRpb24sIHRyaWdnZXIpIHtcbiAgICAvLyBNb3N0IG5vdGlmaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGNyb3NzYmFyIGhhdmUgYSBzdHJpbmcgYGNvbGxlY3Rpb25gIGFuZFxuICAgIC8vIG1heWJlIGFuIGBpZGAgdGhhdCBpcyBhIHN0cmluZyBvciBPYmplY3RJRC4gV2UncmUgYWxyZWFkeSBkaXZpZGluZyB1cFxuICAgIC8vIHRyaWdnZXJzIGJ5IGNvbGxlY3Rpb24sIGJ1dCBsZXQncyBmYXN0LXRyYWNrIFwibm9wZSwgZGlmZmVyZW50IElEXCIgKGFuZFxuICAgIC8vIGF2b2lkIHRoZSBvdmVybHkgZ2VuZXJpYyBFSlNPTi5lcXVhbHMpLiBUaGlzIG1ha2VzIGEgbm90aWNlYWJsZVxuICAgIC8vIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2U7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9wdWxsLzM2OTdcbiAgICBpZiAodHlwZW9mKG5vdGlmaWNhdGlvbi5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZih0cmlnZ2VyLmlkKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgbm90aWZpY2F0aW9uLmlkICE9PSB0cmlnZ2VyLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub3RpZmljYXRpb24uaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgIHRyaWdnZXIuaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgICEgbm90aWZpY2F0aW9uLmlkLmVxdWFscyh0cmlnZ2VyLmlkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBfLmFsbCh0cmlnZ2VyLCBmdW5jdGlvbiAodHJpZ2dlclZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVybiAhXy5oYXMobm90aWZpY2F0aW9uLCBrZXkpIHx8XG4gICAgICAgIEVKU09OLmVxdWFscyh0cmlnZ2VyVmFsdWUsIG5vdGlmaWNhdGlvbltrZXldKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8vIFRoZSBcImludmFsaWRhdGlvbiBjcm9zc2JhclwiIGlzIGEgc3BlY2lmaWMgaW5zdGFuY2UgdXNlZCBieSB0aGUgRERQIHNlcnZlciB0b1xuLy8gaW1wbGVtZW50IHdyaXRlIGZlbmNlIG5vdGlmaWNhdGlvbnMuIExpc3RlbmVyIGNhbGxiYWNrcyBvbiB0aGlzIGNyb3NzYmFyXG4vLyBzaG91bGQgY2FsbCBiZWdpbldyaXRlIG9uIHRoZSBjdXJyZW50IHdyaXRlIGZlbmNlIGJlZm9yZSB0aGV5IHJldHVybiwgaWYgdGhleVxuLy8gd2FudCB0byBkZWxheSB0aGUgd3JpdGUgZmVuY2UgZnJvbSBmaXJpbmcgKGllLCB0aGUgRERQIG1ldGhvZC1kYXRhLXVwZGF0ZWRcbi8vIG1lc3NhZ2UgZnJvbSBiZWluZyBzZW50KS5cbkREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIgPSBuZXcgRERQU2VydmVyLl9Dcm9zc2Jhcih7XG4gIGZhY3ROYW1lOiBcImludmFsaWRhdGlvbi1jcm9zc2Jhci1saXN0ZW5lcnNcIlxufSk7XG4iLCJpZiAocHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwpIHtcbiAgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCA9XG4gICAgcHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkw7XG59XG5cbk1ldGVvci5zZXJ2ZXIgPSBuZXcgU2VydmVyO1xuXG5NZXRlb3IucmVmcmVzaCA9IGZ1bmN0aW9uIChub3RpZmljYXRpb24pIHtcbiAgRERQU2VydmVyLl9JbnZhbGlkYXRpb25Dcm9zc2Jhci5maXJlKG5vdGlmaWNhdGlvbik7XG59O1xuXG4vLyBQcm94eSB0aGUgcHVibGljIG1ldGhvZHMgb2YgTWV0ZW9yLnNlcnZlciBzbyB0aGV5IGNhblxuLy8gYmUgY2FsbGVkIGRpcmVjdGx5IG9uIE1ldGVvci5cbl8uZWFjaChbJ3B1Ymxpc2gnLCAnbWV0aG9kcycsICdjYWxsJywgJ2FwcGx5JywgJ29uQ29ubmVjdGlvbicsICdvbk1lc3NhZ2UnXSxcbiAgICAgICBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgTWV0ZW9yW25hbWVdID0gXy5iaW5kKE1ldGVvci5zZXJ2ZXJbbmFtZV0sIE1ldGVvci5zZXJ2ZXIpO1xuICAgICAgIH0pO1xuXG4vLyBNZXRlb3Iuc2VydmVyIHVzZWQgdG8gYmUgY2FsbGVkIE1ldGVvci5kZWZhdWx0X3NlcnZlci4gUHJvdmlkZVxuLy8gYmFja2NvbXBhdCBhcyBhIGNvdXJ0ZXN5IGV2ZW4gdGhvdWdoIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkLlxuLy8gWFhYIENPTVBBVCBXSVRIIDAuNi40XG5NZXRlb3IuZGVmYXVsdF9zZXJ2ZXIgPSBNZXRlb3Iuc2VydmVyO1xuIl19 diff --git a/server/bundle/programs/server/packages/ddp-server.js.map b/server/bundle/programs/server/packages/ddp-server.js.map index 96d6a02426..7f7cbe1659 100644 --- a/server/bundle/programs/server/packages/ddp-server.js.map +++ b/server/bundle/programs/server/packages/ddp-server.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","jsessionid","USE_JSESSIONID","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","stack","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function() {},\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({server_id: \"0\"}));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function() {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function(event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function(request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function(oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception.stack);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","jsessionid","USE_JSESSIONID","disable_cors","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","stack","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function () { },\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID,\n // 禁用cors,防止请求response返回Access-Control-Allow-Origin:*\n disable_cors: true\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({ server_id: \"0\" }));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function () {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function (event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function (request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function (oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception.stack);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file diff --git a/server/bundle/star.json b/server/bundle/star.json index 665464447a..c70d086232 100644 --- a/server/bundle/star.json +++ b/server/bundle/star.json @@ -36,5 +36,5 @@ "meteorRelease": "METEOR@1.9.3", "nodeVersion": "12.16.1", "npmVersion": "6.13.4", - "gitCommitHash": "dfc5b93993de2cdc4f25fc17cd29ba7f8947c069" + "gitCommitHash": "ff3716b5435f36644aa77f696f878d48faf1f906" } \ No newline at end of file From 19d66b8f9e38ad011e1f7161e2b02e74ff161f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=B5=A9=E6=9E=97?= Date: Fri, 19 Jul 2024 13:19:40 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BD=BF=E7=94=A8DISABLE=5FSOCKJS=5FCORS?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=98=AF=E5=90=A6=E7=A6=81=E6=AD=A2cors=20?= =?UTF-8?q?=EF=BC=88#6964=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- creator/packages/ddp-server/stream_server.js | 7 ++++--- server/bundle/programs/server/packages/ddp-server.js | 9 +++++---- server/bundle/programs/server/packages/ddp-server.js.map | 2 +- server/bundle/star.json | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/creator/packages/ddp-server/stream_server.js b/creator/packages/ddp-server/stream_server.js index 85a9997e56..16d62b3265 100644 --- a/creator/packages/ddp-server/stream_server.js +++ b/creator/packages/ddp-server/stream_server.js @@ -52,12 +52,13 @@ StreamServer = function () { // combining CPU-heavy processing with SockJS termination (eg a proxy which // converts to Unix sockets) but for now, raise the delay. disconnect_delay: 60 * 1000, + // Allow disabling of CORS requests to address + // https://github.com/meteor/meteor/issues/8317. + disable_cors: !!process.env.DISABLE_SOCKJS_CORS, // Set the USE_JSESSIONID environment variable to enable setting the // JSESSIONID cookie. This is useful for setting up proxies with // session affinity. - jsessionid: !!process.env.USE_JSESSIONID, - // 禁用cors,防止请求response返回Access-Control-Allow-Origin:* - disable_cors: true + jsessionid: !!process.env.USE_JSESSIONID }; // If you know your server environment (eg, proxies) will prevent websockets diff --git a/server/bundle/programs/server/packages/ddp-server.js b/server/bundle/programs/server/packages/ddp-server.js index 440878eebe..a01f98f0cd 100644 --- a/server/bundle/programs/server/packages/ddp-server.js +++ b/server/bundle/programs/server/packages/ddp-server.js @@ -84,12 +84,13 @@ StreamServer = function () { // combining CPU-heavy processing with SockJS termination (eg a proxy which // converts to Unix sockets) but for now, raise the delay. disconnect_delay: 60 * 1000, + // Allow disabling of CORS requests to address + // https://github.com/meteor/meteor/issues/8317. + disable_cors: !!process.env.DISABLE_SOCKJS_CORS, // Set the USE_JSESSIONID environment variable to enable setting the // JSESSIONID cookie. This is useful for setting up proxies with // session affinity. - jsessionid: !!process.env.USE_JSESSIONID, - // 禁用cors,防止请求response返回Access-Control-Allow-Origin:* - disable_cors: true + jsessionid: !!process.env.USE_JSESSIONID }; // If you know your server environment (eg, proxies) will prevent websockets // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie, // browsers) will not waste time attempting to use them. @@ -2247,4 +2248,4 @@ Package._define("ddp-server", { })(); //# sourceURL=meteor://💻app/packages/ddp-server.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJqc2Vzc2lvbmlkIiwiVVNFX0pTRVNTSU9OSUQiLCJkaXNhYmxlX2NvcnMiLCJESVNBQkxFX1dFQlNPQ0tFVFMiLCJ3ZWJzb2NrZXQiLCJmYXllX3NlcnZlcl9vcHRpb25zIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiV2ViQXBwIiwiaHR0cFNlcnZlciIsInJlbW92ZUxpc3RlbmVyIiwiX3RpbWVvdXRBZGp1c3RtZW50UmVxdWVzdENhbGxiYWNrIiwiaW5zdGFsbEhhbmRsZXJzIiwiYWRkTGlzdGVuZXIiLCJfcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCIsIm9uIiwic29ja2V0Iiwic2V0V2Vic29ja2V0VGltZW91dCIsInRpbWVvdXQiLCJwcm90b2NvbCIsIl9zZXNzaW9uIiwicmVjdiIsImNvbm5lY3Rpb24iLCJzZXRUaW1lb3V0Iiwic2VuZCIsImRhdGEiLCJ3cml0ZSIsIndpdGhvdXQiLCJzdHJpbmdpZnkiLCJzZXJ2ZXJfaWQiLCJlYWNoIiwiY2FsbGJhY2siLCJleHRlbmQiLCJwcm90b3R5cGUiLCJyZWdpc3RlciIsImFsbF9zb2NrZXRzIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIdHRwU2VydmVyTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwic2xpY2UiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJuZXdMaXN0ZW5lciIsInJlcXVlc3QiLCJhcmdzIiwiYXJndW1lbnRzIiwicGFyc2VkVXJsIiwicGF0aG5hbWUiLCJmb3JtYXQiLCJvbGRMaXN0ZW5lciIsImFwcGx5IiwiRERQU2VydmVyIiwiRmliZXIiLCJTZXNzaW9uRG9jdW1lbnRWaWV3IiwiZXhpc3RzSW4iLCJTZXQiLCJkYXRhQnlLZXkiLCJNYXAiLCJfU2Vzc2lvbkRvY3VtZW50VmlldyIsImdldEZpZWxkcyIsInJldCIsImZvckVhY2giLCJwcmVjZWRlbmNlTGlzdCIsImtleSIsInZhbHVlIiwiY2xlYXJGaWVsZCIsInN1YnNjcmlwdGlvbkhhbmRsZSIsImNoYW5nZUNvbGxlY3RvciIsImdldCIsInJlbW92ZWRWYWx1ZSIsInVuZGVmaW5lZCIsImkiLCJsZW5ndGgiLCJwcmVjZWRlbmNlIiwic3BsaWNlIiwiZGVsZXRlIiwiRUpTT04iLCJlcXVhbHMiLCJjaGFuZ2VGaWVsZCIsImlzQWRkIiwiY2xvbmUiLCJoYXMiLCJzZXQiLCJlbHQiLCJmaW5kIiwiU2Vzc2lvbkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbk5hbWUiLCJzZXNzaW9uQ2FsbGJhY2tzIiwiZG9jdW1lbnRzIiwiY2FsbGJhY2tzIiwiX1Nlc3Npb25Db2xsZWN0aW9uVmlldyIsImlzRW1wdHkiLCJzaXplIiwiZGlmZiIsInByZXZpb3VzIiwiRGlmZlNlcXVlbmNlIiwiZGlmZk1hcHMiLCJib3RoIiwiYmluZCIsImRpZmZEb2N1bWVudCIsInJpZ2h0T25seSIsImlkIiwibm93RFYiLCJhZGRlZCIsImxlZnRPbmx5IiwicHJldkRWIiwicmVtb3ZlZCIsImZpZWxkcyIsImRpZmZPYmplY3RzIiwicHJldiIsIm5vdyIsImNoYW5nZWQiLCJkb2NWaWV3IiwiYWRkIiwiY2hhbmdlZFJlc3VsdCIsIkVycm9yIiwiZXJyIiwiU2Vzc2lvbiIsInZlcnNpb24iLCJvcHRpb25zIiwiUmFuZG9tIiwiaW5pdGlhbGl6ZWQiLCJpblF1ZXVlIiwiTWV0ZW9yIiwiX0RvdWJsZUVuZGVkUXVldWUiLCJibG9ja2VkIiwid29ya2VyUnVubmluZyIsIl9uYW1lZFN1YnMiLCJfdW5pdmVyc2FsU3VicyIsInVzZXJJZCIsImNvbGxlY3Rpb25WaWV3cyIsIl9pc1NlbmRpbmciLCJfZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyIsIl9wZW5kaW5nUmVhZHkiLCJfY2xvc2VDYWxsYmFja3MiLCJfc29ja2V0VXJsIiwiX3Jlc3BvbmRUb1BpbmdzIiwicmVzcG9uZFRvUGluZ3MiLCJjb25uZWN0aW9uSGFuZGxlIiwiY2xvc2UiLCJvbkNsb3NlIiwiZm4iLCJjYiIsImJpbmRFbnZpcm9ubWVudCIsImRlZmVyIiwiY2xpZW50QWRkcmVzcyIsIl9jbGllbnRBZGRyZXNzIiwiaHR0cEhlYWRlcnMiLCJoZWFkZXJzIiwibXNnIiwic2Vzc2lvbiIsInN0YXJ0VW5pdmVyc2FsU3VicyIsInJ1biIsImhlYXJ0YmVhdEludGVydmFsIiwiaGVhcnRiZWF0IiwiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiaGVhcnRiZWF0VGltZW91dCIsIm9uVGltZW91dCIsInNlbmRQaW5nIiwic3RhcnQiLCJQYWNrYWdlIiwiRmFjdHMiLCJpbmNyZW1lbnRTZXJ2ZXJGYWN0Iiwic2VuZFJlYWR5Iiwic3Vic2NyaXB0aW9uSWRzIiwic3VicyIsInN1YnNjcmlwdGlvbklkIiwic2VuZEFkZGVkIiwiY29sbGVjdGlvbiIsInNlbmRDaGFuZ2VkIiwic2VuZFJlbW92ZWQiLCJnZXRTZW5kQ2FsbGJhY2tzIiwiZ2V0Q29sbGVjdGlvblZpZXciLCJ2aWV3IiwiaGFuZGxlcnMiLCJ1bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyIsImhhbmRsZXIiLCJfc3RhcnRTdWJzY3JpcHRpb24iLCJzdG9wIiwiX21ldGVvclNlc3Npb24iLCJfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMiLCJfcmVtb3ZlU2Vzc2lvbiIsIl9wcmludFNlbnRERFAiLCJfZGVidWciLCJzdHJpbmdpZnlERFAiLCJzZW5kRXJyb3IiLCJyZWFzb24iLCJvZmZlbmRpbmdNZXNzYWdlIiwicHJvY2Vzc01lc3NhZ2UiLCJtc2dfaW4iLCJtZXNzYWdlUmVjZWl2ZWQiLCJwcm9jZXNzTmV4dCIsInNoaWZ0IiwidW5ibG9jayIsIm9uTWVzc2FnZUhvb2siLCJwcm90b2NvbF9oYW5kbGVycyIsImNhbGwiLCJzdWIiLCJuYW1lIiwicGFyYW1zIiwiQXJyYXkiLCJwdWJsaXNoX2hhbmRsZXJzIiwiZXJyb3IiLCJERFBSYXRlTGltaXRlciIsInJhdGVMaW1pdGVySW5wdXQiLCJ0eXBlIiwiY29ubmVjdGlvbklkIiwiX2luY3JlbWVudCIsInJhdGVMaW1pdFJlc3VsdCIsIl9jaGVjayIsImFsbG93ZWQiLCJnZXRFcnJvck1lc3NhZ2UiLCJ0aW1lVG9SZXNldCIsInVuc3ViIiwiX3N0b3BTdWJzY3JpcHRpb24iLCJtZXRob2QiLCJyYW5kb21TZWVkIiwiZmVuY2UiLCJfV3JpdGVGZW5jZSIsIm9uQWxsQ29tbWl0dGVkIiwicmV0aXJlIiwibWV0aG9kcyIsIm1ldGhvZF9oYW5kbGVycyIsImFybSIsInNldFVzZXJJZCIsIl9zZXRVc2VySWQiLCJpbnZvY2F0aW9uIiwiTWV0aG9kSW52b2NhdGlvbiIsImlzU2ltdWxhdGlvbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9DdXJyZW50V3JpdGVGZW5jZSIsIndpdGhWYWx1ZSIsIkREUCIsIl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsIm1heWJlQXVkaXRBcmd1bWVudENoZWNrcyIsImZpbmlzaCIsInBheWxvYWQiLCJ0aGVuIiwicmVzdWx0IiwiZXhjZXB0aW9uIiwid3JhcEludGVybmFsRXhjZXB0aW9uIiwiX2VhY2hTdWIiLCJmIiwiX2RpZmZDb2xsZWN0aW9uVmlld3MiLCJiZWZvcmVDVnMiLCJsZWZ0VmFsdWUiLCJyaWdodFZhbHVlIiwiZG9jIiwiX2RlYWN0aXZhdGUiLCJvbGROYW1lZFN1YnMiLCJuZXdTdWIiLCJfcmVjcmVhdGUiLCJfcnVuSGFuZGxlciIsIl9ub1lpZWxkc0FsbG93ZWQiLCJzdWJJZCIsIlN1YnNjcmlwdGlvbiIsInN1Yk5hbWUiLCJtYXliZVN1YiIsIl9uYW1lIiwiX3JlbW92ZUFsbERvY3VtZW50cyIsInJlc3BvbnNlIiwiaHR0cEZvcndhcmRlZENvdW50IiwicGFyc2VJbnQiLCJyZW1vdGVBZGRyZXNzIiwiZm9yd2FyZGVkRm9yIiwiaXNTdHJpbmciLCJ0cmltIiwic3BsaXQiLCJfaGFuZGxlciIsIl9zdWJzY3JpcHRpb25JZCIsIl9wYXJhbXMiLCJfc3Vic2NyaXB0aW9uSGFuZGxlIiwiX2RlYWN0aXZhdGVkIiwiX3N0b3BDYWxsYmFja3MiLCJfZG9jdW1lbnRzIiwiX3JlYWR5IiwiX2lkRmlsdGVyIiwiaWRTdHJpbmdpZnkiLCJNb25nb0lEIiwiaWRQYXJzZSIsInJlcyIsIl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIiwiZSIsIl9pc0RlYWN0aXZhdGVkIiwiX3B1Ymxpc2hIYW5kbGVyUmVzdWx0IiwiaXNDdXJzb3IiLCJjIiwiX3B1Ymxpc2hDdXJzb3IiLCJyZWFkeSIsImlzQXJyYXkiLCJhbGwiLCJjb2xsZWN0aW9uTmFtZXMiLCJfZ2V0Q29sbGVjdGlvbk5hbWUiLCJjdXIiLCJfY2FsbFN0b3BDYWxsYmFja3MiLCJjb2xsZWN0aW9uRG9jcyIsInN0cklkIiwib25TdG9wIiwiaWRzIiwiU2VydmVyIiwiZGVmYXVsdHMiLCJvbkNvbm5lY3Rpb25Ib29rIiwiSG9vayIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwic2Vzc2lvbnMiLCJzdHJlYW1fc2VydmVyIiwicmF3X21zZyIsIl9wcmludFJlY2VpdmVkRERQIiwicGFyc2VERFAiLCJfaGFuZGxlQ29ubmVjdCIsIm9uQ29ubmVjdGlvbiIsIm9uTWVzc2FnZSIsInN1cHBvcnQiLCJjb250YWlucyIsIlNVUFBPUlRFRF9ERFBfVkVSU0lPTlMiLCJjYWxjdWxhdGVWZXJzaW9uIiwicHVibGlzaCIsImlzT2JqZWN0IiwiYXV0b3B1Ymxpc2giLCJpc19hdXRvIiwid2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoIiwiZnVuYyIsInBvcCIsImNhbGxBc3luYyIsImFwcGx5QXN5bmMiLCJhd2FpdCIsImN1cnJlbnRNZXRob2RJbnZvY2F0aW9uIiwiY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsIm1ha2VScGNTZWVkIiwiX3VybEZvclNlc3Npb24iLCJzZXNzaW9uSWQiLCJjbGllbnRTdXBwb3J0ZWRWZXJzaW9ucyIsInNlcnZlclN1cHBvcnRlZFZlcnNpb25zIiwiY29ycmVjdFZlcnNpb24iLCJfY2FsY3VsYXRlVmVyc2lvbiIsImNvbnRleHQiLCJpc0NsaWVudFNhZmUiLCJvcmlnaW5hbE1lc3NhZ2UiLCJtZXNzYWdlIiwiZGV0YWlscyIsIl9leHBlY3RlZEJ5VGVzdCIsInN0YWNrIiwic2FuaXRpemVkRXJyb3IiLCJkZXNjcmlwdGlvbiIsIk1hdGNoIiwiX2ZhaWxJZkFyZ3VtZW50c0FyZU5vdEFsbENoZWNrZWQiLCJGdXR1cmUiLCJhcm1lZCIsImZpcmVkIiwicmV0aXJlZCIsIm91dHN0YW5kaW5nX3dyaXRlcyIsImJlZm9yZV9maXJlX2NhbGxiYWNrcyIsImNvbXBsZXRpb25fY2FsbGJhY2tzIiwiRW52aXJvbm1lbnRWYXJpYWJsZSIsImJlZ2luV3JpdGUiLCJjb21taXR0ZWQiLCJfbWF5YmVGaXJlIiwib25CZWZvcmVGaXJlIiwiYXJtQW5kV2FpdCIsImZ1dHVyZSIsIndhaXQiLCJpbnZva2VDYWxsYmFjayIsIl9Dcm9zc2JhciIsIm5leHRJZCIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbiIsImxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50IiwiZmFjdFBhY2thZ2UiLCJmYWN0TmFtZSIsIl9jb2xsZWN0aW9uRm9yTWVzc2FnZSIsImxpc3RlbiIsInRyaWdnZXIiLCJyZWNvcmQiLCJmaXJlIiwibm90aWZpY2F0aW9uIiwibGlzdGVuZXJzRm9yQ29sbGVjdGlvbiIsImNhbGxiYWNrSWRzIiwibCIsIl9tYXRjaGVzIiwiT2JqZWN0SUQiLCJ0cmlnZ2VyVmFsdWUiLCJfSW52YWxpZGF0aW9uQ3Jvc3NiYXIiLCJERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCIsInJlZnJlc2giLCJkZWZhdWx0X3NlcnZlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsR0FBRyxHQUFHQyxHQUFHLENBQUNDLE9BQUosQ0FBWSxLQUFaLENBQVYsQyxDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLG1CQUFtQixHQUFHQyxDQUFDLENBQUNDLElBQUYsQ0FBTyxZQUFZO0FBQzNDLE1BQUlDLFVBQVUsR0FBRyxFQUFqQjtBQUVBLE1BQUlDLDBCQUEwQixHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQVosR0FDN0JDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixPQUFPLENBQUNDLEdBQVIsQ0FBWUMsNEJBQXZCLENBRDZCLEdBQzBCLEVBRDNEOztBQUVBLE1BQUlILDBCQUFKLEVBQWdDO0FBQzlCRCxjQUFVLENBQUNPLElBQVgsQ0FBZ0JaLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLG9CQUFaLEVBQWtDWSxTQUFsQyxDQUNkUCwwQkFEYyxD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QUFnQixJQUFJeVMsTUFBSixFQUFoQjs7QUFFQXBMLE1BQU0sQ0FBQ3VRLE9BQVAsR0FBaUIsVUFBVVQsWUFBVixFQUF3QjtBQUN2Q3RVLFdBQVMsQ0FBQzZVLHFCQUFWLENBQWdDUixJQUFoQyxDQUFxQ0MsWUFBckM7QUFDRCxDQUZELEMsQ0FJQTtBQUNBOzs7QUFDQW5aLENBQUMsQ0FBQ3dELElBQUYsQ0FBTyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCLE9BQS9CLEVBQXdDLGNBQXhDLEVBQXdELFdBQXhELENBQVAsRUFDTyxVQUFVeUssSUFBVixFQUFnQjtBQUNkNUUsUUFBTSxDQUFDNEUsSUFBRCxDQUFOLEdBQWVqTyxDQUFDLENBQUM0SCxJQUFGLENBQU95QixNQUFNLENBQUNySCxNQUFQLENBQWNpTSxJQUFkLENBQVAsRUFBNEI1RSxNQUFNLENBQUNySCxNQUFuQyxDQUFmO0FBQ0QsQ0FIUixFLENBS0E7QUFDQTtBQUNBOzs7QUFDQXFILE1BQU0sQ0FBQ3dRLGNBQVAsR0FBd0J4USxNQUFNLENBQUNySCxNQUEvQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9kZHAtc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHVybCA9IE5wbS5yZXF1aXJlKCd1cmwnKTtcblxuLy8gQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBwZXJtZXNzYWdlLWRlZmxhdGUgZXh0ZW5zaW9uIHdpdGggZGVmYXVsdFxuLy8gY29uZmlndXJhdGlvbi4gSWYgJFNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04gaXMgc2V0LCB0aGVuIGl0IG11c3QgYmUgdmFsaWRcbi8vIEpTT04uIElmIGl0IHJlcHJlc2VudHMgYSBmYWxzZXkgdmFsdWUsIHRoZW4gd2UgZG8gbm90IHVzZSBwZXJtZXNzYWdlLWRlZmxhdGVcbi8vIGF0IGFsbDsgb3RoZXJ3aXNlLCB0aGUgSlNPTiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGRlZmxhdGUnc1xuLy8gY29uZmlndXJlIG1ldGhvZDsgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmF5ZS9wZXJtZXNzYWdlLWRlZmxhdGUtbm9kZS9ibG9iL21hc3Rlci9SRUFETUUubWRcbi8vXG4vLyAoV2UgZG8gdGhpcyBpbiBhbiBfLm9uY2UgaW5zdGVhZCBvZiBhdCBzdGFydHVwLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG9cbi8vIGNyYXNoIHRoZSB0b29sIGR1cmluZyBpc29wYWNrZXQgbG9hZCBpZiB5b3VyIEpTT04gZG9lc24ndCBwYXJzZS4gVGhpcyBpcyBvbmx5XG4vLyBhIHByb2JsZW0gYmVjYXVzZSB0aGUgdG9vbCBoYXMgdG8gbG9hZCB0aGUgRERQIHNlcnZlciBjb2RlIGp1c3QgaW4gb3JkZXIgdG9cbi8vIGJlIGEgRERQIGNsaWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRlb3IvbWV0ZW9yL2lzc3Vlcy8zNDUyIC4pXG52YXIgd2Vic29ja2V0RXh0ZW5zaW9ucyA9IF8ub25jZShmdW5jdGlvbiAoKSB7XG4gIHZhciBleHRlbnNpb25zID0gW107XG5cbiAgdmFyIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnID0gcHJvY2Vzcy5lbnYuU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTlxuICAgID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5TRVJWRVJfV0VCU09DS0VUX0NPTVBSRVNTSU9OKSA6IHt9O1xuICBpZiAod2Vic29ja2V0Q29tcHJlc3Npb25Db25maWcpIHtcbiAgICBleHRlbnNpb25zLnB1c2goTnBtLnJlcXVpcmUoJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpLmNvbmZpZ3VyZShcbiAgICAgIHdlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnXG4gICAgKSk7XG4gIH1cblxuICByZXR1cm4gZXh0ZW5zaW9ucztcbn0pO1xuXG52YXIgcGF0aFByZWZpeCA9IF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVggfHwgXCJcIjtcblxuU3RyZWFtU2VydmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVnaXN0cmF0aW9uX2NhbGxiYWNrcyA9IFtdO1xuICBzZWxmLm9wZW5fc29ja2V0cyA9IFtdO1xuXG4gIC8vIEJlY2F1c2Ugd2UgYXJlIGluc3RhbGxpbmcgZGlyZWN0bHkgb250byBXZWJBcHAuaHR0cFNlcnZlciBpbnN0ZWFkIG9mIHVzaW5nXG4gIC8vIFdlYkFwcC5hcHAsIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGUgcGF0aCBwcmVmaXggb3Vyc2VsdmVzLlxuICBzZWxmLnByZWZpeCA9IHBhdGhQcmVmaXggKyAnL3NvY2tqcyc7XG4gIFJvdXRlUG9saWN5LmRlY2xhcmUoc2VsZi5wcmVmaXggKyAnLycsICduZXR3b3JrJyk7XG5cbiAgLy8gc2V0IHVwIHNvY2tqc1xuICB2YXIgc29ja2pzID0gTnBtLnJlcXVpcmUoJ3NvY2tqcycpO1xuICB2YXIgc2VydmVyT3B0aW9ucyA9IHtcbiAgICBwcmVmaXg6IHNlbGYucHJlZml4LFxuICAgIGxvZzogZnVuY3Rpb24gKCkgeyB9LFxuICAgIC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSBjb2RlIGl0IGV4cGxpY2l0bHkgYmVjYXVzZSB3ZSBkZXBlbmRcbiAgICAvLyBvbiBpdCBpbiBzdHJlYW1fY2xpZW50OkhFQVJUQkVBVF9USU1FT1VUXG4gICAgaGVhcnRiZWF0X2RlbGF5OiA0NTAwMCxcbiAgICAvLyBUaGUgZGVmYXVsdCBkaXNjb25uZWN0X2RlbGF5IGlzIDUgc2Vjb25kcywgYnV0IGlmIHRoZSBzZXJ2ZXIgZW5kcyB1cCBDUFVcbiAgICAvLyBib3VuZCBmb3IgdGhhdCBtdWNoIHRpbWUsIFNvY2tKUyBtaWdodCBub3Qgbm90aWNlIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgLy8gcmVjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdGltZXIgKG9mIGRpc2Nvbm5lY3RfZGVsYXkgbXMpIGNhbiBmaXJlIGJlZm9yZVxuICAgIC8vIFNvY2tKUyBwcm9jZXNzZXMgdGhlIG5ldyBjb25uZWN0aW9uLiBFdmVudHVhbGx5IHdlJ2xsIGZpeCB0aGlzIGJ5IG5vdFxuICAgIC8vIGNvbWJpbmluZyBDUFUtaGVhdnkgcHJvY2Vzc2luZyB3aXRoIFNvY2tKUyB0ZXJtaW5hdGlvbiAoZWcgYSBwcm94eSB3aGljaFxuICAgIC8vIGNvbnZlcnRzIHRvIFVuaXggc29ja2V0cykgYnV0IGZvciBub3csIHJhaXNlIHRoZSBkZWxheS5cbiAgICBkaXNjb25uZWN0X2RlbGF5OiA2MCAqIDEwMDAsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklELFxuICAgIC8vIOemgeeUqGNvcnPvvIzpmLLmraLor7fmsYJyZXNwb25zZei/lOWbnkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjoqXG4gICAgZGlzYWJsZV9jb3JzOiB0cnVlXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICYmIHNvY2tldC5fc2Vzc2lvbi5yZWN2KSB7XG4gICAgICAgIHNvY2tldC5fc2Vzc2lvbi5yZWN2LmNvbm5lY3Rpb24uc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDQ1ICogMTAwMCk7XG5cbiAgICBzb2NrZXQuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBzb2NrZXQud3JpdGUoZGF0YSk7XG4gICAgfTtcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vcGVuX3NvY2tldHMgPSBfLndpdGhvdXQoc2VsZi5vcGVuX3NvY2tldHMsIHNvY2tldCk7XG4gICAgfSk7XG4gICAgc2VsZi5vcGVuX3NvY2tldHMucHVzaChzb2NrZXQpO1xuXG4gICAgLy8gWFhYIENPTVBBVCBXSVRIIDAuNi42LiBTZW5kIHRoZSBvbGQgc3R5bGUgd2VsY29tZSBtZXNzYWdlLCB3aGljaFxuICAgIC8vIHdpbGwgZm9yY2Ugb2xkIGNsaWVudHMgdG8gcmVsb2FkLiBSZW1vdmUgdGhpcyBvbmNlIHdlJ3JlIG5vdFxuICAgIC8vIGNvbmNlcm5lZCBhYm91dCBwZW9wbGUgdXBncmFkaW5nIGZyb20gYSBwcmUtMC43LjAgcmVsZWFzZS4gQWxzbyxcbiAgICAvLyByZW1vdmUgdGhlIGNsYXVzZSBpbiB0aGUgY2xpZW50IHRoYXQgaWdub3JlcyB0aGUgd2VsY29tZSBtZXNzYWdlXG4gICAgLy8gKGxpdmVkYXRhX2Nvbm5lY3Rpb24uanMpXG4gICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBzZXJ2ZXJfaWQ6IFwiMFwiIH0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgdXNlIGEgY29ubmVjdCBtaWRkbGV3YXJlIGhlcmUgc2luY2VcbiAgICAvLyBzb2NranMgaW5zdGFsbHMgaXRzZWxmIHByaW9yIHRvIGFsbCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAvLyAobWVhbmluZyBwcmlvciB0byBhbnkgY29ubmVjdCBtaWRkbGV3YXJlcykgc28gd2UgbmVlZCB0byB0YWtlXG4gICAgLy8gYW4gYXBwcm9hY2ggc2ltaWxhciB0byBvdmVyc2hhZG93TGlzdGVuZXJzIGluXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NvY2tqcy9zb2NranMtbm9kZS9ibG9iL2NmODIwYzU1YWY2YTk5NTNlMTY1NTg1NTVhMzFkZWNlYTU1NGY3MGUvc3JjL3V0aWxzLmNvZmZlZVxuICAgIF8uZWFjaChbJ3JlcXVlc3QnLCAndXBncmFkZSddLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBodHRwU2VydmVyID0gV2ViQXBwLmh0dHBTZXJ2ZXI7XG4gICAgICB2YXIgb2xkSHR0cFNlcnZlckxpc3RlbmVycyA9IGh0dHBTZXJ2ZXIubGlzdGVuZXJzKGV2ZW50KS5zbGljZSgwKTtcbiAgICAgIGh0dHBTZXJ2ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KTtcblxuICAgICAgLy8gcmVxdWVzdCBhbmQgdXBncmFkZSBoYXZlIGRpZmZlcmVudCBhcmd1bWVudHMgcGFzc2VkIGJ1dFxuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCBvbmUgd2hpY2ggaXMgYWx3YXlzIHJlcXVlc3RcbiAgICAgIHZhciBuZXdMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQvJykge1xuICAgICAgICAgIHBhcnNlZFVybC5wYXRobmFtZSA9IHNlbGYucHJlZml4ICsgJy93ZWJzb2NrZXQnO1xuICAgICAgICAgIHJlcXVlc3QudXJsID0gdXJsLmZvcm1hdChwYXJzZWRVcmwpO1xuICAgICAgICB9XG4gICAgICAgIF8uZWFjaChvbGRIdHRwU2VydmVyTGlzdGVuZXJzLCBmdW5jdGlvbiAob2xkTGlzdGVuZXIpIHtcbiAgICAgICAgICBvbGRMaXN0ZW5lci5hcHBseShodHRwU2VydmVyLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihldmVudCwgbmV3TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIkREUFNlcnZlciA9IHt9O1xuXG52YXIgRmliZXIgPSBOcG0ucmVxdWlyZSgnZmliZXJzJyk7XG5cbi8vIFRoaXMgZmlsZSBjb250YWlucyBjbGFzc2VzOlxuLy8gKiBTZXNzaW9uIC0gVGhlIHNlcnZlcidzIGNvbm5lY3Rpb24gdG8gYSBzaW5nbGUgRERQIGNsaWVudFxuLy8gKiBTdWJzY3JpcHRpb24gLSBBIHNpbmdsZSBzdWJzY3JpcHRpb24gZm9yIGEgc2luZ2xlIGNsaWVudFxuLy8gKiBTZXJ2ZXIgLSBBbiBlbnRpcmUgc2VydmVyIHRoYXQgbWF5IHRhbGsgdG8gPiAxIGNsaWVudC4gQSBERFAgZW5kcG9pbnQuXG4vL1xuLy8gU2Vzc2lvbiBhbmQgU3Vic2NyaXB0aW9uIGFyZSBmaWxlIHNjb3BlLiBGb3Igbm93LCB1bnRpbCB3ZSBmcmVlemVcbi8vIHRoZSBpbnRlcmZhY2UsIFNlcnZlciBpcyBwYWNrYWdlIHNjb3BlIChpbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBiZVxuLy8gZXhwb3J0ZWQuKVxuXG4vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGRvY3VtZW50IGluIGEgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG52YXIgU2Vzc2lvbkRvY3VtZW50VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmV4aXN0c0luID0gbmV3IFNldCgpOyAvLyBzZXQgb2Ygc3Vic2NyaXB0aW9uSGFuZGxlXG4gIHNlbGYuZGF0YUJ5S2V5ID0gbmV3IE1hcCgpOyAvLyBrZXktPiBbIHtzdWJzY3JpcHRpb25IYW5kbGUsIHZhbHVlfSBieSBwcmVjZWRlbmNlXVxufTtcblxuRERQU2VydmVyLl9TZXNzaW9uRG9jdW1lbnRWaWV3ID0gU2Vzc2lvbkRvY3VtZW50VmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uRG9jdW1lbnRWaWV3LnByb3RvdHlwZSwge1xuXG4gIGdldEZpZWxkczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0ge307XG4gICAgc2VsZi5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgcmV0W2tleV0gPSBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGNsZWFyRmllbGQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlQ29sbGVjdG9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcblxuICAgIC8vIEl0J3Mgb2theSB0byBjbGVhciBmaWVsZHMgdGhhdCBkaWRuJ3QgZXhpc3QuIE5vIG5lZWQgdG8gdGhyb3dcbiAgICAvLyBhbiBlcnJvci5cbiAgICBpZiAoIXByZWNlZGVuY2VMaXN0KVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJlbW92ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWNlZGVuY2VMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJlY2VkZW5jZSA9IHByZWNlZGVuY2VMaXN0W2ldO1xuICAgICAgaWYgKHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGUpIHtcbiAgICAgICAgLy8gVGhlIHZpZXcncyB2YWx1ZSBjYW4gb25seSBjaGFuZ2UgaWYgdGhpcyBzdWJzY3JpcHRpb24gaXMgdGhlIG9uZSB0aGF0XG4gICAgICAgIC8vIHVzZWQgdG8gaGF2ZSBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoaSA9PT0gMClcbiAgICAgICAgICByZW1vdmVkVmFsdWUgPSBwcmVjZWRlbmNlLnZhbHVlO1xuICAgICAgICBwcmVjZWRlbmNlTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJlY2VkZW5jZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5kZWxldGUoa2V5KTtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlZFZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICFFSlNPTi5lcXVhbHMocmVtb3ZlZFZhbHVlLCBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZSkpIHtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZUZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUNvbGxlY3RvciwgaXNBZGQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gUHVibGlzaCBBUEkgaWdub3JlcyBfaWQgaWYgcHJlc2VudCBpbiBmaWVsZHNcbiAgICBpZiAoa2V5ID09PSBcIl9pZFwiKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gRG9uJ3Qgc2hhcmUgc3RhdGUgd2l0aCB0aGUgZGF0YSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuXG4gICAgdmFsdWUgPSBFSlNPTi5jbG9uZSh2YWx1ZSk7XG5cbiAgICBpZiAoIXNlbGYuZGF0YUJ5S2V5LmhhcyhrZXkpKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5zZXQoa2V5LCBbe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWV9XSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcbiAgICB2YXIgZWx0O1xuICAgIGlmICghaXNBZGQpIHtcbiAgICAgIGVsdCA9IHByZWNlZGVuY2VMaXN0LmZpbmQoZnVuY3Rpb24gKHByZWNlZGVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gcHJlY2VkZW5jZS5zdWJzY3JpcHRpb25IYW5kbGUgPT09IHN1YnNjcmlwdGlvbkhhbmRsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbHQpIHtcbiAgICAgIGlmIChlbHQgPT09IHByZWNlZGVuY2VMaXN0WzBdICYmICFFSlNPTi5lcXVhbHModmFsdWUsIGVsdC52YWx1ZSkpIHtcbiAgICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuXG4gICAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBlbHQudmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgbmV3bHkgY2FyaW5nIGFib3V0IHRoaXMgZmllbGRcbiAgICAgIHByZWNlZGVuY2VMaXN0LnB1c2goe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZTogdmFsdWV9KTtcbiAgICB9XG5cbiAgfVxufSk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNsaWVudCdzIHZpZXcgb2YgYSBzaW5nbGUgY29sbGVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaXQgcmVwcmVzZW50c1xuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBzZXNzaW9uQ2FsbGJhY2tzIFRoZSBjYWxsYmFja3MgZm9yIGFkZGVkLCBjaGFuZ2VkLCByZW1vdmVkXG4gKiBAY2xhc3MgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG4gKi9cbnZhciBTZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHNlc3Npb25DYWxsYmFja3MpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7XG4gIHNlbGYuZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuICBzZWxmLmNhbGxiYWNrcyA9IHNlc3Npb25DYWxsYmFja3M7XG59O1xuXG5ERFBTZXJ2ZXIuX1Nlc3Npb25Db2xsZWN0aW9uVmlldyA9IFNlc3Npb25Db2xsZWN0aW9uVmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uQ29sbGVjdGlvblZpZXcucHJvdG90eXBlLCB7XG5cbiAgaXNFbXB0eTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5kb2N1bWVudHMuc2l6ZSA9PT0gMDtcbiAgfSxcblxuICBkaWZmOiBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZNYXBzKHByZXZpb3VzLmRvY3VtZW50cywgc2VsZi5kb2N1bWVudHMsIHtcbiAgICAgIGJvdGg6IF8uYmluZChzZWxmLmRpZmZEb2N1bWVudCwgc2VsZiksXG5cbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGlkLCBub3dEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgbm93RFYuZ2V0RmllbGRzKCkpO1xuICAgICAgfSxcblxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uIChpZCwgcHJldkRWKSB7XG4gICAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGRpZmZEb2N1bWVudDogZnVuY3Rpb24gKGlkLCBwcmV2RFYsIG5vd0RWKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmaWVsZHMgPSB7fTtcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk9iamVjdHMocHJldkRWLmdldEZpZWxkcygpLCBub3dEVi5nZXRGaWVsZHMoKSwge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGtleSwgcHJldiwgbm93KSB7XG4gICAgICAgIGlmICghRUpTT04uZXF1YWxzKHByZXYsIG5vdykpXG4gICAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoa2V5LCBub3cpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uKGtleSwgcHJldikge1xuICAgICAgICBmaWVsZHNba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIGFkZGVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICB2YXIgYWRkZWQgPSBmYWxzZTtcbiAgICBpZiAoIWRvY1ZpZXcpIHtcbiAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgIGRvY1ZpZXcgPSBuZXcgU2Vzc2lvbkRvY3VtZW50VmlldygpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuc2V0KGlkLCBkb2NWaWV3KTtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5hZGQoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICB2YXIgY2hhbmdlQ29sbGVjdG9yID0ge307XG4gICAgXy5lYWNoKGZpZWxkcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoXG4gICAgICAgIHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlQ29sbGVjdG9yLCB0cnVlKTtcbiAgICB9KTtcbiAgICBpZiAoYWRkZWQpXG4gICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VDb2xsZWN0b3IpO1xuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBjaGFuZ2VkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFuZ2VkUmVzdWx0ID0ge307XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGVsZW1lbnQgd2l0aCBpZCBcIiArIGlkICsgXCIgdG8gY2hhbmdlXCIpO1xuICAgIF8uZWFjaChjaGFuZ2VkLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIGRvY1ZpZXcuY2xlYXJGaWVsZChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgICBlbHNlXG4gICAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLCBjaGFuZ2VkUmVzdWx0KTtcbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkUmVzdWx0KTtcbiAgfSxcblxuICByZW1vdmVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiUmVtb3ZlZCBub25leGlzdGVudCBkb2N1bWVudCBcIiArIGlkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5kZWxldGUoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICBpZiAoZG9jVmlldy5leGlzdHNJbi5zaXplID09PSAwKSB7XG4gICAgICAvLyBpdCBpcyBnb25lIGZyb20gZXZlcnlvbmVcbiAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuZGVsZXRlKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNoYW5nZWQgPSB7fTtcbiAgICAgIC8vIHJlbW92ZSB0aGlzIHN1YnNjcmlwdGlvbiBmcm9tIGV2ZXJ5IHByZWNlZGVuY2UgbGlzdFxuICAgICAgLy8gYW5kIHJlY29yZCB0aGUgY2hhbmdlc1xuICAgICAgZG9jVmlldy5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlbGYuY2FsbGJhY2tzLmNoYW5nZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZWQpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIFNlc3Npb24gPSBmdW5jdGlvbiAoc2VydmVyLCB2ZXJzaW9uLCBzb2NrZXQsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmlkID0gUmFuZG9tLmlkKCk7XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHNlbGYudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgc2VsZi5pbml0aWFsaXplZCA9IGZhbHNlO1xuICBzZWxmLnNvY2tldCA9IHNvY2tldDtcblxuICAvLyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGRlc3Ryb3llZC4gbXVsdGlwbGUgcGxhY2VzIGJlbG93XG4gIC8vIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBpcyBhbGl2ZSBvciBub3QuXG4gIHNlbGYuaW5RdWV1ZSA9IG5ldyBNZXRlb3IuX0RvdWJsZUVuZGVkUXVldWUoKTtcblxuICBzZWxmLmJsb2NrZWQgPSBmYWxzZTtcbiAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG5cbiAgLy8gU3ViIG9iamVjdHMgZm9yIGFjdGl2ZSBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gIHNlbGYudXNlcklkID0gbnVsbDtcblxuICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcblxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSB0byBub3Qgc2VuZCBtZXNzYWdlcyB3aGVuIGNvbGxlY3Rpb25WaWV3cyBhcmVcbiAgLy8gbW9kaWZpZWQuIFRoaXMgaXMgZG9uZSB3aGVuIHJlcnVubmluZyBzdWJzIGluIF9zZXRVc2VySWQgYW5kIHRob3NlIG1lc3NhZ2VzXG4gIC8vIGFyZSBjYWxjdWxhdGVkIHZpYSBhIGRpZmYgaW5zdGVhZC5cbiAgc2VsZi5faXNTZW5kaW5nID0gdHJ1ZTtcblxuICAvLyBJZiB0aGlzIGlzIHRydWUsIGRvbid0IHN0YXJ0IGEgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgcHVibGlzaGVyIG9uIHRoaXNcbiAgLy8gc2Vzc2lvbi4gVGhlIHNlc3Npb24gd2lsbCB0YWtlIGNhcmUgb2Ygc3RhcnRpbmcgaXQgd2hlbiBhcHByb3ByaWF0ZS5cbiAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gd2UgYXJlIHJlcnVubmluZyBzdWJzY3JpcHRpb25zLCBhbnkgcmVhZHkgbWVzc2FnZXNcbiAgLy8gd2Ugd2FudCB0byBidWZmZXIgdXAgZm9yIHdoZW4gd2UgYXJlIGRvbmUgcmVydW5uaW5nIHN1YnNjcmlwdGlvbnNcbiAgc2VsZi5fcGVuZGluZ1JlYWR5ID0gW107XG5cbiAgLy8gTGlzdCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIHRoaXMgY29ubmVjdGlvbiBpcyBjbG9zZWQuXG4gIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzID0gW107XG5cblxuICAvLyBYWFggSEFDSzogSWYgYSBzb2NranMgY29ubmVjdGlvbiwgc2F2ZSBvZmYgdGhlIFVSTC4gVGhpcyBpc1xuICAvLyB0ZW1wb3JhcnkgYW5kIHdpbGwgZ28gYXdheSBpbiB0aGUgbmVhciBmdXR1cmUuXG4gIHNlbGYuX3NvY2tldFVybCA9IHNvY2tldC51cmw7XG5cbiAgLy8gQWxsb3cgdGVzdHMgdG8gZGlzYWJsZSByZXNwb25kaW5nIHRvIHBpbmdzLlxuICBzZWxmLl9yZXNwb25kVG9QaW5ncyA9IG9wdGlvbnMucmVzcG9uZFRvUGluZ3M7XG5cbiAgLy8gVGhpcyBvYmplY3QgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIHNlc3Npb24uIEluIHRoZSBwdWJsaWNcbiAgLy8gQVBJLCBpdCBpcyBjYWxsZWQgdGhlIGBjb25uZWN0aW9uYCBvYmplY3QuICBJbnRlcm5hbGx5IHdlIGNhbGwgaXRcbiAgLy8gYSBgY29ubmVjdGlvbkhhbmRsZWAgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICBzZWxmLmNvbm5lY3Rpb25IYW5kbGUgPSB7XG4gICAgaWQ6IHNlbGYuaWQsXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICB9LFxuICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIChmbikge1xuICAgICAgdmFyIGNiID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmbiwgXCJjb25uZWN0aW9uIG9uQ2xvc2UgY2FsbGJhY2tcIik7XG4gICAgICBpZiAoc2VsZi5pblF1ZXVlKSB7XG4gICAgICAgIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBjbG9zZWQsIGNhbGwgdGhlIGNhbGxiYWNrLlxuICAgICAgICBNZXRlb3IuZGVmZXIoY2IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xpZW50QWRkcmVzczogc2VsZi5fY2xpZW50QWRkcmVzcygpLFxuICAgIGh0dHBIZWFkZXJzOiBzZWxmLnNvY2tldC5oZWFkZXJzXG4gIH07XG5cbiAgc2VsZi5zZW5kKHsgbXNnOiAnY29ubmVjdGVkJywgc2Vzc2lvbjogc2VsZi5pZCB9KTtcblxuICAvLyBPbiBpbml0aWFsIGNvbm5lY3QsIHNwaW4gdXAgYWxsIHRoZSB1bml2ZXJzYWwgcHVibGlzaGVycy5cbiAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gIH0pLnJ1bigpO1xuXG4gIGlmICh2ZXJzaW9uICE9PSAncHJlMScgJiYgb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCAhPT0gMCkge1xuICAgIC8vIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBsb3cgbGV2ZWwgdGltZW91dCBiZWNhdXNlIHdlIGhhdmUgaGVhcnRiZWF0aW5nLlxuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDApO1xuXG4gICAgc2VsZi5oZWFydGJlYXQgPSBuZXcgRERQQ29tbW9uLkhlYXJ0YmVhdCh7XG4gICAgICBoZWFydGJlYXRJbnRlcnZhbDogb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCxcbiAgICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCxcbiAgICAgIG9uVGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgc2VuZFBpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6ICdwaW5nJ30pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYuaGVhcnRiZWF0LnN0YXJ0KCk7XG4gIH1cblxuICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU2Vzc2lvbi5wcm90b3R5cGUsIHtcblxuICBzZW5kUmVhZHk6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlYWR5XCIsIHN1YnM6IHN1YnNjcmlwdGlvbklkc30pO1xuICAgIGVsc2Uge1xuICAgICAgXy5lYWNoKHN1YnNjcmlwdGlvbklkcywgZnVuY3Rpb24gKHN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeS5wdXNoKHN1YnNjcmlwdGlvbklkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzZW5kQWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKVxuICAgICAgc2VsZi5zZW5kKHttc2c6IFwiYWRkZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZCwgZmllbGRzOiBmaWVsZHN9KTtcbiAgfSxcblxuICBzZW5kQ2hhbmdlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChfLmlzRW1wdHkoZmllbGRzKSlcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpIHtcbiAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgIG1zZzogXCJjaGFuZ2VkXCIsXG4gICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZFJlbW92ZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlbW92ZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZH0pO1xuICB9LFxuXG4gIGdldFNlbmRDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGVkOiBfLmJpbmQoc2VsZi5zZW5kQWRkZWQsIHNlbGYpLFxuICAgICAgY2hhbmdlZDogXy5iaW5kKHNlbGYuc2VuZENoYW5nZWQsIHNlbGYpLFxuICAgICAgcmVtb3ZlZDogXy5iaW5kKHNlbGYuc2VuZFJlbW92ZWQsIHNlbGYpXG4gICAgfTtcbiAgfSxcblxuICBnZXRDb2xsZWN0aW9uVmlldzogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXQgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cy5nZXQoY29sbGVjdGlvbk5hbWUpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICByZXQgPSBuZXcgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0U2VuZENhbGxiYWNrcygpKTtcbiAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLnNldChjb2xsZWN0aW9uTmFtZSwgcmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHZpZXcgPSBzZWxmLmdldENvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lKTtcbiAgICB2aWV3LmFkZGVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5yZW1vdmVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpO1xuICAgIGlmICh2aWV3LmlzRW1wdHkoKSkge1xuICAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLmRlbGV0ZShjb2xsZWN0aW9uTmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5jaGFuZ2VkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgc3RhcnRVbml2ZXJzYWxTdWJzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgdGhlIHNldCBvZiB1bml2ZXJzYWwgaGFuZGxlcnMgYW5kIHN0YXJ0IHRoZW0uIElmXG4gICAgLy8gYWRkaXRpb25hbCB1bml2ZXJzYWwgcHVibGlzaGVycyBzdGFydCB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoZW0gKGR1ZSB0b1xuICAgIC8vIHlpZWxkaW5nKSwgdGhleSB3aWxsIHJ1biBzZXBhcmF0ZWx5IGFzIHBhcnQgb2YgU2VydmVyLnB1Ymxpc2guXG4gICAgdmFyIGhhbmRsZXJzID0gXy5jbG9uZShzZWxmLnNlcnZlci51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyk7XG4gICAgXy5lYWNoKGhhbmRsZXJzLCBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24gYW5kIHVucmVnaXN0ZXIgaXQgYXQgdGhlIHNlcnZlci5cbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBEZXN0cm95IHRoaXMgc2Vzc2lvbiwgZXZlbiBpZiBpdCdzIG5vdCByZWdpc3RlcmVkIGF0IHRoZVxuICAgIC8vIHNlcnZlci4gU3RvcCBhbGwgcHJvY2Vzc2luZyBhbmQgdGVhciBldmVyeXRoaW5nIGRvd24uIElmIGEgc29ja2V0XG4gICAgLy8gd2FzIGF0dGFjaGVkLCBjbG9zZSBpdC5cblxuICAgIC8vIEFscmVhZHkgZGVzdHJveWVkLlxuICAgIGlmICghIHNlbGYuaW5RdWV1ZSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERyb3AgdGhlIG1lcmdlIGJveCBkYXRhIGltbWVkaWF0ZWx5LlxuICAgIHNlbGYuaW5RdWV1ZSA9IG51bGw7XG4gICAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoc2VsZi5oZWFydGJlYXQpIHtcbiAgICAgIHNlbGYuaGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIHNlbGYuaGVhcnRiZWF0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5zb2NrZXQpIHtcbiAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCk7XG4gICAgICBzZWxmLnNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIC0xKTtcblxuICAgIE1ldGVvci5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdG9wIGNhbGxiYWNrcyBjYW4geWllbGQsIHNvIHdlIGRlZmVyIHRoaXMgb24gY2xvc2UuXG4gICAgICAvLyBzdWIuX2lzRGVhY3RpdmF0ZWQoKSBkZXRlY3RzIHRoYXQgd2Ugc2V0IGluUXVldWUgdG8gbnVsbCBhbmRcbiAgICAgIC8vIHRyZWF0cyBpdCBhcyBzZW1pLWRlYWN0aXZhdGVkIChpdCB3aWxsIGlnbm9yZSBpbmNvbWluZyBjYWxsYmFja3MsIGV0YykuXG4gICAgICBzZWxmLl9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9ucygpO1xuXG4gICAgICAvLyBEZWZlciBjYWxsaW5nIHRoZSBjbG9zZSBjYWxsYmFja3MsIHNvIHRoYXQgdGhlIGNhbGxlciBjbG9zaW5nXG4gICAgICAvLyB0aGUgc2Vzc2lvbiBpc24ndCB3YWl0aW5nIGZvciBhbGwgdGhlIGNhbGxiYWNrcyB0byBjb21wbGV0ZS5cbiAgICAgIF8uZWFjaChzZWxmLl9jbG9zZUNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFVucmVnaXN0ZXIgdGhlIHNlc3Npb24uXG4gICAgc2VsZi5zZXJ2ZXIuX3JlbW92ZVNlc3Npb24oc2VsZik7XG4gIH0sXG5cbiAgLy8gU2VuZCBhIG1lc3NhZ2UgKGRvaW5nIG5vdGhpbmcgaWYgbm8gc29ja2V0IGlzIGNvbm5lY3RlZCByaWdodCBub3cuKVxuICAvLyBJdCBzaG91bGQgYmUgYSBKU09OIG9iamVjdCAoaXQgd2lsbCBiZSBzdHJpbmdpZmllZC4pXG4gIHNlbmQ6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFNlbnRERFApXG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJTZW50IEREUFwiLCBERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgICAgc2VsZi5zb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZW5kIGEgY29ubmVjdGlvbiBlcnJvci5cbiAgc2VuZEVycm9yOiBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBtc2cgPSB7bXNnOiAnZXJyb3InLCByZWFzb246IHJlYXNvbn07XG4gICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgc2VsZi5zZW5kKG1zZyk7XG4gIH0sXG5cbiAgLy8gUHJvY2VzcyAnbXNnJyBhcyBhbiBpbmNvbWluZyBtZXNzYWdlLiAoQnV0IGFzIGEgZ3VhcmQgYWdhaW5zdFxuICAvLyByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJlY29ubmVjdGlvbiwgaWdub3JlIHRoZSBtZXNzYWdlIGlmXG4gIC8vICdzb2NrZXQnIGlzIG5vdCB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBzb2NrZXQuKVxuICAvL1xuICAvLyBXZSBydW4gdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCBvbmUgYXQgYSB0aW1lLCBpbiB0aGUgb3JkZXJcbiAgLy8gZ2l2ZW4gYnkgdGhlIGNsaWVudC4gVGhlIG1lc3NhZ2UgaGFuZGxlciBpcyBwYXNzZWQgYW4gaWRlbXBvdGVudFxuICAvLyBmdW5jdGlvbiAndW5ibG9jaycgd2hpY2ggaXQgbWF5IGNhbGwgdG8gYWxsb3cgb3RoZXIgbWVzc2FnZXMgdG9cbiAgLy8gYmVnaW4gcnVubmluZyBpbiBwYXJhbGxlbCBpbiBhbm90aGVyIGZpYmVyIChmb3IgZXhhbXBsZSwgYSBtZXRob2RcbiAgLy8gdGhhdCB3YW50cyB0byB5aWVsZC4pIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseSB1bmJsb2NrZWRcbiAgLy8gd2hlbiBpdCByZXR1cm5zLlxuICAvL1xuICAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgaGF2ZSB0byAndG90YWxseSBvcmRlcicgdGhlIG1lc3NhZ2VzIGluIHRoaXNcbiAgLy8gd2F5LCBidXQgaXQncyB0aGUgZWFzaWVzdCB0aGluZyB0aGF0J3MgY29ycmVjdC4gKHVuc3ViIG5lZWRzIHRvXG4gIC8vIGJlIG9yZGVyZWQgYWdhaW5zdCBzdWIsIG1ldGhvZHMgbmVlZCB0byBiZSBvcmRlcmVkIGFnYWluc3QgZWFjaFxuICAvLyBvdGhlci4pXG4gIHByb2Nlc3NNZXNzYWdlOiBmdW5jdGlvbiAobXNnX2luKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5pblF1ZXVlKSAvLyB3ZSBoYXZlIGJlZW4gZGVzdHJveWVkLlxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gUmVzcG9uZCB0byBwaW5nIGFuZCBwb25nIG1lc3NhZ2VzIGltbWVkaWF0ZWx5IHdpdGhvdXQgcXVldWluZy5cbiAgICAvLyBJZiB0aGUgbmVnb3RpYXRlZCBERFAgdmVyc2lvbiBpcyBcInByZTFcIiB3aGljaCBkaWRuJ3Qgc3VwcG9ydFxuICAgIC8vIHBpbmdzLCBwcmVzZXJ2ZSB0aGUgXCJwcmUxXCIgYmVoYXZpb3Igb2YgcmVzcG9uZGluZyB3aXRoIGEgXCJiYWRcbiAgICAvLyByZXF1ZXN0XCIgZm9yIHRoZSB1bmtub3duIG1lc3NhZ2VzLlxuICAgIC8vXG4gICAgLy8gRmliZXJzIGFyZSBuZWVkZWQgYmVjYXVzZSBoZWFydGJlYXQgdXNlcyBNZXRlb3Iuc2V0VGltZW91dCwgd2hpY2hcbiAgICAvLyBuZWVkcyBhIEZpYmVyLiBXZSBjb3VsZCBhY3R1YWxseSB1c2UgcmVndWxhciBzZXRUaW1lb3V0IGFuZCBhdm9pZFxuICAgIC8vIHRoZXNlIG5ldyBmaWJlcnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8ganVzdCBtYWtlIGV2ZXJ5dGhpbmcgdXNlXG4gICAgLy8gTWV0ZW9yLnNldFRpbWVvdXQgYW5kIG5vdCB0aGluayB0b28gaGFyZC5cbiAgICAvL1xuICAgIC8vIEFueSBtZXNzYWdlIGNvdW50cyBhcyByZWNlaXZpbmcgYSBwb25nLCBhcyBpdCBkZW1vbnN0cmF0ZXMgdGhhdFxuICAgIC8vIHRoZSBjbGllbnQgaXMgc3RpbGwgYWxpdmUuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuaGVhcnRiZWF0Lm1lc3NhZ2VSZWNlaXZlZCgpO1xuICAgICAgfSkucnVuKCk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwaW5nJykge1xuICAgICAgaWYgKHNlbGYuX3Jlc3BvbmRUb1BpbmdzKVxuICAgICAgICBzZWxmLnNlbmQoe21zZzogXCJwb25nXCIsIGlkOiBtc2dfaW4uaWR9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwb25nJykge1xuICAgICAgLy8gU2luY2UgZXZlcnl0aGluZyBpcyBhIHBvbmcsIG5vdGhpbmcgdG8gZG9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmluUXVldWUucHVzaChtc2dfaW4pO1xuICAgIGlmIChzZWxmLndvcmtlclJ1bm5pbmcpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi53b3JrZXJSdW5uaW5nID0gdHJ1ZTtcblxuICAgIHZhciBwcm9jZXNzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBtc2cgPSBzZWxmLmluUXVldWUgJiYgc2VsZi5pblF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAoIW1zZykge1xuICAgICAgICBzZWxmLndvcmtlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBibG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWJsb2NrZWQpXG4gICAgICAgICAgICByZXR1cm47IC8vIGlkZW1wb3RlbnRcbiAgICAgICAgICBibG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgcHJvY2Vzc05leHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZWxmLnNlcnZlci5vbk1lc3NhZ2VIb29rLmVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2sobXNnLCBzZWxmKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF8uaGFzKHNlbGYucHJvdG9jb2xfaGFuZGxlcnMsIG1zZy5tc2cpKVxuICAgICAgICAgIHNlbGYucHJvdG9jb2xfaGFuZGxlcnNbbXNnLm1zZ10uY2FsbChzZWxmLCBtc2csIHVuYmxvY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc2VsZi5zZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgdW5ibG9jaygpOyAvLyBpbiBjYXNlIHRoZSBoYW5kbGVyIGRpZG4ndCBhbHJlYWR5IGRvIGl0XG4gICAgICB9KS5ydW4oKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzc05leHQoKTtcbiAgfSxcblxuICBwcm90b2NvbF9oYW5kbGVyczoge1xuICAgIHN1YjogZnVuY3Rpb24gKG1zZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyByZWplY3QgbWFsZm9ybWVkIG1lc3NhZ2VzXG4gICAgICBpZiAodHlwZW9mIChtc2cuaWQpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgdHlwZW9mIChtc2cubmFtZSkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBzdWJzY3JpcHRpb25cIiwgbXNnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNlbGYuc2VydmVyLnB1Ymxpc2hfaGFuZGxlcnNbbXNnLm5hbWVdKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYFN1YnNjcmlwdGlvbiAnJHttc2cubmFtZX0nIG5vdCBmb3VuZGApfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX25hbWVkU3Vicy5oYXMobXNnLmlkKSlcbiAgICAgICAgLy8gc3VicyBhcmUgaWRlbXBvdGVudCwgb3IgcmF0aGVyLCB0aGV5IGFyZSBpZ25vcmVkIGlmIGEgc3ViXG4gICAgICAgIC8vIHdpdGggdGhhdCBpZCBhbHJlYWR5IGV4aXN0cy4gdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nXG4gICAgICAgIC8vIHJlY29ubmVjdC5cbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAvLyBYWFggSXQnZCBiZSBtdWNoIGJldHRlciBpZiB3ZSBoYWQgZ2VuZXJpYyBob29rcyB3aGVyZSBhbnkgcGFja2FnZSBjYW5cbiAgICAgIC8vIGhvb2sgaW50byBzdWJzY3JpcHRpb24gaGFuZGxpbmcsIGJ1dCBpbiB0aGUgbWVhbiB3aGlsZSB3ZSBzcGVjaWFsIGNhc2VcbiAgICAgIC8vIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZS4gVGhpcyBpcyBhbHNvIGRvbmUgZm9yIHdlYWsgcmVxdWlyZW1lbnRzIHRvXG4gICAgICAvLyBhZGQgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSBpbiBjYXNlIHdlIGRvbid0IGhhdmUgQWNjb3VudHMuIEFcbiAgICAgIC8vIHVzZXIgdHJ5aW5nIHRvIHVzZSB0aGUgZGRwLXJhdGUtbGltaXRlciBtdXN0IGV4cGxpY2l0bHkgcmVxdWlyZSBpdC5cbiAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICB2YXIgcmF0ZUxpbWl0ZXJJbnB1dCA9IHtcbiAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgIHR5cGU6IFwic3Vic2NyaXB0aW9uXCIsXG4gICAgICAgICAgbmFtZTogbXNnLm5hbWUsXG4gICAgICAgICAgY29ubmVjdGlvbklkOiBzZWxmLmlkXG4gICAgICAgIH07XG5cbiAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgICBtc2c6ICdub3N1YicsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcihcbiAgICAgICAgICAgICAgJ3Rvby1tYW55LXJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXTtcblxuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlciwgbXNnLmlkLCBtc2cucGFyYW1zLCBtc2cubmFtZSk7XG5cbiAgICB9LFxuXG4gICAgdW5zdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgc2VsZi5fc3RvcFN1YnNjcmlwdGlvbihtc2cuaWQpO1xuICAgIH0sXG5cbiAgICBtZXRob2Q6IGZ1bmN0aW9uIChtc2csIHVuYmxvY2spIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgLy8gRm9yIG5vdywgd2Ugc2lsZW50bHkgaWdub3JlIHVua25vd24gYXR0cmlidXRlcyxcbiAgICAgIC8vIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm1ldGhvZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB8fFxuICAgICAgICAgICgoJ3JhbmRvbVNlZWQnIGluIG1zZykgJiYgKHR5cGVvZiBtc2cucmFuZG9tU2VlZCAhPT0gXCJzdHJpbmdcIikpKSB7XG4gICAgICAgIHNlbGYuc2VuZEVycm9yKFwiTWFsZm9ybWVkIG1ldGhvZCBpbnZvY2F0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhbmRvbVNlZWQgPSBtc2cucmFuZG9tU2VlZCB8fCBudWxsO1xuXG4gICAgICAvLyBzZXQgdXAgdG8gbWFyayB0aGUgbWV0aG9kIGFzIHNhdGlzZmllZCBvbmNlIGFsbCBvYnNlcnZlcnNcbiAgICAgIC8vIChhbmQgc3Vic2NyaXB0aW9ucykgaGF2ZSByZWFjdGVkIHRvIGFueSB3cml0ZXMgdGhhdCB3ZXJlXG4gICAgICAvLyBkb25lLlxuICAgICAgdmFyIGZlbmNlID0gbmV3IEREUFNlcnZlci5fV3JpdGVGZW5jZTtcbiAgICAgIGZlbmNlLm9uQWxsQ29tbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0aXJlIHRoZSBmZW5jZSBzbyB0aGF0IGZ1dHVyZSB3cml0ZXMgYXJlIGFsbG93ZWQuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBjYWxsYmFja3MgbGlrZSB0aW1lcnMgYXJlIGZyZWUgdG8gdXNlXG4gICAgICAgIC8vIHRoZSBmZW5jZSwgYW5kIGlmIHRoZXkgZmlyZSBiZWZvcmUgaXQncyBhcm1lZCAoZm9yXG4gICAgICAgIC8vIGV4YW1wbGUsIGJlY2F1c2UgdGhlIG1ldGhvZCB3YWl0cyBmb3IgdGhlbSkgdGhlaXJcbiAgICAgICAgLy8gd3JpdGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZlbmNlLlxuICAgICAgICBmZW5jZS5yZXRpcmUoKTtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICd1cGRhdGVkJywgbWV0aG9kczogW21zZy5pZF19KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmaW5kIHRoZSBoYW5kbGVyXG4gICAgICB2YXIgaGFuZGxlciA9IHNlbGYuc2VydmVyLm1ldGhvZF9oYW5kbGVyc1ttc2cubWV0aG9kXTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ3Jlc3VsdCcsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoNDA0LCBgTWV0aG9kICcke21zZy5tZXRob2R9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICBmZW5jZS5hcm0oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIHNlbGYuX3NldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGludm9jYXRpb24gPSBuZXcgRERQQ29tbW9uLk1ldGhvZEludm9jYXRpb24oe1xuICAgICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICBzZXRVc2VySWQ6IHNldFVzZXJJZCxcbiAgICAgICAgdW5ibG9jazogdW5ibG9jayxcbiAgICAgICAgY29ubmVjdGlvbjogc2VsZi5jb25uZWN0aW9uSGFuZGxlLFxuICAgICAgICByYW5kb21TZWVkOiByYW5kb21TZWVkXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gWFhYIEl0J2QgYmUgYmV0dGVyIGlmIHdlIGNvdWxkIGhvb2sgaW50byBtZXRob2QgaGFuZGxlcnMgYmV0dGVyIGJ1dFxuICAgICAgICAvLyBmb3Igbm93LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZHAtcmF0ZS1saW1pdGVyIGV4aXN0cyBzaW5jZSB3ZVxuICAgICAgICAvLyBoYXZlIGEgd2VhayByZXF1aXJlbWVudCBmb3IgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSB0byBiZSBhZGRlZFxuICAgICAgICAvLyB0byBvdXIgYXBwbGljYXRpb24uXG4gICAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgICB2YXIgRERQUmF0ZUxpbWl0ZXIgPSBQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10uRERQUmF0ZUxpbWl0ZXI7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgICAgY2xpZW50QWRkcmVzczogc2VsZi5jb25uZWN0aW9uSGFuZGxlLmNsaWVudEFkZHJlc3MsXG4gICAgICAgICAgICB0eXBlOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgbmFtZTogbXNnLm1ldGhvZCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICAgIH07XG4gICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgICB2YXIgcmF0ZUxpbWl0UmVzdWx0ID0gRERQUmF0ZUxpbWl0ZXIuX2NoZWNrKHJhdGVMaW1pdGVySW5wdXQpXG4gICAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgIFwidG9vLW1hbnktcmVxdWVzdHNcIixcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fVxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlLndpdGhWYWx1ZShcbiAgICAgICAgICBmZW5jZSxcbiAgICAgICAgICAoKSA9PiBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgICAgIGludm9jYXRpb24sXG4gICAgICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIG1zZy5wYXJhbXMsXG4gICAgICAgICAgICAgIFwiY2FsbCB0byAnXCIgKyBtc2cubWV0aG9kICsgXCInXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHVuYmxvY2soKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbXNnOiBcInJlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkXG4gICAgICB9O1xuXG4gICAgICBwcm9taXNlLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGF5bG9hZC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZW5kKHBheWxvYWQpO1xuICAgICAgfSwgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgcGF5bG9hZC5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgICBleGNlcHRpb24sXG4gICAgICAgICAgYHdoaWxlIGludm9raW5nIG1ldGhvZCAnJHttc2cubWV0aG9kfSdgXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfZWFjaFN1YjogZnVuY3Rpb24gKGYpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5fbmFtZWRTdWJzLmZvckVhY2goZik7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGYpO1xuICB9LFxuXG4gIF9kaWZmQ29sbGVjdGlvblZpZXdzOiBmdW5jdGlvbiAoYmVmb3JlQ1ZzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhiZWZvcmVDVnMsIHNlbGYuY29sbGVjdGlvblZpZXdzLCB7XG4gICAgICBib3RoOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRpZmYobGVmdFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NWaWV3LCBpZCkge1xuICAgICAgICAgIHNlbGYuc2VuZEFkZGVkKGNvbGxlY3Rpb25OYW1lLCBpZCwgZG9jVmlldy5nZXRGaWVsZHMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSkge1xuICAgICAgICBsZWZ0VmFsdWUuZG9jdW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvYywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgdXNlciBpZCBpbiBhbGwgYXBwcm9wcmlhdGUgY29udGV4dHMgYW5kIHJlcnVuc1xuICAvLyBhbGwgc3Vic2NyaXB0aW9uc1xuICBfc2V0VXNlcklkOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodXNlcklkICE9PSBudWxsICYmIHR5cGVvZiB1c2VySWQgIT09IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXRVc2VySWQgbXVzdCBiZSBjYWxsZWQgb24gc3RyaW5nIG9yIG51bGwsIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHVzZXJJZCk7XG5cbiAgICAvLyBQcmV2ZW50IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnNjcmlwdGlvbnMgZnJvbSBiZWluZyBhZGRlZCB0byBvdXJcbiAgICAvLyBzZXNzaW9uOyB0aGV5IHdpbGwgYmUgZm91bmQgYmVsb3cgd2hlbiB3ZSBjYWxsIHN0YXJ0VW5pdmVyc2FsU3Vicy5cbiAgICAvL1xuICAgIC8vIChXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG5hbWVkIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2Ugd2Ugb25seSBhZGRcbiAgICAvLyB0aGVtIHdoZW4gd2UgcHJvY2VzcyBhICdzdWInIG1lc3NhZ2UuIFdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBhXG4gICAgLy8gJ21ldGhvZCcgbWVzc2FnZSwgYW5kIHRoZSBtZXRob2QgZGlkIG5vdCB1bmJsb2NrLCBiZWNhdXNlIGl0IGlzIGlsbGVnYWxcbiAgICAvLyB0byBjYWxsIHNldFVzZXJJZCBhZnRlciB1bmJsb2NrLiBUaHVzIHdlIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgYWRkaW5nIGFcbiAgICAvLyBuZXcgbmFtZWQgc3Vic2NyaXB0aW9uLilcbiAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gdHJ1ZTtcblxuICAgIC8vIFByZXZlbnQgY3VycmVudCBzdWJzIGZyb20gdXBkYXRpbmcgb3VyIGNvbGxlY3Rpb25WaWV3cyBhbmQgY2FsbCB0aGVpclxuICAgIC8vIHN0b3AgY2FsbGJhY2tzLiBUaGlzIG1heSB5aWVsZC5cbiAgICBzZWxmLl9lYWNoU3ViKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gQWxsIHN1YnMgc2hvdWxkIG5vdyBiZSBkZWFjdGl2YXRlZC4gU3RvcCBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQsXG4gICAgLy8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHB1Ymxpc2hlZCBjb2xsZWN0aW9ucywgcmVzZXQgdG8gYW4gZW1wdHkgdmlldywgYW5kXG4gICAgLy8gdXBkYXRlIHRoZSB1c2VySWQuXG4gICAgc2VsZi5faXNTZW5kaW5nID0gZmFsc2U7XG4gICAgdmFyIGJlZm9yZUNWcyA9IHNlbGYuY29sbGVjdGlvblZpZXdzO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuICAgIHNlbGYudXNlcklkID0gdXNlcklkO1xuXG4gICAgLy8gX3NldFVzZXJJZCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSBhIE1ldGVvciBtZXRob2Qgd2l0aFxuICAgIC8vIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gc2V0LiBCdXQgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiBpcyBub3RcbiAgICAvLyBleHBlY3RlZCB0byBiZSBzZXQgaW5zaWRlIGEgcHVibGlzaCBmdW5jdGlvbiwgc28gd2UgdGVtcG9yYXJ5IHVuc2V0IGl0LlxuICAgIC8vIEluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIGlzIHNldC5cbiAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZSh1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNhdmUgdGhlIG9sZCBuYW1lZCBzdWJzLCBhbmQgcmVzZXQgdG8gaGF2aW5nIG5vIHN1YnNjcmlwdGlvbnMuXG4gICAgICB2YXIgb2xkTmFtZWRTdWJzID0gc2VsZi5fbmFtZWRTdWJzO1xuICAgICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuICAgICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gICAgICBvbGROYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICB2YXIgbmV3U3ViID0gc3ViLl9yZWNyZWF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YnNjcmlwdGlvbklkLCBuZXdTdWIpO1xuICAgICAgICAvLyBuYjogaWYgdGhlIGhhbmRsZXIgdGhyb3dzIG9yIGNhbGxzIHRoaXMuZXJyb3IoKSwgaXQgd2lsbCBpbiBmYWN0XG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IHNlbmQgaXRzICdub3N1YicuIFRoaXMgaXMgT0ssIHRob3VnaC5cbiAgICAgICAgbmV3U3ViLl9ydW5IYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3cgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgc3VicyB0byBiZSBzdGFydGVkIG9uIG91ciBjb25uZWN0aW9uIGluXG4gICAgICAvLyBwYXJhbGxlbCB3aXRoIHRoZSBvbmVzIHdlJ3JlIHNwaW5uaW5nIHVwIGhlcmUsIGFuZCBzcGluIHVwIHVuaXZlcnNhbFxuICAgICAgLy8gc3Vicy5cbiAgICAgIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcbiAgICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBzZW5kaW5nIG1lc3NhZ2VzIGFnYWluLCBiZWdpbm5pbmcgd2l0aCB0aGUgZGlmZiBmcm9tIHRoZSBwcmV2aW91c1xuICAgIC8vIHN0YXRlIG9mIHRoZSB3b3JsZCB0byB0aGUgY3VycmVudCBzdGF0ZS4gTm8geWllbGRzIGFyZSBhbGxvd2VkIGR1cmluZ1xuICAgIC8vIHRoaXMgZGlmZiwgc28gdGhhdCBvdGhlciBjaGFuZ2VzIGNhbm5vdCBpbnRlcmxlYXZlLlxuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG4gICAgICBzZWxmLl9kaWZmQ29sbGVjdGlvblZpZXdzKGJlZm9yZUNWcyk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxmLl9wZW5kaW5nUmVhZHkpKSB7XG4gICAgICAgIHNlbGYuc2VuZFJlYWR5KHNlbGYuX3BlbmRpbmdSZWFkeSk7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIF9zdGFydFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViID0gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYsIGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpO1xuICAgIGlmIChzdWJJZClcbiAgICAgIHNlbGYuX25hbWVkU3Vicy5zZXQoc3ViSWQsIHN1Yik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5wdXNoKHN1Yik7XG5cbiAgICBzdWIuX3J1bkhhbmRsZXIoKTtcbiAgfSxcblxuICAvLyB0ZWFyIGRvd24gc3BlY2lmaWVkIHN1YnNjcmlwdGlvblxuICBfc3RvcFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKHN1YklkLCBlcnJvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBzdWJOYW1lID0gbnVsbDtcbiAgICBpZiAoc3ViSWQpIHtcbiAgICAgIHZhciBtYXliZVN1YiA9IHNlbGYuX25hbWVkU3Vicy5nZXQoc3ViSWQpO1xuICAgICAgaWYgKG1heWJlU3ViKSB7XG4gICAgICAgIHN1Yk5hbWUgPSBtYXliZVN1Yi5fbmFtZTtcbiAgICAgICAgbWF5YmVTdWIuX3JlbW92ZUFsbERvY3VtZW50cygpO1xuICAgICAgICBtYXliZVN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuZGVsZXRlKHN1YklkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2UgPSB7bXNnOiAnbm9zdWInLCBpZDogc3ViSWR9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXNwb25zZS5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHN1Yk5hbWUgPyAoXCJmcm9tIHN1YiBcIiArIHN1Yk5hbWUgKyBcIiBpZCBcIiArIHN1YklkKVxuICAgICAgICAgIDogKFwiZnJvbSBzdWIgaWQgXCIgKyBzdWJJZCkpO1xuICAgIH1cblxuICAgIHNlbGYuc2VuZChyZXNwb25zZSk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIGFsbCBzdWJzY3JpcHRpb25zLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBzZW5kIHJlbW92ZWQgb3Igbm9zdWJcbiAgLy8gbWVzc2FnZXMsIHNpbmNlIHdlIGFzc3VtZSB0aGUgY2xpZW50IGlzIGdvbmUuXG4gIF9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9uczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIsIGlkKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcbiAgICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG5cbiAgICBzZWxmLl91bml2ZXJzYWxTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yikge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuICB9LFxuXG4gIC8vIERldGVybWluZSB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MsIGJhc2VkIG9uIHRoZVxuICAvLyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXByZXNlbnRpbmcgaG93IG1hbnlcbiAgLy8gcHJveGllcyB0aGUgc2VydmVyIGlzIGJlaGluZC5cbiAgX2NsaWVudEFkZHJlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBGb3IgdGhlIHJlcG9ydGVkIGNsaWVudCBhZGRyZXNzIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgY29ycmVjdCxcbiAgICAvLyB0aGUgZGV2ZWxvcGVyIG11c3Qgc2V0IHRoZSBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudFxuICAgIC8vIHZhcmlhYmxlIHRvIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgaG9wcyB0aGV5XG4gICAgLy8gZXhwZWN0IGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIuIEUuZy4sIHNldCB0byBcIjFcIiBpZiB0aGVcbiAgICAvLyBzZXJ2ZXIgaXMgYmVoaW5kIG9uZSBwcm94eS5cbiAgICAvL1xuICAgIC8vIFRoaXMgY291bGQgYmUgY29tcHV0ZWQgb25jZSBhdCBzdGFydHVwIGluc3RlYWQgb2YgZXZlcnkgdGltZS5cbiAgICB2YXIgaHR0cEZvcndhcmRlZENvdW50ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnZbJ0hUVFBfRk9SV0FSREVEX0NPVU5UJ10pIHx8IDA7XG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LnJlbW90ZUFkZHJlc3M7XG5cbiAgICB2YXIgZm9yd2FyZGVkRm9yID0gc2VsZi5zb2NrZXQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWZvclwiXTtcbiAgICBpZiAoISBfLmlzU3RyaW5nKGZvcndhcmRlZEZvcikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3J3YXJkZWRGb3IgPSBmb3J3YXJkZWRGb3IudHJpbSgpLnNwbGl0KC9cXHMqLFxccyovKTtcblxuICAgIC8vIFR5cGljYWxseSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGB4LWZvcndhcmRlZC1mb3JgIGhlYWRlciBpc1xuICAgIC8vIHRoZSBvcmlnaW5hbCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgY29ubmVjdGluZyB0byB0aGUgZmlyc3RcbiAgICAvLyBwcm94eS4gIEhvd2V2ZXIsIHRoZSBlbmQgdXNlciBjYW4gZWFzaWx5IHNwb29mIHRoZSBoZWFkZXIsIGluXG4gICAgLy8gd2hpY2ggY2FzZSB0aGUgZmlyc3QgdmFsdWUocykgd2lsbCBiZSB0aGUgZmFrZSBJUCBhZGRyZXNzIGZyb21cbiAgICAvLyB0aGUgdXNlciBwcmV0ZW5kaW5nIHRvIGJlIGEgcHJveHkgcmVwb3J0aW5nIHRoZSBvcmlnaW5hbCBJUFxuICAgIC8vIGFkZHJlc3MgdmFsdWUuICBCeSBjb3VudGluZyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBiYWNrIGZyb20gdGhlXG4gICAgLy8gZW5kIG9mIHRoZSBsaXN0LCB3ZSBlbnN1cmUgdGhhdCB3ZSBnZXQgdGhlIElQIGFkZHJlc3MgYmVpbmdcbiAgICAvLyByZXBvcnRlZCBieSAqb3VyKiBmaXJzdCBwcm94eS5cblxuICAgIGlmIChodHRwRm9yd2FyZGVkQ291bnQgPCAwIHx8IGh0dHBGb3J3YXJkZWRDb3VudCA+IGZvcndhcmRlZEZvci5sZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBmb3J3YXJkZWRGb3JbZm9yd2FyZGVkRm9yLmxlbmd0aCAtIGh0dHBGb3J3YXJkZWRDb3VudF07XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU3Vic2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIGN0b3IgZm9yIGEgc3ViIGhhbmRsZTogdGhlIGlucHV0IHRvIGVhY2ggcHVibGlzaCBmdW5jdGlvblxuXG4vLyBJbnN0YW5jZSBuYW1lIGlzIHRoaXMgYmVjYXVzZSBpdCdzIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgdGhpcyBpbnNpZGUgYVxuLy8gcHVibGlzaFxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgc2VydmVyJ3Mgc2lkZSBvZiBhIHN1YnNjcmlwdGlvblxuICogQGNsYXNzIFN1YnNjcmlwdGlvblxuICogQGluc3RhbmNlTmFtZSB0aGlzXG4gKiBAc2hvd0luc3RhbmNlTmFtZSB0cnVlXG4gKi9cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG4gICAgc2Vzc2lvbiwgaGFuZGxlciwgc3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgbmFtZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uOyAvLyB0eXBlIGlzIFNlc3Npb25cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGluY29taW5nIFtjb25uZWN0aW9uXSgjbWV0ZW9yX29uY29ubmVjdGlvbikgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBuYW1lICBjb25uZWN0aW9uXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBzZWxmLmNvbm5lY3Rpb24gPSBzZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGU7IC8vIHB1YmxpYyBBUEkgb2JqZWN0XG5cbiAgc2VsZi5faGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgLy8gbXkgc3Vic2NyaXB0aW9uIElEIChnZW5lcmF0ZWQgYnkgY2xpZW50LCB1bmRlZmluZWQgZm9yIHVuaXZlcnNhbCBzdWJzKS5cbiAgc2VsZi5fc3Vic2NyaXB0aW9uSWQgPSBzdWJzY3JpcHRpb25JZDtcbiAgLy8gdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3Vic1xuICBzZWxmLl9uYW1lID0gbmFtZTtcblxuICBzZWxmLl9wYXJhbXMgPSBwYXJhbXMgfHwgW107XG5cbiAgLy8gT25seSBuYW1lZCBzdWJzY3JpcHRpb25zIGhhdmUgSURzLCBidXQgd2UgbmVlZCBzb21lIHNvcnQgb2Ygc3RyaW5nXG4gIC8vIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhbGwgc3Vic2NyaXB0aW9ucyBpbnNpZGVcbiAgLy8gU2Vzc2lvbkRvY3VtZW50Vmlld3MuIFdlIHVzZSB0aGlzIHN1YnNjcmlwdGlvbkhhbmRsZSBmb3IgdGhhdC5cbiAgaWYgKHNlbGYuX3N1YnNjcmlwdGlvbklkKSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ04nICsgc2VsZi5fc3Vic2NyaXB0aW9uSWQ7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ1UnICsgUmFuZG9tLmlkKCk7XG4gIH1cblxuICAvLyBoYXMgX2RlYWN0aXZhdGUgYmVlbiBjYWxsZWQ/XG4gIHNlbGYuX2RlYWN0aXZhdGVkID0gZmFsc2U7XG5cbiAgLy8gc3RvcCBjYWxsYmFja3MgdG8gZy9jIHRoaXMgc3ViLiAgY2FsbGVkIHcvIHplcm8gYXJndW1lbnRzLlxuICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG5cbiAgLy8gdGhlIHNldCBvZiAoY29sbGVjdGlvbiwgZG9jdW1lbnRpZCkgdGhhdCB0aGlzIHN1YnNjcmlwdGlvbiBoYXNcbiAgLy8gYW4gb3BpbmlvbiBhYm91dFxuICBzZWxmLl9kb2N1bWVudHMgPSBuZXcgTWFwKCk7XG5cbiAgLy8gcmVtZW1iZXIgaWYgd2UgYXJlIHJlYWR5LlxuICBzZWxmLl9yZWFkeSA9IGZhbHNlO1xuXG4gIC8vIFBhcnQgb2YgdGhlIHB1YmxpYyBBUEk6IHRoZSB1c2VyIG9mIHRoaXMgc3ViLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBY2Nlc3MgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiBUaGUgaWQgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyLCBvciBgbnVsbGAgaWYgbm8gdXNlciBpcyBsb2dnZWQgaW4uXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAbmFtZSAgdXNlcklkXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi51c2VySWQgPSBzZXNzaW9uLnVzZXJJZDtcblxuICAvLyBGb3Igbm93LCB0aGUgaWQgZmlsdGVyIGlzIGdvaW5nIHRvIGRlZmF1bHQgdG9cbiAgLy8gdGhlIHRvL2Zyb20gRERQIG1ldGhvZHMgb24gTW9uZ29JRCwgdG9cbiAgLy8gc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCBtb25nby9taW5pbW9uZ28gT2JqZWN0SWRzLlxuXG4gIC8vIExhdGVyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpcyBiZSBcInJhd1wiXG4gIC8vIGlmIHlvdSB3YW50IHRvIHB1Ymxpc2ggYSBjb2xsZWN0aW9uIHRoYXQgeW91IGtub3dcbiAgLy8ganVzdCBoYXMgc3RyaW5ncyBmb3Iga2V5cyBhbmQgbm8gZnVubnkgYnVzaW5lc3MsIHRvXG4gIC8vIGEgZGRwIGNvbnN1bWVyIHRoYXQgaXNuJ3QgbWluaW1vbmdvXG5cbiAgc2VsZi5faWRGaWx0ZXIgPSB7XG4gICAgaWRTdHJpbmdpZnk6IE1vbmdvSUQuaWRTdHJpbmdpZnksXG4gICAgaWRQYXJzZTogTW9uZ29JRC5pZFBhcnNlXG4gIH07XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzdWJzY3JpcHRpb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU3Vic2NyaXB0aW9uLnByb3RvdHlwZSwge1xuICBfcnVuSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuICAgIC8vIFhYWCBzaG91bGQgd2UgdW5ibG9jaygpIGhlcmU/IEVpdGhlciBiZWZvcmUgcnVubmluZyB0aGUgcHVibGlzaFxuICAgIC8vIGZ1bmN0aW9uLCBvciBiZWZvcmUgcnVubmluZyBfcHVibGlzaEN1cnNvci5cbiAgICAvL1xuICAgIC8vIFJpZ2h0IG5vdywgZWFjaCBwdWJsaXNoIGZ1bmN0aW9uIGJsb2NrcyBhbGwgZnV0dXJlIHB1Ymxpc2hlcyBhbmRcbiAgICAvLyBtZXRob2RzIHdhaXRpbmcgb24gZGF0YSBmcm9tIE1vbmdvIChvciB3aGF0ZXZlciBlbHNlIHRoZSBmdW5jdGlvblxuICAgIC8vIGJsb2NrcyBvbikuIFRoaXMgcHJvYmFibHkgc2xvd3MgcGFnZSBsb2FkIGluIGNvbW1vbiBjYXNlcy5cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgICgpID0+IG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyhcbiAgICAgICAgICBzZWxmLl9oYW5kbGVyLCBzZWxmLCBFSlNPTi5jbG9uZShzZWxmLl9wYXJhbXMpLFxuICAgICAgICAgIC8vIEl0J3MgT0sgdGhhdCB0aGlzIHdvdWxkIGxvb2sgd2VpcmQgZm9yIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zLFxuICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBoYXZlIG5vIGFyZ3VtZW50cyBzbyB0aGVyZSBjYW4gbmV2ZXIgYmUgYW5cbiAgICAgICAgICAvLyBhdWRpdC1hcmd1bWVudC1jaGVja3MgZmFpbHVyZS5cbiAgICAgICAgICBcInB1Ymxpc2hlciAnXCIgKyBzZWxmLl9uYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpZCB0aGUgaGFuZGxlciBjYWxsIHRoaXMuZXJyb3Igb3IgdGhpcy5zdG9wP1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWxmLl9wdWJsaXNoSGFuZGxlclJlc3VsdChyZXMpO1xuICB9LFxuXG4gIF9wdWJsaXNoSGFuZGxlclJlc3VsdDogZnVuY3Rpb24gKHJlcykge1xuICAgIC8vIFNQRUNJQUwgQ0FTRTogSW5zdGVhZCBvZiB3cml0aW5nIHRoZWlyIG93biBjYWxsYmFja3MgdGhhdCBpbnZva2VcbiAgICAvLyB0aGlzLmFkZGVkL2NoYW5nZWQvcmVhZHkvZXRjLCB0aGUgdXNlciBjYW4ganVzdCByZXR1cm4gYSBjb2xsZWN0aW9uXG4gICAgLy8gY3Vyc29yIG9yIGFycmF5IG9mIGN1cnNvcnMgZnJvbSB0aGUgcHVibGlzaCBmdW5jdGlvbjsgd2UgY2FsbCB0aGVpclxuICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG1ldGhvZCB3aGljaCBzdGFydHMgb2JzZXJ2aW5nIHRoZSBjdXJzb3IgYW5kIHB1Ymxpc2hlcyB0aGVcbiAgICAvLyByZXN1bHRzLiBOb3RlIHRoYXQgX3B1Ymxpc2hDdXJzb3IgZG9lcyBOT1QgY2FsbCByZWFkeSgpLlxuICAgIC8vXG4gICAgLy8gWFhYIFRoaXMgdXNlcyBhbiB1bmRvY3VtZW50ZWQgaW50ZXJmYWNlIHdoaWNoIG9ubHkgdGhlIE1vbmdvIGN1cnNvclxuICAgIC8vIGludGVyZmFjZSBwdWJsaXNoZXMuIFNob3VsZCB3ZSBtYWtlIHRoaXMgaW50ZXJmYWNlIHB1YmxpYyBhbmQgZW5jb3VyYWdlXG4gICAgLy8gdXNlcnMgdG8gaW1wbGVtZW50IGl0IHRoZW1zZWx2ZXM/IEFyZ3VhYmx5LCBpdCdzIHVubmVjZXNzYXJ5OyB1c2VycyBjYW5cbiAgICAvLyBhbHJlYWR5IHdyaXRlIHRoZWlyIG93biBmdW5jdGlvbnMgbGlrZVxuICAgIC8vICAgdmFyIHB1Ymxpc2hNeVJlYWN0aXZlVGhpbmd5ID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICAvLyAgICAgTWV0ZW9yLnB1Ymxpc2gobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICAgIHZhciByZWFjdGl2ZVRoaW5neSA9IGhhbmRsZXIoKTtcbiAgICAvLyAgICAgICByZWFjdGl2ZVRoaW5neS5wdWJsaXNoTWUoKTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpc0N1cnNvciA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYyAmJiBjLl9wdWJsaXNoQ3Vyc29yO1xuICAgIH07XG4gICAgaWYgKGlzQ3Vyc29yKHJlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcy5fcHVibGlzaEN1cnNvcihzZWxmKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gX3B1Ymxpc2hDdXJzb3Igb25seSByZXR1cm5zIGFmdGVyIHRoZSBpbml0aWFsIGFkZGVkIGNhbGxiYWNrcyBoYXZlIHJ1bi5cbiAgICAgIC8vIG1hcmsgc3Vic2NyaXB0aW9uIGFzIHJlYWR5LlxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHJlcykpIHtcbiAgICAgIC8vIGNoZWNrIGFsbCB0aGUgZWxlbWVudHMgYXJlIGN1cnNvcnNcbiAgICAgIGlmICghIF8uYWxsKHJlcywgaXNDdXJzb3IpKSB7XG4gICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBhbiBhcnJheSBvZiBub24tQ3Vyc29yc1wiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgZHVwbGljYXRlIGNvbGxlY3Rpb24gbmFtZXNcbiAgICAgIC8vIFhYWCB3ZSBzaG91bGQgc3VwcG9ydCBvdmVybGFwcGluZyBjdXJzb3JzLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHRoZVxuICAgICAgLy8gbWVyZ2UgYm94IHRvIGFsbG93IG92ZXJsYXAgd2l0aGluIGEgc3Vic2NyaXB0aW9uXG4gICAgICB2YXIgY29sbGVjdGlvbk5hbWVzID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY29sbGVjdGlvbk5hbWUgPSByZXNbaV0uX2dldENvbGxlY3Rpb25OYW1lKCk7XG4gICAgICAgIGlmIChfLmhhcyhjb2xsZWN0aW9uTmFtZXMsIGNvbGxlY3Rpb25OYW1lKSkge1xuICAgICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFxuICAgICAgICAgICAgXCJQdWJsaXNoIGZ1bmN0aW9uIHJldHVybmVkIG11bHRpcGxlIGN1cnNvcnMgZm9yIGNvbGxlY3Rpb24gXCIgK1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uTmFtZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0aW9uTmFtZXNbY29sbGVjdGlvbk5hbWVdID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIF8uZWFjaChyZXMsIGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgICAgICBjdXIuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxmLnJlYWR5KCk7XG4gICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgIC8vIHRydXRoeSB2YWx1ZXMgb3RoZXIgdGhhbiBjdXJzb3JzIG9yIGFycmF5cyBhcmUgcHJvYmFibHkgYVxuICAgICAgLy8gdXNlciBtaXN0YWtlIChwb3NzaWJsZSByZXR1cm5pbmcgYSBNb25nbyBkb2N1bWVudCB2aWEsIHNheSxcbiAgICAgIC8vIGBjb2xsLmZpbmRPbmUoKWApLlxuICAgICAgc2VsZi5lcnJvcihuZXcgRXJyb3IoXCJQdWJsaXNoIGZ1bmN0aW9uIGNhbiBvbmx5IHJldHVybiBhIEN1cnNvciBvciBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBcImFuIGFycmF5IG9mIEN1cnNvcnNcIikpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaGlzIGNhbGxzIGFsbCBzdG9wIGNhbGxiYWNrcyBhbmQgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSB1cGRhdGluZyBhbnlcbiAgLy8gU2Vzc2lvbkNvbGxlY3Rpb25WaWV3cyBmdXJ0aGVyLiBJdCdzIHVzZWQgd2hlbiB0aGUgdXNlciB1bnN1YnNjcmliZXMgb3JcbiAgLy8gZGlzY29ubmVjdHMsIGFzIHdlbGwgYXMgZHVyaW5nIHNldFVzZXJJZCByZS1ydW5zLiBJdCBkb2VzICpOT1QqIHNlbmRcbiAgLy8gcmVtb3ZlZCBtZXNzYWdlcyBmb3IgdGhlIHB1Ymxpc2hlZCBvYmplY3RzOyBpZiB0aGF0IGlzIG5lY2Vzc2FyeSwgY2FsbFxuICAvLyBfcmVtb3ZlQWxsRG9jdW1lbnRzIGZpcnN0LlxuICBfZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9kZWFjdGl2YXRlZClcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9kZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgc2VsZi5fY2FsbFN0b3BDYWxsYmFja3MoKTtcbiAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAtMSk7XG4gIH0sXG5cbiAgX2NhbGxTdG9wQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIHRlbGwgbGlzdGVuZXJzLCBzbyB0aGV5IGNhbiBjbGVhbiB1cFxuICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLl9zdG9wQ2FsbGJhY2tzO1xuICAgIHNlbGYuX3N0b3BDYWxsYmFja3MgPSBbXTtcbiAgICBfLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gU2VuZCByZW1vdmUgbWVzc2FnZXMgZm9yIGV2ZXJ5IGRvY3VtZW50LlxuICBfcmVtb3ZlQWxsRG9jdW1lbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xsZWN0aW9uRG9jcywgY29sbGVjdGlvbk5hbWUpIHtcbiAgICAgICAgY29sbGVjdGlvbkRvY3MuZm9yRWFjaChmdW5jdGlvbiAoc3RySWQpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHNlbGYuX2lkRmlsdGVyLmlkUGFyc2Uoc3RySWQpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgbmV3IFN1YnNjcmlwdGlvbiBmb3IgdGhlIHNhbWUgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lXG4gIC8vIGluaXRpYWwgY3JlYXRpb24gcGFyYW1ldGVycy4gVGhpcyBpc24ndCBhIGNsb25lOiBpdCBkb2Vzbid0IGhhdmVcbiAgLy8gdGhlIHNhbWUgX2RvY3VtZW50cyBjYWNoZSwgc3RvcHBlZCBzdGF0ZSBvciBjYWxsYmFja3M7IG1heSBoYXZlIGFcbiAgLy8gZGlmZmVyZW50IF9zdWJzY3JpcHRpb25IYW5kbGUsIGFuZCBnZXRzIGl0cyB1c2VySWQgZnJvbSB0aGVcbiAgLy8gc2Vzc2lvbiwgbm90IGZyb20gdGhpcyBvYmplY3QuXG4gIF9yZWNyZWF0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYuX3Nlc3Npb24sIHNlbGYuX2hhbmRsZXIsIHNlbGYuX3N1YnNjcmlwdGlvbklkLCBzZWxmLl9wYXJhbXMsXG4gICAgICBzZWxmLl9uYW1lKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBTdG9wcyB0aGlzIGNsaWVudCdzIHN1YnNjcmlwdGlvbiwgdHJpZ2dlcmluZyBhIGNhbGwgb24gdGhlIGNsaWVudCB0byB0aGUgYG9uU3RvcGAgY2FsbGJhY2sgcGFzc2VkIHRvIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LiBJZiBgZXJyb3JgIGlzIG5vdCBhIFtgTWV0ZW9yLkVycm9yYF0oI21ldGVvcl9lcnJvciksIGl0IHdpbGwgYmUgW3Nhbml0aXplZF0oI21ldGVvcl9lcnJvcikuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgVGhlIGVycm9yIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkLCBlcnJvcik7XG4gIH0sXG5cbiAgLy8gTm90ZSB0aGF0IHdoaWxlIG91ciBERFAgY2xpZW50IHdpbGwgbm90aWNlIHRoYXQgeW91J3ZlIGNhbGxlZCBzdG9wKCkgb24gdGhlXG4gIC8vIHNlcnZlciAoYW5kIGNsZWFuIHVwIGl0cyBfc3Vic2NyaXB0aW9ucyB0YWJsZSkgd2UgZG9uJ3QgYWN0dWFsbHkgcHJvdmlkZSBhXG4gIC8vIG1lY2hhbmlzbSBmb3IgYW4gYXBwIHRvIG5vdGljZSB0aGlzICh0aGUgc3Vic2NyaWJlIG9uRXJyb3IgY2FsbGJhY2sgb25seVxuICAvLyB0cmlnZ2VycyBpZiB0aGVyZSBpcyBhbiBlcnJvcikuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24gYW5kIGludm9rZXMgdGhlIGNsaWVudCdzIGBvblN0b3BgIGNhbGxiYWNrIHdpdGggbm8gZXJyb3IuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIHN0b3BwZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG9uU3RvcDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNhbGxiYWNrID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChjYWxsYmFjaywgJ29uU3RvcCBjYWxsYmFjaycsIHNlbGYpO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICBjYWxsYmFjaygpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3N0b3BDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHN1YiBoYXMgYmVlbiBkZWFjdGl2YXRlZCwgKk9SKiBpZiB0aGUgc2Vzc2lvbiB3YXNcbiAgLy8gZGVzdHJveWVkIGJ1dCB0aGUgZGVmZXJyZWQgY2FsbCB0byBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMgaGFzbid0XG4gIC8vIGhhcHBlbmVkIHlldC5cbiAgX2lzRGVhY3RpdmF0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuX2RlYWN0aXZhdGVkIHx8IHNlbGYuX3Nlc3Npb24uaW5RdWV1ZSA9PT0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcmVjb3JkIHNldC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29sbGVjdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgbmV3IGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgbmV3IGRvY3VtZW50LiAgSWYgYF9pZGAgaXMgcHJlc2VudCBpdCBpcyBpZ25vcmVkLlxuICAgKi9cbiAgYWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIGxldCBpZHMgPSBzZWxmLl9kb2N1bWVudHMuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoaWRzID09IG51bGwpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoKTtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5zZXQoY29sbGVjdGlvbk5hbWUsIGlkcyk7XG4gICAgfVxuICAgIGlkcy5hZGQoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uYWRkZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaW4gdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gbW9kaWZpZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBjaGFuZ2VkIGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgdGhhdCBoYXZlIGNoYW5nZWQsIHRvZ2V0aGVyIHdpdGggdGhlaXIgbmV3IHZhbHVlcy4gIElmIGEgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gYGZpZWxkc2AgaXQgd2FzIGxlZnQgdW5jaGFuZ2VkOyBpZiBpdCBpcyBwcmVzZW50IGluIGBmaWVsZHNgIGFuZCBoYXMgYSB2YWx1ZSBvZiBgdW5kZWZpbmVkYCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uY2hhbmdlZChzZWxmLl9zdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgaWQgPSBzZWxmLl9pZEZpbHRlci5pZFN0cmluZ2lmeShpZCk7XG4gICAgLy8gV2UgZG9uJ3QgYm90aGVyIHRvIGRlbGV0ZSBzZXRzIG9mIHRoaW5ncyBpbiBhIGNvbGxlY3Rpb24gaWYgdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpcyBlbXB0eS4gIEl0IGNvdWxkIGJyZWFrIF9yZW1vdmVBbGxEb2N1bWVudHMuXG4gICAgc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSkuZGVsZXRlKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLnJlbW92ZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhbiBpbml0aWFsLCBjb21wbGV0ZSBzbmFwc2hvdCBvZiB0aGUgcmVjb3JkIHNldCBoYXMgYmVlbiBzZW50LiAgVGhpcyB3aWxsIHRyaWdnZXIgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblJlYWR5YCBjYWxsYmFjayBwYXNzZWQgdG8gIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICByZWFkeTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghc2VsZi5fc3Vic2NyaXB0aW9uSWQpXG4gICAgICByZXR1cm47ICAvLyB1bm5lY2Vzc2FyeSBidXQgaWdub3JlZCBmb3IgdW5pdmVyc2FsIHN1YlxuICAgIGlmICghc2VsZi5fcmVhZHkpIHtcbiAgICAgIHNlbGYuX3Nlc3Npb24uc2VuZFJlYWR5KFtzZWxmLl9zdWJzY3JpcHRpb25JZF0pO1xuICAgICAgc2VsZi5fcmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuU2VydmVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIFRoZSBkZWZhdWx0IGhlYXJ0YmVhdCBpbnRlcnZhbCBpcyAzMCBzZWNvbmRzIG9uIHRoZSBzZXJ2ZXIgYW5kIDM1XG4gIC8vIHNlY29uZHMgb24gdGhlIGNsaWVudC4gIFNpbmNlIHRoZSBjbGllbnQgZG9lc24ndCBuZWVkIHRvIHNlbmQgYVxuICAvLyBwaW5nIGFzIGxvbmcgYXMgaXQgaXMgcmVjZWl2aW5nIHBpbmdzLCB0aGlzIG1lYW5zIHRoYXQgcGluZ3NcbiAgLy8gbm9ybWFsbHkgZ28gZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuXG4gIC8vXG4gIC8vIE5vdGU6IFRyb3Bvc3BoZXJlIGRlcGVuZHMgb24gdGhlIGFiaWxpdHkgdG8gbXV0YXRlXG4gIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgc2VsZi5vcHRpb25zID0gXy5kZWZhdWx0cyhvcHRpb25zIHx8IHt9LCB7XG4gICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDE1MDAwLFxuICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IDE1MDAwLFxuICAgIC8vIEZvciB0ZXN0aW5nLCBhbGxvdyByZXNwb25kaW5nIHRvIHBpbmdzIHRvIGJlIGRpc2FibGVkLlxuICAgIHJlc3BvbmRUb1BpbmdzOiB0cnVlXG4gIH0pO1xuXG4gIC8vIE1hcCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gY29tZXMgaW4gdG8gdGhlXG4gIC8vIHNlcnZlciBhbmQgY29tcGxldGVzIEREUCB2ZXJzaW9uIG5lZ290aWF0aW9uLiBVc2UgYW4gb2JqZWN0IGluc3RlYWRcbiAgLy8gb2YgYW4gYXJyYXkgc28gd2UgY2FuIHNhZmVseSByZW1vdmUgb25lIGZyb20gdGhlIGxpc3Qgd2hpbGVcbiAgLy8gaXRlcmF0aW5nIG92ZXIgaXQuXG4gIHNlbGYub25Db25uZWN0aW9uSG9vayA9IG5ldyBIb29rKHtcbiAgICBkZWJ1Z1ByaW50RXhjZXB0aW9uczogXCJvbkNvbm5lY3Rpb24gY2FsbGJhY2tcIlxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGNvbWVzIGluLlxuICBzZWxmLm9uTWVzc2FnZUhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25NZXNzYWdlIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzID0ge307XG4gIHNlbGYudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMgPSBbXTtcblxuICBzZWxmLm1ldGhvZF9oYW5kbGVycyA9IHt9O1xuXG4gIHNlbGYuc2Vzc2lvbnMgPSBuZXcgTWFwKCk7IC8vIG1hcCBmcm9tIGlkIHRvIHNlc3Npb25cblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIgPSBuZXcgU3RyZWFtU2VydmVyO1xuXG4gIHNlbGYuc3RyZWFtX3NlcnZlci5yZWdpc3RlcihmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgLy8gc29ja2V0IGltcGxlbWVudHMgdGhlIFNvY2tKU0Nvbm5lY3Rpb24gaW50ZXJmYWNlXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbnVsbDtcblxuICAgIHZhciBzZW5kRXJyb3IgPSBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICAgIG1zZy5vZmZlbmRpbmdNZXNzYWdlID0gb2ZmZW5kaW5nTWVzc2FnZTtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAobXNnKSk7XG4gICAgfTtcblxuICAgIHNvY2tldC5vbignZGF0YScsIGZ1bmN0aW9uIChyYXdfbXNnKSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFJlY2VpdmVkRERQKSB7XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJSZWNlaXZlZCBERFBcIiwgcmF3X21zZyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBtc2cgPSBERFBDb21tb24ucGFyc2VERFAocmF3X21zZyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNlbmRFcnJvcignUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zZyA9PT0gbnVsbCB8fCAhbXNnLm1zZykge1xuICAgICAgICAgIHNlbmRFcnJvcignQmFkIHJlcXVlc3QnLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtc2cubXNnID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgICAgICBzZW5kRXJyb3IoXCJBbHJlYWR5IGNvbm5lY3RlZFwiLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9oYW5kbGVDb25uZWN0KHNvY2tldCwgbXNnKTtcbiAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgIHNlbmRFcnJvcignTXVzdCBjb25uZWN0IGZpcnN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLnByb2Nlc3NNZXNzYWdlKG1zZyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFhYWCBwcmludCBzdGFjayBuaWNlbHlcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIkludGVybmFsIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIG1lc3NhZ2VcIiwgbXNnLCBlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzb2NrZXQuX21ldGVvclNlc3Npb24uY2xvc2UoKTtcbiAgICAgICAgfSkucnVuKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuXy5leHRlbmQoU2VydmVyLnByb3RvdHlwZSwge1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhlIHNlcnZlci5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uQ29ubmVjdGlvbjogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uQ29ubmVjdGlvbkhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBuZXcgRERQIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKi9cbiAgb25NZXNzYWdlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYub25NZXNzYWdlSG9vay5yZWdpc3Rlcihmbik7XG4gIH0sXG5cbiAgX2hhbmRsZUNvbm5lY3Q6IGZ1bmN0aW9uIChzb2NrZXQsIG1zZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFRoZSBjb25uZWN0IG1lc3NhZ2UgbXVzdCBzcGVjaWZ5IGEgdmVyc2lvbiBhbmQgYW4gYXJyYXkgb2Ygc3VwcG9ydGVkXG4gICAgLy8gdmVyc2lvbnMsIGFuZCBpdCBtdXN0IGNsYWltIHRvIHN1cHBvcnQgd2hhdCBpdCBpcyBwcm9wb3NpbmcuXG4gICAgaWYgKCEodHlwZW9mIChtc2cudmVyc2lvbikgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgXy5pc0FycmF5KG1zZy5zdXBwb3J0KSAmJlxuICAgICAgICAgIF8uYWxsKG1zZy5zdXBwb3J0LCBfLmlzU3RyaW5nKSAmJlxuICAgICAgICAgIF8uY29udGFpbnMobXNnLnN1cHBvcnQsIG1zZy52ZXJzaW9uKSkpIHtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IEREUENvbW1vbi5TVVBQT1JURURfRERQX1ZFUlNJT05TWzBdfSkpO1xuICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSwgaGFuZGxlIHNlc3Npb24gcmVzdW1wdGlvbjogc29tZXRoaW5nIGxpa2U6XG4gICAgLy8gIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IHNlbGYuc2Vzc2lvbnNbbXNnLnNlc3Npb25dXG4gICAgdmFyIHZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uKG1zZy5zdXBwb3J0LCBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OUyk7XG5cbiAgICBpZiAobXNnLnZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgIC8vIFRoZSBiZXN0IHZlcnNpb24gdG8gdXNlIChhY2NvcmRpbmcgdG8gdGhlIGNsaWVudCdzIHN0YXRlZCBwcmVmZXJlbmNlcylcbiAgICAgIC8vIGlzIG5vdCB0aGUgb25lIHRoZSBjbGllbnQgaXMgdHJ5aW5nIHRvIHVzZS4gSW5mb3JtIHRoZW0gYWJvdXQgdGhlIGJlc3RcbiAgICAgIC8vIHZlcnNpb24gdG8gdXNlLlxuICAgICAgc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUCh7bXNnOiAnZmFpbGVkJywgdmVyc2lvbjogdmVyc2lvbn0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFlheSwgdmVyc2lvbiBtYXRjaGVzISBDcmVhdGUgYSBuZXcgc2Vzc2lvbi5cbiAgICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAgIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBuZXcgU2Vzc2lvbihzZWxmLCB2ZXJzaW9uLCBzb2NrZXQsIHNlbGYub3B0aW9ucyk7XG4gICAgc2VsZi5zZXNzaW9ucy5zZXQoc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmlkLCBzb2NrZXQuX21ldGVvclNlc3Npb24pO1xuICAgIHNlbGYub25Db25uZWN0aW9uSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbilcbiAgICAgICAgY2FsbGJhY2soc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHB1Ymxpc2ggaGFuZGxlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUge1N0cmluZ30gaWRlbnRpZmllciBmb3IgcXVlcnlcbiAgICogQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSBwdWJsaXNoIGhhbmRsZXJcbiAgICogQHBhcmFtIG9wdGlvbnMge09iamVjdH1cbiAgICpcbiAgICogU2VydmVyIHdpbGwgY2FsbCBoYW5kbGVyIGZ1bmN0aW9uIG9uIGVhY2ggbmV3IHN1YnNjcmlwdGlvbixcbiAgICogZWl0aGVyIHdoZW4gcmVjZWl2aW5nIEREUCBzdWIgbWVzc2FnZSBmb3IgYSBuYW1lZCBzdWJzY3JpcHRpb24sIG9yIG9uXG4gICAqIEREUCBjb25uZWN0IGZvciBhIHVuaXZlcnNhbCBzdWJzY3JpcHRpb24uXG4gICAqXG4gICAqIElmIG5hbWUgaXMgbnVsbCwgdGhpcyB3aWxsIGJlIGEgc3Vic2NyaXB0aW9uIHRoYXQgaXNcbiAgICogYXV0b21hdGljYWxseSBlc3RhYmxpc2hlZCBhbmQgcGVybWFuZW50bHkgb24gZm9yIGFsbCBjb25uZWN0ZWRcbiAgICogY2xpZW50LCBpbnN0ZWFkIG9mIGEgc3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiBhbmQgb2ZmXG4gICAqIHdpdGggc3Vic2NyaWJlKCkuXG4gICAqXG4gICAqIG9wdGlvbnMgdG8gY29udGFpbjpcbiAgICogIC0gKG1vc3RseSBpbnRlcm5hbCkgaXNfYXV0bzogdHJ1ZSBpZiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKiAgICBmcm9tIGFuIGF1dG9wdWJsaXNoIGhvb2suIHRoaXMgaXMgZm9yIGNvc21ldGljIHB1cnBvc2VzIG9ubHlcbiAgICogICAgKGl0IGxldHMgdXMgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcHJpbnQgYSB3YXJuaW5nIHN1Z2dlc3RpbmdcbiAgICogICAgdGhhdCB5b3UgdHVybiBvZmYgYXV0b3B1Ymxpc2guKVxuICAgKi9cblxuICAvKipcbiAgICogQHN1bW1hcnkgUHVibGlzaCBhIHJlY29yZCBzZXQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbmFtZSBJZiBTdHJpbmcsIG5hbWUgb2YgdGhlIHJlY29yZCBzZXQuICBJZiBPYmplY3QsIHB1YmxpY2F0aW9ucyBEaWN0aW9uYXJ5IG9mIHB1Ymxpc2ggZnVuY3Rpb25zIGJ5IG5hbWUuICBJZiBgbnVsbGAsIHRoZSBzZXQgaGFzIG5vIG5hbWUsIGFuZCB0aGUgcmVjb3JkIHNldCBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgdG8gYWxsIGNvbm5lY3RlZCBjbGllbnRzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIEZ1bmN0aW9uIGNhbGxlZCBvbiB0aGUgc2VydmVyIGVhY2ggdGltZSBhIGNsaWVudCBzdWJzY3JpYmVzLiAgSW5zaWRlIHRoZSBmdW5jdGlvbiwgYHRoaXNgIGlzIHRoZSBwdWJsaXNoIGhhbmRsZXIgb2JqZWN0LCBkZXNjcmliZWQgYmVsb3cuICBJZiB0aGUgY2xpZW50IHBhc3NlZCBhcmd1bWVudHMgdG8gYHN1YnNjcmliZWAsIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaXNoOiBmdW5jdGlvbiAobmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghIF8uaXNPYmplY3QobmFtZSkpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lIGluIHNlbGYucHVibGlzaF9oYW5kbGVycykge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiSWdub3JpbmcgZHVwbGljYXRlIHB1Ymxpc2ggbmFtZWQgJ1wiICsgbmFtZSArIFwiJ1wiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoUGFja2FnZS5hdXRvcHVibGlzaCAmJiAhb3B0aW9ucy5pc19hdXRvKSB7XG4gICAgICAgIC8vIFRoZXkgaGF2ZSBhdXRvcHVibGlzaCBvbiwgeWV0IHRoZXkncmUgdHJ5aW5nIHRvIG1hbnVhbGx5XG4gICAgICAgIC8vIHBpY2tpbmcgc3R1ZmYgdG8gcHVibGlzaC4gVGhleSBwcm9iYWJseSBzaG91bGQgdHVybiBvZmZcbiAgICAgICAgLy8gYXV0b3B1Ymxpc2guIChUaGlzIGNoZWNrIGlzbid0IHBlcmZlY3QgLS0gaWYgeW91IGNyZWF0ZSBhXG4gICAgICAgIC8vIHB1Ymxpc2ggYmVmb3JlIHlvdSB0dXJuIG9uIGF1dG9wdWJsaXNoLCBpdCB3b24ndCBjYXRjaFxuICAgICAgICAvLyBpdC4gQnV0IHRoaXMgd2lsbCBkZWZpbml0ZWx5IGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmVcbiAgICAgICAgLy8geW91J3ZlIGFkZGVkIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlIHRvIHlvdXIgYXBwLCBhbmQgYXJlXG4gICAgICAgIC8vIGNhbGxpbmcgcHVibGlzaCBmcm9tIHlvdXIgYXBwIGNvZGUuKVxuICAgICAgICBpZiAoIXNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoKSB7XG4gICAgICAgICAgc2VsZi53YXJuZWRfYWJvdXRfYXV0b3B1Ymxpc2ggPSB0cnVlO1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXG4gICAgXCIqKiBZb3UndmUgc2V0IHVwIHNvbWUgZGF0YSBzdWJzY3JpcHRpb25zIHdpdGggTWV0ZW9yLnB1Ymxpc2goKSwgYnV0XFxuXCIgK1xuICAgIFwiKiogeW91IHN0aWxsIGhhdmUgYXV0b3B1Ymxpc2ggdHVybmVkIG9uLiBCZWNhdXNlIGF1dG9wdWJsaXNoIGlzIHN0aWxsXFxuXCIgK1xuICAgIFwiKiogb24sIHlvdXIgTWV0ZW9yLnB1Ymxpc2goKSBjYWxscyB3b24ndCBoYXZlIG11Y2ggZWZmZWN0LiBBbGwgZGF0YVxcblwiICtcbiAgICBcIioqIHdpbGwgc3RpbGwgYmUgc2VudCB0byBhbGwgY2xpZW50cy5cXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIFR1cm4gb2ZmIGF1dG9wdWJsaXNoIGJ5IHJlbW92aW5nIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlOlxcblwiICtcbiAgICBcIioqXFxuXCIgK1xuICAgIFwiKiogICAkIG1ldGVvciByZW1vdmUgYXV0b3B1Ymxpc2hcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIC4uIGFuZCBtYWtlIHN1cmUgeW91IGhhdmUgTWV0ZW9yLnB1Ymxpc2goKSBhbmQgTWV0ZW9yLnN1YnNjcmliZSgpIGNhbGxzXFxuXCIgK1xuICAgIFwiKiogZm9yIGVhY2ggY29sbGVjdGlvbiB0aGF0IHlvdSB3YW50IGNsaWVudHMgdG8gc2VlLlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSlcbiAgICAgICAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzW25hbWVdID0gaGFuZGxlcjtcbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIC8vIFNwaW4gdXAgdGhlIG5ldyBwdWJsaXNoZXIgb24gYW55IGV4aXN0aW5nIHNlc3Npb24gdG9vLiBSdW4gZWFjaFxuICAgICAgICAvLyBzZXNzaW9uJ3Mgc3Vic2NyaXB0aW9uIGluIGEgbmV3IEZpYmVyLCBzbyB0aGF0IHRoZXJlJ3Mgbm8gY2hhbmdlIGZvclxuICAgICAgICAvLyBzZWxmLnNlc3Npb25zIHRvIGNoYW5nZSB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoaXMgbG9vcC5cbiAgICAgICAgc2VsZi5zZXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzKSB7XG4gICAgICAgICAgICBGaWJlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgXy5lYWNoKG5hbWUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgc2VsZi5wdWJsaXNoKGtleSwgdmFsdWUsIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfcmVtb3ZlU2Vzc2lvbjogZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5zZXNzaW9ucy5kZWxldGUoc2Vzc2lvbi5pZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGludm9rZWQgb3ZlciB0aGUgbmV0d29yayBieSBjbGllbnRzLlxuICAgKiBAbG9jdXMgQW55d2hlcmVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgRGljdGlvbmFyeSB3aG9zZSBrZXlzIGFyZSBtZXRob2QgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZnVuY3Rpb25zLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG1ldGhvZHM6IGZ1bmN0aW9uIChtZXRob2RzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIF8uZWFjaChtZXRob2RzLCBmdW5jdGlvbiAoZnVuYywgbmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2QgJ1wiICsgbmFtZSArIFwiJyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICBpZiAoc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgbWV0aG9kIG5hbWVkICdcIiArIG5hbWUgKyBcIicgaXMgYWxyZWFkeSBkZWZpbmVkXCIpO1xuICAgICAgc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0gPSBmdW5jO1xuICAgIH0pO1xuICB9LFxuXG4gIGNhbGw6IGZ1bmN0aW9uIChuYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoICYmIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcmVzdWx0IGNhbGxiYWNrLCBub3RcbiAgICAgIC8vIGEgcGFyYW1ldGVyIHRvIHRoZSByZW1vdGUgbWV0aG9kLlxuICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseShuYW1lLCBhcmdzLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gQSB2ZXJzaW9uIG9mIHRoZSBjYWxsIG1ldGhvZCB0aGF0IGFsd2F5cyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgY2FsbEFzeW5jOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncyk7XG4gIH0sXG5cbiAgYXBwbHk6IGZ1bmN0aW9uIChuYW1lLCBhcmdzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIC8vIFdlIHdlcmUgcGFzc2VkIDMgYXJndW1lbnRzLiBUaGV5IG1heSBiZSBlaXRoZXIgKG5hbWUsIGFyZ3MsIG9wdGlvbnMpXG4gICAgLy8gb3IgKG5hbWUsIGFyZ3MsIGNhbGxiYWNrKVxuICAgIGlmICghIGNhbGxiYWNrICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncywgb3B0aW9ucyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpbiB3aGljaGV2ZXIgd2F5IHRoZSBjYWxsZXIgYXNrZWQgZm9yIGl0LiBOb3RlIHRoYXQgd2VcbiAgICAvLyBkbyBOT1QgYmxvY2sgb24gdGhlIHdyaXRlIGZlbmNlIGluIGFuIGFuYWxvZ291cyB3YXkgdG8gaG93IHRoZSBjbGllbnRcbiAgICAvLyBibG9ja3Mgb24gdGhlIHJlbGV2YW50IGRhdGEgYmVpbmcgdmlzaWJsZSwgc28geW91IGFyZSBOT1QgZ3VhcmFudGVlZCB0aGF0XG4gICAgLy8gY3Vyc29yIG9ic2VydmUgY2FsbGJhY2tzIGhhdmUgZmlyZWQgd2hlbiB5b3VyIGNhbGxiYWNrIGlzIGludm9rZWQuIChXZVxuICAgIC8vIGNhbiBjaGFuZ2UgdGhpcyBpZiB0aGVyZSdzIGEgcmVhbCB1c2UgY2FzZS4pXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwcm9taXNlLnRoZW4oXG4gICAgICAgIHJlc3VsdCA9PiBjYWxsYmFjayh1bmRlZmluZWQsIHJlc3VsdCksXG4gICAgICAgIGV4Y2VwdGlvbiA9PiBjYWxsYmFjayhleGNlcHRpb24pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS5hd2FpdCgpO1xuICAgIH1cbiAgfSxcblxuICAvLyBAcGFyYW0gb3B0aW9ucyB7T3B0aW9uYWwgT2JqZWN0fVxuICBhcHBseUFzeW5jOiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFJ1biB0aGUgaGFuZGxlclxuICAgIHZhciBoYW5kbGVyID0gdGhpcy5tZXRob2RfaGFuZGxlcnNbbmFtZV07XG4gICAgaWYgKCEgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHtuYW1lfScgbm90IGZvdW5kYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIG1ldGhvZCBjYWxsIGZyb20gd2l0aGluIGFub3RoZXIgbWV0aG9kIG9yIHB1Ymxpc2ggZnVuY3Rpb24sXG4gICAgLy8gZ2V0IHRoZSB1c2VyIHN0YXRlIGZyb20gdGhlIG91dGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLCBvdGhlcndpc2VcbiAgICAvLyBkb24ndCBhbGxvdyBzZXRVc2VySWQgdG8gYmUgY2FsbGVkXG4gICAgdmFyIHVzZXJJZCA9IG51bGw7XG4gICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY2FsbCBzZXRVc2VySWQgb24gYSBzZXJ2ZXIgaW5pdGlhdGVkIG1ldGhvZCBjYWxsXCIpO1xuICAgIH07XG4gICAgdmFyIGNvbm5lY3Rpb24gPSBudWxsO1xuICAgIHZhciBjdXJyZW50TWV0aG9kSW52b2NhdGlvbiA9IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24gPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIHJhbmRvbVNlZWQgPSBudWxsO1xuICAgIGlmIChjdXJyZW50TWV0aG9kSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudE1ldGhvZEludm9jYXRpb24udXNlcklkO1xuICAgICAgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnNldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcbiAgICAgIGNvbm5lY3Rpb24gPSBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgICAgcmFuZG9tU2VlZCA9IEREUENvbW1vbi5tYWtlUnBjU2VlZChjdXJyZW50TWV0aG9kSW52b2NhdGlvbiwgbmFtZSk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uKSB7XG4gICAgICB1c2VySWQgPSBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLl9zZXNzaW9uLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgIGlzU2ltdWxhdGlvbjogZmFsc2UsXG4gICAgICB1c2VySWQsXG4gICAgICBzZXRVc2VySWQsXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgcmFuZG9tU2VlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVzb2x2ZShcbiAgICAgIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgaGFuZGxlciwgaW52b2NhdGlvbiwgRUpTT04uY2xvbmUoYXJncyksXG4gICAgICAgICAgXCJpbnRlcm5hbCBjYWxsIHRvICdcIiArIG5hbWUgKyBcIidcIlxuICAgICAgICApXG4gICAgICApXG4gICAgKSkudGhlbihFSlNPTi5jbG9uZSk7XG4gIH0sXG5cbiAgX3VybEZvclNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uSWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNlc3Npb24gPSBzZWxmLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChzZXNzaW9uKVxuICAgICAgcmV0dXJuIHNlc3Npb24uX3NvY2tldFVybDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbnZhciBjYWxjdWxhdGVWZXJzaW9uID0gZnVuY3Rpb24gKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgdmFyIGNvcnJlY3RWZXJzaW9uID0gXy5maW5kKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLCBmdW5jdGlvbiAodmVyc2lvbikge1xuICAgIHJldHVybiBfLmNvbnRhaW5zKHNlcnZlclN1cHBvcnRlZFZlcnNpb25zLCB2ZXJzaW9uKTtcbiAgfSk7XG4gIGlmICghY29ycmVjdFZlcnNpb24pIHtcbiAgICBjb3JyZWN0VmVyc2lvbiA9IHNlcnZlclN1cHBvcnRlZFZlcnNpb25zWzBdO1xuICB9XG4gIHJldHVybiBjb3JyZWN0VmVyc2lvbjtcbn07XG5cbkREUFNlcnZlci5fY2FsY3VsYXRlVmVyc2lvbiA9IGNhbGN1bGF0ZVZlcnNpb247XG5cblxuLy8gXCJibGluZFwiIGV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0aG9zZSB0aGF0IHdlcmUgZGVsaWJlcmF0ZWx5IHRocm93biB0byBzaWduYWxcbi8vIGVycm9ycyB0byB0aGUgY2xpZW50XG52YXIgd3JhcEludGVybmFsRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgY29udGV4dCkge1xuICBpZiAoIWV4Y2VwdGlvbikgcmV0dXJuIGV4Y2VwdGlvbjtcblxuICAvLyBUbyBhbGxvdyBwYWNrYWdlcyB0byB0aHJvdyBlcnJvcnMgaW50ZW5kZWQgZm9yIHRoZSBjbGllbnQgYnV0IG5vdCBoYXZlIHRvXG4gIC8vIGRlcGVuZCBvbiB0aGUgTWV0ZW9yLkVycm9yIGNsYXNzLCBgaXNDbGllbnRTYWZlYCBjYW4gYmUgc2V0IHRvIHRydWUgb24gYW55XG4gIC8vIGVycm9yIGJlZm9yZSBpdCBpcyB0aHJvd24uXG4gIGlmIChleGNlcHRpb24uaXNDbGllbnRTYWZlKSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgTWV0ZW9yLkVycm9yKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTWV0ZW9yLkVycm9yKGV4Y2VwdGlvbi5lcnJvciwgZXhjZXB0aW9uLnJlYXNvbiwgZXhjZXB0aW9uLmRldGFpbHMpO1xuICAgICAgZXhjZXB0aW9uLm1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG4gIH1cblxuICAvLyBUZXN0cyBjYW4gc2V0IHRoZSAnX2V4cGVjdGVkQnlUZXN0JyBmbGFnIG9uIGFuIGV4Y2VwdGlvbiBzbyBpdCB3b24ndCBnbyB0b1xuICAvLyB0aGUgc2VydmVyIGxvZy5cbiAgaWYgKCFleGNlcHRpb24uX2V4cGVjdGVkQnlUZXN0KSB7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQsIGV4Y2VwdGlvbi5zdGFjayk7XG4gICAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIlNhbml0aXplZCBhbmQgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCBhczpcIiwgZXhjZXB0aW9uLnNhbml0aXplZEVycm9yKTtcbiAgICAgIE1ldGVvci5fZGVidWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBEaWQgdGhlIGVycm9yIGNvbnRhaW4gbW9yZSBkZXRhaWxzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHVzZWZ1bCBpZiBjYXVnaHQgaW5cbiAgLy8gc2VydmVyIGNvZGUgKG9yIGlmIHRocm93biBmcm9tIG5vbi1jbGllbnQtb3JpZ2luYXRlZCBjb2RlKSwgYnV0IGFsc29cbiAgLy8gcHJvdmlkZWQgYSBcInNhbml0aXplZFwiIHZlcnNpb24gd2l0aCBtb3JlIGNvbnRleHQgdGhhbiA1MDAgSW50ZXJuYWwgc2VydmVyXG4gIC8vIGVycm9yPyBVc2UgdGhhdC5cbiAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IuaXNDbGllbnRTYWZlKVxuICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcjtcbiAgICBNZXRlb3IuX2RlYnVnKFwiRXhjZXB0aW9uIFwiICsgY29udGV4dCArIFwiIHByb3ZpZGVzIGEgc2FuaXRpemVkRXJyb3IgdGhhdCBcIiArXG4gICAgICAgICAgICAgICAgICBcImRvZXMgbm90IGhhdmUgaXNDbGllbnRTYWZlIHByb3BlcnR5IHNldDsgaWdub3JpbmdcIik7XG4gIH1cblxuICByZXR1cm4gbmV3IE1ldGVvci5FcnJvcig1MDAsIFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIpO1xufTtcblxuXG4vLyBBdWRpdCBhcmd1bWVudCBjaGVja3MsIGlmIHRoZSBhdWRpdC1hcmd1bWVudC1jaGVja3MgcGFja2FnZSBleGlzdHMgKGl0IGlzIGFcbi8vIHdlYWsgZGVwZW5kZW5jeSBvZiB0aGlzIHBhY2thZ2UpLlxudmFyIG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyA9IGZ1bmN0aW9uIChmLCBjb250ZXh0LCBhcmdzLCBkZXNjcmlwdGlvbikge1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgaWYgKFBhY2thZ2VbJ2F1ZGl0LWFyZ3VtZW50LWNoZWNrcyddKSB7XG4gICAgcmV0dXJuIE1hdGNoLl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkKFxuICAgICAgZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pO1xuICB9XG4gIHJldHVybiBmLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xufTtcbiIsInZhciBGdXR1cmUgPSBOcG0ucmVxdWlyZSgnZmliZXJzL2Z1dHVyZScpO1xuXG4vLyBBIHdyaXRlIGZlbmNlIGNvbGxlY3RzIGEgZ3JvdXAgb2Ygd3JpdGVzLCBhbmQgcHJvdmlkZXMgYSBjYWxsYmFja1xuLy8gd2hlbiBhbGwgb2YgdGhlIHdyaXRlcyBhcmUgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkIChhbGxcbi8vIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQgb2YgdGhlIHdyaXRlIGFuZCBhY2tub3dsZWRnZWQgaXQuKVxuLy9cbkREUFNlcnZlci5fV3JpdGVGZW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuYXJtZWQgPSBmYWxzZTtcbiAgc2VsZi5maXJlZCA9IGZhbHNlO1xuICBzZWxmLnJldGlyZWQgPSBmYWxzZTtcbiAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMgPSAwO1xuICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICBzZWxmLmNvbXBsZXRpb25fY2FsbGJhY2tzID0gW107XG59O1xuXG4vLyBUaGUgY3VycmVudCB3cml0ZSBmZW5jZS4gV2hlbiB0aGVyZSBpcyBhIGN1cnJlbnQgd3JpdGUgZmVuY2UsIGNvZGVcbi8vIHRoYXQgd3JpdGVzIHRvIGRhdGFiYXNlcyBzaG91bGQgcmVnaXN0ZXIgdGhlaXIgd3JpdGVzIHdpdGggaXQgdXNpbmdcbi8vIGJlZ2luV3JpdGUoKS5cbi8vXG5ERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlID0gbmV3IE1ldGVvci5FbnZpcm9ubWVudFZhcmlhYmxlO1xuXG5fLmV4dGVuZChERFBTZXJ2ZXIuX1dyaXRlRmVuY2UucHJvdG90eXBlLCB7XG4gIC8vIFN0YXJ0IHRyYWNraW5nIGEgd3JpdGUsIGFuZCByZXR1cm4gYW4gb2JqZWN0IHRvIHJlcHJlc2VudCBpdC4gVGhlXG4gIC8vIG9iamVjdCBoYXMgYSBzaW5nbGUgbWV0aG9kLCBjb21taXR0ZWQoKS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlXG4gIC8vIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBpcyBmdWxseSBjb21taXR0ZWQgYW5kIHByb3BhZ2F0ZWQuIFlvdSBjYW5cbiAgLy8gY29udGludWUgdG8gYWRkIHdyaXRlcyB0byB0aGUgV3JpdGVGZW5jZSB1cCB1bnRpbCBpdCBpcyB0cmlnZ2VyZWRcbiAgLy8gKGNhbGxzIGl0cyBjYWxsYmFja3MgYmVjYXVzZSBhbGwgd3JpdGVzIGhhdmUgY29tbWl0dGVkLilcbiAgYmVnaW5Xcml0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmIChzZWxmLnJldGlyZWQpXG4gICAgICByZXR1cm4geyBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHt9IH07XG5cbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBhZGQgd3JpdGVzXCIpO1xuXG4gICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICB2YXIgY29tbWl0dGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1pdHRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29tbWl0dGVkKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbW1pdHRlZCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUgd3JpdGVcIik7XG4gICAgICAgIGNvbW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzLS07XG4gICAgICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgLy8gQXJtIHRoZSBmZW5jZS4gT25jZSB0aGUgZmVuY2UgaXMgYXJtZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZVxuICAvLyB1bmNvbW1pdHRlZCB3cml0ZXMsIGl0IHdpbGwgYWN0aXZhdGUuXG4gIGFybTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZiA9PT0gRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS5nZXQoKSlcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgYXJtIHRoZSBjdXJyZW50IGZlbmNlXCIpO1xuICAgIHNlbGYuYXJtZWQgPSB0cnVlO1xuICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGZpcmluZyB0aGUgZmVuY2UuXG4gIC8vIENhbGxiYWNrIGZ1bmN0aW9uIGNhbiBhZGQgbmV3IHdyaXRlcyB0byB0aGUgZmVuY2UsIGluIHdoaWNoIGNhc2VcbiAgLy8gaXQgd29uJ3QgZmlyZSB1bnRpbCB0aG9zZSB3cml0ZXMgYXJlIGRvbmUgYXMgd2VsbC5cbiAgb25CZWZvcmVGaXJlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJhZGQgYSBjYWxsYmFja1wiKTtcbiAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlbmNlIGZpcmVzLlxuICBvbkFsbENvbW1pdHRlZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uLiBBcm1zIHRoZSBmZW5jZSwgdGhlbiBibG9ja3MgdW50aWwgaXQgZmlyZXMuXG4gIGFybUFuZFdhaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmU7XG4gICAgc2VsZi5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICBmdXR1cmVbJ3JldHVybiddKCk7XG4gICAgfSk7XG4gICAgc2VsZi5hcm0oKTtcbiAgICBmdXR1cmUud2FpdCgpO1xuICB9LFxuXG4gIF9tYXliZUZpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSBmZW5jZSBhbHJlYWR5IGFjdGl2YXRlZD9cIik7XG4gICAgaWYgKHNlbGYuYXJtZWQgJiYgIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICBmdW5jdGlvbiBpbnZva2VDYWxsYmFjayAoZnVuYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZ1bmMoc2VsZik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXCJleGNlcHRpb24gaW4gd3JpdGUgZmVuY2UgY2FsbGJhY2tcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcysrO1xuICAgICAgd2hpbGUgKHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzO1xuICAgICAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuXG4gICAgICBpZiAoIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICAgIHNlbGYuZmlyZWQgPSB0cnVlO1xuICAgICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIERlYWN0aXZhdGUgdGhpcyBmZW5jZSBzbyB0aGF0IGFkZGluZyBtb3JlIHdyaXRlcyBoYXMgbm8gZWZmZWN0LlxuICAvLyBUaGUgZmVuY2UgbXVzdCBoYXZlIGFscmVhZHkgZmlyZWQuXG4gIHJldGlyZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoISBzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmV0aXJlIGEgZmVuY2UgdGhhdCBoYXNuJ3QgZmlyZWQuXCIpO1xuICAgIHNlbGYucmV0aXJlZCA9IHRydWU7XG4gIH1cbn0pO1xuIiwiLy8gQSBcImNyb3NzYmFyXCIgaXMgYSBjbGFzcyB0aGF0IHByb3ZpZGVzIHN0cnVjdHVyZWQgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbi5cbi8vIFNlZSBfbWF0Y2ggZm9yIHRoZSBkZWZpbml0aW9uIG9mIGhvdyBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzIGEgdHJpZ2dlci5cbi8vIEFsbCBub3RpZmljYXRpb25zIGFuZCB0cmlnZ2VycyBtdXN0IGhhdmUgYSBzdHJpbmcga2V5IG5hbWVkICdjb2xsZWN0aW9uJy5cblxuRERQU2VydmVyLl9Dcm9zc2JhciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgc2VsZi5uZXh0SWQgPSAxO1xuICAvLyBtYXAgZnJvbSBjb2xsZWN0aW9uIG5hbWUgKHN0cmluZykgLT4gbGlzdGVuZXIgaWQgLT4gb2JqZWN0LiBlYWNoIG9iamVjdCBoYXNcbiAgLy8ga2V5cyAndHJpZ2dlcicsICdjYWxsYmFjaycuICBBcyBhIGhhY2ssIHRoZSBlbXB0eSBzdHJpbmcgbWVhbnMgXCJub1xuICAvLyBjb2xsZWN0aW9uXCIuXG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uID0ge307XG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnQgPSB7fTtcbiAgc2VsZi5mYWN0UGFja2FnZSA9IG9wdGlvbnMuZmFjdFBhY2thZ2UgfHwgXCJsaXZlZGF0YVwiO1xuICBzZWxmLmZhY3ROYW1lID0gb3B0aW9ucy5mYWN0TmFtZSB8fCBudWxsO1xufTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Dcm9zc2Jhci5wcm90b3R5cGUsIHtcbiAgLy8gbXNnIGlzIGEgdHJpZ2dlciBvciBhIG5vdGlmaWNhdGlvblxuICBfY29sbGVjdGlvbkZvck1lc3NhZ2U6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgXy5oYXMobXNnLCAnY29sbGVjdGlvbicpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YobXNnLmNvbGxlY3Rpb24pID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG1zZy5jb2xsZWN0aW9uID09PSAnJylcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBlbXB0eSBjb2xsZWN0aW9uIVwiKTtcbiAgICAgIHJldHVybiBtc2cuY29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBub24tc3RyaW5nIGNvbGxlY3Rpb24hXCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBMaXN0ZW4gZm9yIG5vdGlmaWNhdGlvbiB0aGF0IG1hdGNoICd0cmlnZ2VyJy4gQSBub3RpZmljYXRpb25cbiAgLy8gbWF0Y2hlcyBpZiBpdCBoYXMgdGhlIGtleS12YWx1ZSBwYWlycyBpbiB0cmlnZ2VyIGFzIGFcbiAgLy8gc3Vic2V0LiBXaGVuIGEgbm90aWZpY2F0aW9uIG1hdGNoZXMsIGNhbGwgJ2NhbGxiYWNrJywgcGFzc2luZ1xuICAvLyB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbi5cbiAgLy9cbiAgLy8gUmV0dXJucyBhIGxpc3RlbiBoYW5kbGUsIHdoaWNoIGlzIGFuIG9iamVjdCB3aXRoIGEgbWV0aG9kXG4gIC8vIHN0b3AoKS4gQ2FsbCBzdG9wKCkgdG8gc3RvcCBsaXN0ZW5pbmcuXG4gIC8vXG4gIC8vIFhYWCBJdCBzaG91bGQgYmUgbGVnYWwgdG8gY2FsbCBmaXJlKCkgZnJvbSBpbnNpZGUgYSBsaXN0ZW4oKVxuICAvLyBjYWxsYmFjaz9cbiAgbGlzdGVuOiBmdW5jdGlvbiAodHJpZ2dlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGlkID0gc2VsZi5uZXh0SWQrKztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2UodHJpZ2dlcik7XG4gICAgdmFyIHJlY29yZCA9IHt0cmlnZ2VyOiBFSlNPTi5jbG9uZSh0cmlnZ2VyKSwgY2FsbGJhY2s6IGNhbGxiYWNrfTtcbiAgICBpZiAoISBfLmhhcyhzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiwgY29sbGVjdGlvbikpIHtcbiAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dID0ge307XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID0gMDtcbiAgICB9XG4gICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdID0gcmVjb3JkO1xuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0rKztcblxuICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICAgICAgc2VsZi5mYWN0UGFja2FnZSwgc2VsZi5mYWN0TmFtZSwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXVtpZF07XG4gICAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0tLTtcbiAgICAgICAgaWYgKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0gPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEZpcmUgdGhlIHByb3ZpZGVkICdub3RpZmljYXRpb24nIChhbiBvYmplY3Qgd2hvc2UgYXR0cmlidXRlXG4gIC8vIHZhbHVlcyBhcmUgYWxsIEpTT04tY29tcGF0aWJpbGUpIC0tIGluZm9ybSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzXG4gIC8vIChyZWdpc3RlcmVkIHdpdGggbGlzdGVuKCkpLlxuICAvL1xuICAvLyBJZiBmaXJlKCkgaXMgY2FsbGVkIGluc2lkZSBhIHdyaXRlIGZlbmNlLCB0aGVuIGVhY2ggb2YgdGhlXG4gIC8vIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBpbnNpZGUgdGhlIHdyaXRlIGZlbmNlIGFzIHdlbGwuXG4gIC8vXG4gIC8vIFRoZSBsaXN0ZW5lcnMgbWF5IGJlIGludm9rZWQgaW4gcGFyYWxsZWwsIHJhdGhlciB0aGFuIHNlcmlhbGx5LlxuICBmaXJlOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIGNvbGxlY3Rpb24gPSBzZWxmLl9jb2xsZWN0aW9uRm9yTWVzc2FnZShub3RpZmljYXRpb24pO1xuXG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24gPSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXTtcbiAgICB2YXIgY2FsbGJhY2tJZHMgPSBbXTtcbiAgICBfLmVhY2gobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgZnVuY3Rpb24gKGwsIGlkKSB7XG4gICAgICBpZiAoc2VsZi5fbWF0Y2hlcyhub3RpZmljYXRpb24sIGwudHJpZ2dlcikpIHtcbiAgICAgICAgY2FsbGJhY2tJZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW5lciBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBuZWVkIHRvIGZpcnN0IGZpbmQgYWxsIHRoZSBvbmVzIHRoYXRcbiAgICAvLyBtYXRjaCBpbiBhIHNpbmdsZSBpdGVyYXRpb24gb3ZlciBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiAod2hpY2ggY2FuJ3RcbiAgICAvLyBiZSBtdXRhdGVkIGR1cmluZyB0aGlzIGl0ZXJhdGlvbiksIGFuZCB0aGVuIGludm9rZSB0aGUgbWF0Y2hpbmdcbiAgICAvLyBjYWxsYmFja3MsIGNoZWNraW5nIGJlZm9yZSBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoZXkgaGF2ZW4ndCBzdG9wcGVkLlxuICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoYXRcbiAgICAvLyBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSBzdGlsbCA9PT0gbGlzdGVuZXJzRm9yQ29sbGVjdGlvbixcbiAgICAvLyBiZWNhdXNlIHRoZSBvbmx5IHdheSB0aGF0IHN0b3BzIGJlaW5nIHRydWUgaXMgaWYgbGlzdGVuZXJzRm9yQ29sbGVjdGlvblxuICAgIC8vIGZpcnN0IGdldHMgcmVkdWNlZCBkb3duIHRvIHRoZSBlbXB0eSBvYmplY3QgKGFuZCB0aGVuIG5ldmVyIGdldHNcbiAgICAvLyBpbmNyZWFzZWQgYWdhaW4pLlxuICAgIF8uZWFjaChjYWxsYmFja0lkcywgZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoXy5oYXMobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgaWQpKSB7XG4gICAgICAgIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25baWRdLmNhbGxiYWNrKG5vdGlmaWNhdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gQSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIgaWYgYWxsIGtleXMgdGhhdCBleGlzdCBpbiBib3RoIGFyZSBlcXVhbC5cbiAgLy9cbiAgLy8gRXhhbXBsZXM6XG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGEgbm9uLXRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIHRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIHRhcmdldGVkIHF1ZXJ5IHRhcmdldGVkXG4gIC8vICAgICBhdCB0aGUgc2FtZSBkb2N1bWVudClcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IGRvZXMgbm90IG1hdGNoIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJZXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhIHRhcmdldGVkIHF1ZXJ5XG4gIC8vICAgICB0YXJnZXRlZCBhdCBhIGRpZmZlcmVudCBkb2N1bWVudClcbiAgX21hdGNoZXM6IGZ1bmN0aW9uIChub3RpZmljYXRpb24sIHRyaWdnZXIpIHtcbiAgICAvLyBNb3N0IG5vdGlmaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGNyb3NzYmFyIGhhdmUgYSBzdHJpbmcgYGNvbGxlY3Rpb25gIGFuZFxuICAgIC8vIG1heWJlIGFuIGBpZGAgdGhhdCBpcyBhIHN0cmluZyBvciBPYmplY3RJRC4gV2UncmUgYWxyZWFkeSBkaXZpZGluZyB1cFxuICAgIC8vIHRyaWdnZXJzIGJ5IGNvbGxlY3Rpb24sIGJ1dCBsZXQncyBmYXN0LXRyYWNrIFwibm9wZSwgZGlmZmVyZW50IElEXCIgKGFuZFxuICAgIC8vIGF2b2lkIHRoZSBvdmVybHkgZ2VuZXJpYyBFSlNPTi5lcXVhbHMpLiBUaGlzIG1ha2VzIGEgbm90aWNlYWJsZVxuICAgIC8vIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2U7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9wdWxsLzM2OTdcbiAgICBpZiAodHlwZW9mKG5vdGlmaWNhdGlvbi5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZih0cmlnZ2VyLmlkKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgbm90aWZpY2F0aW9uLmlkICE9PSB0cmlnZ2VyLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub3RpZmljYXRpb24uaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgIHRyaWdnZXIuaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgICEgbm90aWZpY2F0aW9uLmlkLmVxdWFscyh0cmlnZ2VyLmlkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBfLmFsbCh0cmlnZ2VyLCBmdW5jdGlvbiAodHJpZ2dlclZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVybiAhXy5oYXMobm90aWZpY2F0aW9uLCBrZXkpIHx8XG4gICAgICAgIEVKU09OLmVxdWFscyh0cmlnZ2VyVmFsdWUsIG5vdGlmaWNhdGlvbltrZXldKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8vIFRoZSBcImludmFsaWRhdGlvbiBjcm9zc2JhclwiIGlzIGEgc3BlY2lmaWMgaW5zdGFuY2UgdXNlZCBieSB0aGUgRERQIHNlcnZlciB0b1xuLy8gaW1wbGVtZW50IHdyaXRlIGZlbmNlIG5vdGlmaWNhdGlvbnMuIExpc3RlbmVyIGNhbGxiYWNrcyBvbiB0aGlzIGNyb3NzYmFyXG4vLyBzaG91bGQgY2FsbCBiZWdpbldyaXRlIG9uIHRoZSBjdXJyZW50IHdyaXRlIGZlbmNlIGJlZm9yZSB0aGV5IHJldHVybiwgaWYgdGhleVxuLy8gd2FudCB0byBkZWxheSB0aGUgd3JpdGUgZmVuY2UgZnJvbSBmaXJpbmcgKGllLCB0aGUgRERQIG1ldGhvZC1kYXRhLXVwZGF0ZWRcbi8vIG1lc3NhZ2UgZnJvbSBiZWluZyBzZW50KS5cbkREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIgPSBuZXcgRERQU2VydmVyLl9Dcm9zc2Jhcih7XG4gIGZhY3ROYW1lOiBcImludmFsaWRhdGlvbi1jcm9zc2Jhci1saXN0ZW5lcnNcIlxufSk7XG4iLCJpZiAocHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwpIHtcbiAgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCA9XG4gICAgcHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkw7XG59XG5cbk1ldGVvci5zZXJ2ZXIgPSBuZXcgU2VydmVyO1xuXG5NZXRlb3IucmVmcmVzaCA9IGZ1bmN0aW9uIChub3RpZmljYXRpb24pIHtcbiAgRERQU2VydmVyLl9JbnZhbGlkYXRpb25Dcm9zc2Jhci5maXJlKG5vdGlmaWNhdGlvbik7XG59O1xuXG4vLyBQcm94eSB0aGUgcHVibGljIG1ldGhvZHMgb2YgTWV0ZW9yLnNlcnZlciBzbyB0aGV5IGNhblxuLy8gYmUgY2FsbGVkIGRpcmVjdGx5IG9uIE1ldGVvci5cbl8uZWFjaChbJ3B1Ymxpc2gnLCAnbWV0aG9kcycsICdjYWxsJywgJ2FwcGx5JywgJ29uQ29ubmVjdGlvbicsICdvbk1lc3NhZ2UnXSxcbiAgICAgICBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgTWV0ZW9yW25hbWVdID0gXy5iaW5kKE1ldGVvci5zZXJ2ZXJbbmFtZV0sIE1ldGVvci5zZXJ2ZXIpO1xuICAgICAgIH0pO1xuXG4vLyBNZXRlb3Iuc2VydmVyIHVzZWQgdG8gYmUgY2FsbGVkIE1ldGVvci5kZWZhdWx0X3NlcnZlci4gUHJvdmlkZVxuLy8gYmFja2NvbXBhdCBhcyBhIGNvdXJ0ZXN5IGV2ZW4gdGhvdWdoIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkLlxuLy8gWFhYIENPTVBBVCBXSVRIIDAuNi40XG5NZXRlb3IuZGVmYXVsdF9zZXJ2ZXIgPSBNZXRlb3Iuc2VydmVyO1xuIl19 +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci9zdHJlYW1fc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2xpdmVkYXRhX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLXNlcnZlci93cml0ZWZlbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL2Nyb3NzYmFyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtc2VydmVyL3NlcnZlcl9jb252ZW5pZW5jZS5qcyJdLCJuYW1lcyI6WyJ1cmwiLCJOcG0iLCJyZXF1aXJlIiwid2Vic29ja2V0RXh0ZW5zaW9ucyIsIl8iLCJvbmNlIiwiZXh0ZW5zaW9ucyIsIndlYnNvY2tldENvbXByZXNzaW9uQ29uZmlnIiwicHJvY2VzcyIsImVudiIsIlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04iLCJKU09OIiwicGFyc2UiLCJwdXNoIiwiY29uZmlndXJlIiwicGF0aFByZWZpeCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlN0cmVhbVNlcnZlciIsInNlbGYiLCJyZWdpc3RyYXRpb25fY2FsbGJhY2tzIiwib3Blbl9zb2NrZXRzIiwicHJlZml4IiwiUm91dGVQb2xpY3kiLCJkZWNsYXJlIiwic29ja2pzIiwic2VydmVyT3B0aW9ucyIsImxvZyIsImhlYXJ0YmVhdF9kZWxheSIsImRpc2Nvbm5lY3RfZGVsYXkiLCJkaXNhYmxlX2NvcnMiLCJESVNBQkxFX1NPQ0tKU19DT1JTIiwianNlc3Npb25pZCIsIlVTRV9KU0VTU0lPTklEIiwiRElTQUJMRV9XRUJTT0NLRVRTIiwid2Vic29ja2V0IiwiZmF5ZV9zZXJ2ZXJfb3B0aW9ucyIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsIldlYkFwcCIsImh0dHBTZXJ2ZXIiLCJyZW1vdmVMaXN0ZW5lciIsIl90aW1lb3V0QWRqdXN0bWVudFJlcXVlc3RDYWxsYmFjayIsImluc3RhbGxIYW5kbGVycyIsImFkZExpc3RlbmVyIiwiX3JlZGlyZWN0V2Vic29ja2V0RW5kcG9pbnQiLCJvbiIsInNvY2tldCIsInNldFdlYnNvY2tldFRpbWVvdXQiLCJ0aW1lb3V0IiwicHJvdG9jb2wiLCJfc2Vzc2lvbiIsInJlY3YiLCJjb25uZWN0aW9uIiwic2V0VGltZW91dCIsInNlbmQiLCJkYXRhIiwid3JpdGUiLCJ3aXRob3V0Iiwic3RyaW5naWZ5Iiwic2VydmVyX2lkIiwiZWFjaCIsImNhbGxiYWNrIiwiZXh0ZW5kIiwicHJvdG90eXBlIiwicmVnaXN0ZXIiLCJhbGxfc29ja2V0cyIsInZhbHVlcyIsImV2ZW50Iiwib2xkSHR0cFNlcnZlckxpc3RlbmVycyIsImxpc3RlbmVycyIsInNsaWNlIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwibmV3TGlzdGVuZXIiLCJyZXF1ZXN0IiwiYXJncyIsImFyZ3VtZW50cyIsInBhcnNlZFVybCIsInBhdGhuYW1lIiwiZm9ybWF0Iiwib2xkTGlzdGVuZXIiLCJhcHBseSIsIkREUFNlcnZlciIsIkZpYmVyIiwiU2Vzc2lvbkRvY3VtZW50VmlldyIsImV4aXN0c0luIiwiU2V0IiwiZGF0YUJ5S2V5IiwiTWFwIiwiX1Nlc3Npb25Eb2N1bWVudFZpZXciLCJnZXRGaWVsZHMiLCJyZXQiLCJmb3JFYWNoIiwicHJlY2VkZW5jZUxpc3QiLCJrZXkiLCJ2YWx1ZSIsImNsZWFyRmllbGQiLCJzdWJzY3JpcHRpb25IYW5kbGUiLCJjaGFuZ2VDb2xsZWN0b3IiLCJnZXQiLCJyZW1vdmVkVmFsdWUiLCJ1bmRlZmluZWQiLCJpIiwibGVuZ3RoIiwicHJlY2VkZW5jZSIsInNwbGljZSIsImRlbGV0ZSIsIkVKU09OIiwiZXF1YWxzIiwiY2hhbmdlRmllbGQiLCJpc0FkZCIsImNsb25lIiwiaGFzIiwic2V0IiwiZWx0IiwiZmluZCIsIlNlc3Npb25Db2xsZWN0aW9uVmlldyIsImNvbGxlY3Rpb25OYW1lIiwic2Vzc2lvbkNhbGxiYWNrcyIsImRvY3VtZW50cyIsImNhbGxiYWNrcyIsIl9TZXNzaW9uQ29sbGVjdGlvblZpZXciLCJpc0VtcHR5Iiwic2l6ZSIsImRpZmYiLCJwcmV2aW91cyIsIkRpZmZTZXF1ZW5jZSIsImRpZmZNYXBzIiwiYm90aCIsImJpbmQiLCJkaWZmRG9jdW1lbnQiLCJyaWdodE9ubHkiLCJpZCIsIm5vd0RWIiwiYWRkZWQiLCJsZWZ0T25seSIsInByZXZEViIsInJlbW92ZWQiLCJmaWVsZHMiLCJkaWZmT2JqZWN0cyIsInByZXYiLCJub3ciLCJjaGFuZ2VkIiwiZG9jVmlldyIsImFkZCIsImNoYW5nZWRSZXN1bHQiLCJFcnJvciIsImVyciIsIlNlc3Npb24iLCJ2ZXJzaW9uIiwib3B0aW9ucyIsIlJhbmRvbSIsImluaXRpYWxpemVkIiwiaW5RdWV1ZSIsIk1ldGVvciIsIl9Eb3VibGVFbmRlZFF1ZXVlIiwiYmxvY2tlZCIsIndvcmtlclJ1bm5pbmciLCJfbmFtZWRTdWJzIiwiX3VuaXZlcnNhbFN1YnMiLCJ1c2VySWQiLCJjb2xsZWN0aW9uVmlld3MiLCJfaXNTZW5kaW5nIiwiX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMiLCJfcGVuZGluZ1JlYWR5IiwiX2Nsb3NlQ2FsbGJhY2tzIiwiX3NvY2tldFVybCIsIl9yZXNwb25kVG9QaW5ncyIsInJlc3BvbmRUb1BpbmdzIiwiY29ubmVjdGlvbkhhbmRsZSIsImNsb3NlIiwib25DbG9zZSIsImZuIiwiY2IiLCJiaW5kRW52aXJvbm1lbnQiLCJkZWZlciIsImNsaWVudEFkZHJlc3MiLCJfY2xpZW50QWRkcmVzcyIsImh0dHBIZWFkZXJzIiwiaGVhZGVycyIsIm1zZyIsInNlc3Npb24iLCJzdGFydFVuaXZlcnNhbFN1YnMiLCJydW4iLCJoZWFydGJlYXRJbnRlcnZhbCIsImhlYXJ0YmVhdCIsIkREUENvbW1vbiIsIkhlYXJ0YmVhdCIsImhlYXJ0YmVhdFRpbWVvdXQiLCJvblRpbWVvdXQiLCJzZW5kUGluZyIsInN0YXJ0IiwiUGFja2FnZSIsIkZhY3RzIiwiaW5jcmVtZW50U2VydmVyRmFjdCIsInNlbmRSZWFkeSIsInN1YnNjcmlwdGlvbklkcyIsInN1YnMiLCJzdWJzY3JpcHRpb25JZCIsInNlbmRBZGRlZCIsImNvbGxlY3Rpb24iLCJzZW5kQ2hhbmdlZCIsInNlbmRSZW1vdmVkIiwiZ2V0U2VuZENhbGxiYWNrcyIsImdldENvbGxlY3Rpb25WaWV3IiwidmlldyIsImhhbmRsZXJzIiwidW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMiLCJoYW5kbGVyIiwiX3N0YXJ0U3Vic2NyaXB0aW9uIiwic3RvcCIsIl9tZXRlb3JTZXNzaW9uIiwiX2RlYWN0aXZhdGVBbGxTdWJzY3JpcHRpb25zIiwiX3JlbW92ZVNlc3Npb24iLCJfcHJpbnRTZW50RERQIiwiX2RlYnVnIiwic3RyaW5naWZ5RERQIiwic2VuZEVycm9yIiwicmVhc29uIiwib2ZmZW5kaW5nTWVzc2FnZSIsInByb2Nlc3NNZXNzYWdlIiwibXNnX2luIiwibWVzc2FnZVJlY2VpdmVkIiwicHJvY2Vzc05leHQiLCJzaGlmdCIsInVuYmxvY2siLCJvbk1lc3NhZ2VIb29rIiwicHJvdG9jb2xfaGFuZGxlcnMiLCJjYWxsIiwic3ViIiwibmFtZSIsInBhcmFtcyIsIkFycmF5IiwicHVibGlzaF9oYW5kbGVycyIsImVycm9yIiwiRERQUmF0ZUxpbWl0ZXIiLCJyYXRlTGltaXRlcklucHV0IiwidHlwZSIsImNvbm5lY3Rpb25JZCIsIl9pbmNyZW1lbnQiLCJyYXRlTGltaXRSZXN1bHQiLCJfY2hlY2siLCJhbGxvd2VkIiwiZ2V0RXJyb3JNZXNzYWdlIiwidGltZVRvUmVzZXQiLCJ1bnN1YiIsIl9zdG9wU3Vic2NyaXB0aW9uIiwibWV0aG9kIiwicmFuZG9tU2VlZCIsImZlbmNlIiwiX1dyaXRlRmVuY2UiLCJvbkFsbENvbW1pdHRlZCIsInJldGlyZSIsIm1ldGhvZHMiLCJtZXRob2RfaGFuZGxlcnMiLCJhcm0iLCJzZXRVc2VySWQiLCJfc2V0VXNlcklkIiwiaW52b2NhdGlvbiIsIk1ldGhvZEludm9jYXRpb24iLCJpc1NpbXVsYXRpb24iLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfQ3VycmVudFdyaXRlRmVuY2UiLCJ3aXRoVmFsdWUiLCJERFAiLCJfQ3VycmVudE1ldGhvZEludm9jYXRpb24iLCJtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MiLCJmaW5pc2giLCJwYXlsb2FkIiwidGhlbiIsInJlc3VsdCIsImV4Y2VwdGlvbiIsIndyYXBJbnRlcm5hbEV4Y2VwdGlvbiIsIl9lYWNoU3ViIiwiZiIsIl9kaWZmQ29sbGVjdGlvblZpZXdzIiwiYmVmb3JlQ1ZzIiwibGVmdFZhbHVlIiwicmlnaHRWYWx1ZSIsImRvYyIsIl9kZWFjdGl2YXRlIiwib2xkTmFtZWRTdWJzIiwibmV3U3ViIiwiX3JlY3JlYXRlIiwiX3J1bkhhbmRsZXIiLCJfbm9ZaWVsZHNBbGxvd2VkIiwic3ViSWQiLCJTdWJzY3JpcHRpb24iLCJzdWJOYW1lIiwibWF5YmVTdWIiLCJfbmFtZSIsIl9yZW1vdmVBbGxEb2N1bWVudHMiLCJyZXNwb25zZSIsImh0dHBGb3J3YXJkZWRDb3VudCIsInBhcnNlSW50IiwicmVtb3RlQWRkcmVzcyIsImZvcndhcmRlZEZvciIsImlzU3RyaW5nIiwidHJpbSIsInNwbGl0IiwiX2hhbmRsZXIiLCJfc3Vic2NyaXB0aW9uSWQiLCJfcGFyYW1zIiwiX3N1YnNjcmlwdGlvbkhhbmRsZSIsIl9kZWFjdGl2YXRlZCIsIl9zdG9wQ2FsbGJhY2tzIiwiX2RvY3VtZW50cyIsIl9yZWFkeSIsIl9pZEZpbHRlciIsImlkU3RyaW5naWZ5IiwiTW9uZ29JRCIsImlkUGFyc2UiLCJyZXMiLCJfQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbiIsImUiLCJfaXNEZWFjdGl2YXRlZCIsIl9wdWJsaXNoSGFuZGxlclJlc3VsdCIsImlzQ3Vyc29yIiwiYyIsIl9wdWJsaXNoQ3Vyc29yIiwicmVhZHkiLCJpc0FycmF5IiwiYWxsIiwiY29sbGVjdGlvbk5hbWVzIiwiX2dldENvbGxlY3Rpb25OYW1lIiwiY3VyIiwiX2NhbGxTdG9wQ2FsbGJhY2tzIiwiY29sbGVjdGlvbkRvY3MiLCJzdHJJZCIsIm9uU3RvcCIsImlkcyIsIlNlcnZlciIsImRlZmF1bHRzIiwib25Db25uZWN0aW9uSG9vayIsIkhvb2siLCJkZWJ1Z1ByaW50RXhjZXB0aW9ucyIsInNlc3Npb25zIiwic3RyZWFtX3NlcnZlciIsInJhd19tc2ciLCJfcHJpbnRSZWNlaXZlZEREUCIsInBhcnNlRERQIiwiX2hhbmRsZUNvbm5lY3QiLCJvbkNvbm5lY3Rpb24iLCJvbk1lc3NhZ2UiLCJzdXBwb3J0IiwiY29udGFpbnMiLCJTVVBQT1JURURfRERQX1ZFUlNJT05TIiwiY2FsY3VsYXRlVmVyc2lvbiIsInB1Ymxpc2giLCJpc09iamVjdCIsImF1dG9wdWJsaXNoIiwiaXNfYXV0byIsIndhcm5lZF9hYm91dF9hdXRvcHVibGlzaCIsImZ1bmMiLCJwb3AiLCJjYWxsQXN5bmMiLCJhcHBseUFzeW5jIiwiYXdhaXQiLCJjdXJyZW50TWV0aG9kSW52b2NhdGlvbiIsImN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24iLCJtYWtlUnBjU2VlZCIsIl91cmxGb3JTZXNzaW9uIiwic2Vzc2lvbklkIiwiY2xpZW50U3VwcG9ydGVkVmVyc2lvbnMiLCJzZXJ2ZXJTdXBwb3J0ZWRWZXJzaW9ucyIsImNvcnJlY3RWZXJzaW9uIiwiX2NhbGN1bGF0ZVZlcnNpb24iLCJjb250ZXh0IiwiaXNDbGllbnRTYWZlIiwib3JpZ2luYWxNZXNzYWdlIiwibWVzc2FnZSIsImRldGFpbHMiLCJfZXhwZWN0ZWRCeVRlc3QiLCJzdGFjayIsInNhbml0aXplZEVycm9yIiwiZGVzY3JpcHRpb24iLCJNYXRjaCIsIl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkIiwiRnV0dXJlIiwiYXJtZWQiLCJmaXJlZCIsInJldGlyZWQiLCJvdXRzdGFuZGluZ193cml0ZXMiLCJiZWZvcmVfZmlyZV9jYWxsYmFja3MiLCJjb21wbGV0aW9uX2NhbGxiYWNrcyIsIkVudmlyb25tZW50VmFyaWFibGUiLCJiZWdpbldyaXRlIiwiY29tbWl0dGVkIiwiX21heWJlRmlyZSIsIm9uQmVmb3JlRmlyZSIsImFybUFuZFdhaXQiLCJmdXR1cmUiLCJ3YWl0IiwiaW52b2tlQ2FsbGJhY2siLCJfQ3Jvc3NiYXIiLCJuZXh0SWQiLCJsaXN0ZW5lcnNCeUNvbGxlY3Rpb24iLCJsaXN0ZW5lcnNCeUNvbGxlY3Rpb25Db3VudCIsImZhY3RQYWNrYWdlIiwiZmFjdE5hbWUiLCJfY29sbGVjdGlvbkZvck1lc3NhZ2UiLCJsaXN0ZW4iLCJ0cmlnZ2VyIiwicmVjb3JkIiwiZmlyZSIsIm5vdGlmaWNhdGlvbiIsImxpc3RlbmVyc0ZvckNvbGxlY3Rpb24iLCJjYWxsYmFja0lkcyIsImwiLCJfbWF0Y2hlcyIsIk9iamVjdElEIiwidHJpZ2dlclZhbHVlIiwiX0ludmFsaWRhdGlvbkNyb3NzYmFyIiwiRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwiLCJyZWZyZXNoIiwiZGVmYXVsdF9zZXJ2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUlBLEdBQUcsR0FBR0MsR0FBRyxDQUFDQyxPQUFKLENBQVksS0FBWixDQUFWLEMsQ0FFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFJQyxtQkFBbUIsR0FBR0MsQ0FBQyxDQUFDQyxJQUFGLENBQU8sWUFBWTtBQUMzQyxNQUFJQyxVQUFVLEdBQUcsRUFBakI7QUFFQSxNQUFJQywwQkFBMEIsR0FBR0MsT0FBTyxDQUFDQyxHQUFSLENBQVlDLDRCQUFaLEdBQzdCQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0osT0FBTyxDQUFDQyxHQUFSLENBQVlDLDRCQUF2QixDQUQ2QixHQUMwQixFQUQzRDs7QUFFQSxNQUFJSCwwQkFBSixFQUFnQztBQUM5QkQsY0FBVSxDQUFDTyxJQUFYLENBQWdCWixHQUFHLENBQUNDLE9BQUosQ0FBWSxvQkFBWixFQUFr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WixPQUFPLENBQUNDLEdBQVIsQ0FBWXVaLDBCQURkO0FBRUQ7O0FBRUR0USxNQUFNLENBQUNySCxNQUFQLEdBQWdCLElBQUl5UyxNQUFKLEVBQWhCOztBQUVBcEwsTUFBTSxDQUFDdVEsT0FBUCxHQUFpQixVQUFVVCxZQUFWLEVBQXdCO0FBQ3ZDdFUsV0FBUyxDQUFDNlUscUJBQVYsQ0FBZ0NSLElBQWhDLENBQXFDQyxZQUFyQztBQUNELENBRkQsQyxDQUlBO0FBQ0E7OztBQUNBcFosQ0FBQyxDQUFDeUQsSUFBRixDQUFPLENBQUMsU0FBRCxFQUFZLFNBQVosRUFBdUIsTUFBdkIsRUFBK0IsT0FBL0IsRUFBd0MsY0FBeEMsRUFBd0QsV0FBeEQsQ0FBUCxFQUNPLFVBQVV5SyxJQUFWLEVBQWdCO0FBQ2Q1RSxRQUFNLENBQUM0RSxJQUFELENBQU4sR0FBZWxPLENBQUMsQ0FBQzZILElBQUYsQ0FBT3lCLE1BQU0sQ0FBQ3JILE1BQVAsQ0FBY2lNLElBQWQsQ0FBUCxFQUE0QjVFLE1BQU0sQ0FBQ3JILE1BQW5DLENBQWY7QUFDRCxDQUhSLEUsQ0FLQTtBQUNBO0FBQ0E7OztBQUNBcUgsTUFBTSxDQUFDd1EsY0FBUCxHQUF3QnhRLE1BQU0sQ0FBQ3JILE1BQS9CLEMiLCJmaWxlIjoiL3BhY2thZ2VzL2RkcC1zZXJ2ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdXJsID0gTnBtLnJlcXVpcmUoJ3VybCcpO1xuXG4vLyBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIHBlcm1lc3NhZ2UtZGVmbGF0ZSBleHRlbnNpb24gd2l0aCBkZWZhdWx0XG4vLyBjb25maWd1cmF0aW9uLiBJZiAkU0VSVkVSX1dFQlNPQ0tFVF9DT01QUkVTU0lPTiBpcyBzZXQsIHRoZW4gaXQgbXVzdCBiZSB2YWxpZFxuLy8gSlNPTi4gSWYgaXQgcmVwcmVzZW50cyBhIGZhbHNleSB2YWx1ZSwgdGhlbiB3ZSBkbyBub3QgdXNlIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuLy8gYXQgYWxsOyBvdGhlcndpc2UsIHRoZSBKU09OIHZhbHVlIGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gZGVmbGF0ZSdzXG4vLyBjb25maWd1cmUgbWV0aG9kOyBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXllL3Blcm1lc3NhZ2UtZGVmbGF0ZS1ub2RlL2Jsb2IvbWFzdGVyL1JFQURNRS5tZFxuLy9cbi8vIChXZSBkbyB0aGlzIGluIGFuIF8ub25jZSBpbnN0ZWFkIG9mIGF0IHN0YXJ0dXAsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0b1xuLy8gY3Jhc2ggdGhlIHRvb2wgZHVyaW5nIGlzb3BhY2tldCBsb2FkIGlmIHlvdXIgSlNPTiBkb2Vzbid0IHBhcnNlLiBUaGlzIGlzIG9ubHlcbi8vIGEgcHJvYmxlbSBiZWNhdXNlIHRoZSB0b29sIGhhcyB0byBsb2FkIHRoZSBERFAgc2VydmVyIGNvZGUganVzdCBpbiBvcmRlciB0b1xuLy8gYmUgYSBERFAgY2xpZW50OyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21ldGVvci9tZXRlb3IvaXNzdWVzLzM0NTIgLilcbnZhciB3ZWJzb2NrZXRFeHRlbnNpb25zID0gXy5vbmNlKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGV4dGVuc2lvbnMgPSBbXTtcblxuICB2YXIgd2Vic29ja2V0Q29tcHJlc3Npb25Db25maWcgPSBwcm9jZXNzLmVudi5TRVJWRVJfV0VCU09DS0VUX0NPTVBSRVNTSU9OXG4gICAgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlNFUlZFUl9XRUJTT0NLRVRfQ09NUFJFU1NJT04pIDoge307XG4gIGlmICh3ZWJzb2NrZXRDb21wcmVzc2lvbkNvbmZpZykge1xuICAgIGV4dGVuc2lvbnMucHVzaChOcG0ucmVxdWlyZSgncGVybWVzc2FnZS1kZWZsYXRlJykuY29uZmlndXJlKFxuICAgICAgd2Vic29ja2V0Q29tcHJlc3Npb25Db25maWdcbiAgICApKTtcbiAgfVxuXG4gIHJldHVybiBleHRlbnNpb25zO1xufSk7XG5cbnZhciBwYXRoUHJlZml4ID0gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCB8fCBcIlwiO1xuXG5TdHJlYW1TZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzID0gW107XG4gIHNlbGYub3Blbl9zb2NrZXRzID0gW107XG5cbiAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zdGFsbGluZyBkaXJlY3RseSBvbnRvIFdlYkFwcC5odHRwU2VydmVyIGluc3RlYWQgb2YgdXNpbmdcbiAgLy8gV2ViQXBwLmFwcCwgd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBwYXRoIHByZWZpeCBvdXJzZWx2ZXMuXG4gIHNlbGYucHJlZml4ID0gcGF0aFByZWZpeCArICcvc29ja2pzJztcbiAgUm91dGVQb2xpY3kuZGVjbGFyZShzZWxmLnByZWZpeCArICcvJywgJ25ldHdvcmsnKTtcblxuICAvLyBzZXQgdXAgc29ja2pzXG4gIHZhciBzb2NranMgPSBOcG0ucmVxdWlyZSgnc29ja2pzJyk7XG4gIHZhciBzZXJ2ZXJPcHRpb25zID0ge1xuICAgIHByZWZpeDogc2VsZi5wcmVmaXgsXG4gICAgbG9nOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgLy8gdGhpcyBpcyB0aGUgZGVmYXVsdCwgYnV0IHdlIGNvZGUgaXQgZXhwbGljaXRseSBiZWNhdXNlIHdlIGRlcGVuZFxuICAgIC8vIG9uIGl0IGluIHN0cmVhbV9jbGllbnQ6SEVBUlRCRUFUX1RJTUVPVVRcbiAgICBoZWFydGJlYXRfZGVsYXk6IDQ1MDAwLFxuICAgIC8vIFRoZSBkZWZhdWx0IGRpc2Nvbm5lY3RfZGVsYXkgaXMgNSBzZWNvbmRzLCBidXQgaWYgdGhlIHNlcnZlciBlbmRzIHVwIENQVVxuICAgIC8vIGJvdW5kIGZvciB0aGF0IG11Y2ggdGltZSwgU29ja0pTIG1pZ2h0IG5vdCBub3RpY2UgdGhhdCB0aGUgdXNlciBoYXNcbiAgICAvLyByZWNvbm5lY3RlZCBiZWNhdXNlIHRoZSB0aW1lciAob2YgZGlzY29ubmVjdF9kZWxheSBtcykgY2FuIGZpcmUgYmVmb3JlXG4gICAgLy8gU29ja0pTIHByb2Nlc3NlcyB0aGUgbmV3IGNvbm5lY3Rpb24uIEV2ZW50dWFsbHkgd2UnbGwgZml4IHRoaXMgYnkgbm90XG4gICAgLy8gY29tYmluaW5nIENQVS1oZWF2eSBwcm9jZXNzaW5nIHdpdGggU29ja0pTIHRlcm1pbmF0aW9uIChlZyBhIHByb3h5IHdoaWNoXG4gICAgLy8gY29udmVydHMgdG8gVW5peCBzb2NrZXRzKSBidXQgZm9yIG5vdywgcmFpc2UgdGhlIGRlbGF5LlxuICAgIGRpc2Nvbm5lY3RfZGVsYXk6IDYwICogMTAwMCxcbiAgICAvLyBBbGxvdyBkaXNhYmxpbmcgb2YgQ09SUyByZXF1ZXN0cyB0byBhZGRyZXNzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21ldGVvci9tZXRlb3IvaXNzdWVzLzgzMTcuXG4gICAgZGlzYWJsZV9jb3JzOiAhIXByb2Nlc3MuZW52LkRJU0FCTEVfU09DS0pTX0NPUlMsXG4gICAgLy8gU2V0IHRoZSBVU0VfSlNFU1NJT05JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbmFibGUgc2V0dGluZyB0aGVcbiAgICAvLyBKU0VTU0lPTklEIGNvb2tpZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgcHJveGllcyB3aXRoXG4gICAgLy8gc2Vzc2lvbiBhZmZpbml0eS5cbiAgICBqc2Vzc2lvbmlkOiAhIXByb2Nlc3MuZW52LlVTRV9KU0VTU0lPTklEXG4gIH07XG5cbiAgLy8gSWYgeW91IGtub3cgeW91ciBzZXJ2ZXIgZW52aXJvbm1lbnQgKGVnLCBwcm94aWVzKSB3aWxsIHByZXZlbnQgd2Vic29ja2V0c1xuICAvLyBmcm9tIGV2ZXIgd29ya2luZywgc2V0ICRESVNBQkxFX1dFQlNPQ0tFVFMgYW5kIFNvY2tKUyBjbGllbnRzIChpZSxcbiAgLy8gYnJvd3NlcnMpIHdpbGwgbm90IHdhc3RlIHRpbWUgYXR0ZW1wdGluZyB0byB1c2UgdGhlbS5cbiAgLy8gKFlvdXIgc2VydmVyIHdpbGwgc3RpbGwgaGF2ZSBhIC93ZWJzb2NrZXQgZW5kcG9pbnQuKVxuICBpZiAocHJvY2Vzcy5lbnYuRElTQUJMRV9XRUJTT0NLRVRTKSB7XG4gICAgc2VydmVyT3B0aW9ucy53ZWJzb2NrZXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXJPcHRpb25zLmZheWVfc2VydmVyX29wdGlvbnMgPSB7XG4gICAgICBleHRlbnNpb25zOiB3ZWJzb2NrZXRFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzb2NranMuY3JlYXRlU2VydmVyKHNlcnZlck9wdGlvbnMpO1xuXG4gIC8vIEluc3RhbGwgdGhlIHNvY2tqcyBoYW5kbGVycywgYnV0IHdlIHdhbnQgdG8ga2VlcCBhcm91bmQgb3VyIG93biBwYXJ0aWN1bGFyXG4gIC8vIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFkanVzdHMgaWRsZSB0aW1lb3V0cyB3aGlsZSB3ZSBoYXZlIGFuIG91dHN0YW5kaW5nXG4gIC8vIHJlcXVlc3QuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvY2tqcyByZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgLy8gZm9yIFwicmVxdWVzdFwiIHRvIGFkZCBpdHMgb3duLlxuICBXZWJBcHAuaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuICBzZWxmLnNlcnZlci5pbnN0YWxsSGFuZGxlcnMoV2ViQXBwLmh0dHBTZXJ2ZXIpO1xuICBXZWJBcHAuaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihcbiAgICAncmVxdWVzdCcsIFdlYkFwcC5fdGltZW91dEFkanVzdG1lbnRSZXF1ZXN0Q2FsbGJhY2spO1xuXG4gIC8vIFN1cHBvcnQgdGhlIC93ZWJzb2NrZXQgZW5kcG9pbnRcbiAgc2VsZi5fcmVkaXJlY3RXZWJzb2NrZXRFbmRwb2ludCgpO1xuXG4gIHNlbGYuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYSBjbGllbnQgY29ubmVjdHMgdG8gdXMgYW5kIGRvZXMgdGhlIGluaXRpYWxcbiAgICAvLyBXZWJzb2NrZXQgaGFuZHNoYWtlIGJ1dCBuZXZlciBnZXRzIHRvIHRoZSBERFAgaGFuZHNoYWtlLCB0aGF0IHdlXG4gICAgLy8gZXZlbnR1YWxseSBraWxsIHRoZSBzb2NrZXQuICBPbmNlIHRoZSBERFAgaGFuZHNoYWtlIGhhcHBlbnMsIEREUFxuICAgIC8vIGhlYXJ0YmVhdGluZyB3aWxsIHdvcmsuIEFuZCBiZWZvcmUgdGhlIFdlYnNvY2tldCBoYW5kc2hha2UsIHRoZSB0aW1lb3V0c1xuICAgIC8vIHdlIHNldCBhdCB0aGUgc2VydmVyIGxldmVsIGluIHdlYmFwcF9zZXJ2ZXIuanMgd2lsbCB3b3JrLiBCdXRcbiAgICAvLyBmYXllLXdlYnNvY2tldCBjYWxscyBzZXRUaW1lb3V0KDApIG9uIGFueSBzb2NrZXQgaXQgdGFrZXMgb3Zlciwgc28gdGhlcmVcbiAgICAvLyBpcyBhbiBcImluIGJldHdlZW5cIiBzdGF0ZSB3aGVyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuLiAgV2Ugd29yayBhcm91bmQgdGhpc1xuICAgIC8vIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgc29ja2V0IHRpbWVvdXQgdG8gYSByZWxhdGl2ZWx5IGxhcmdlIHRpbWUgaGVyZSxcbiAgICAvLyBhbmQgc2V0dGluZyBpdCBiYWNrIHRvIHplcm8gd2hlbiB3ZSBzZXQgdXAgdGhlIGhlYXJ0YmVhdCBpblxuICAgIC8vIGxpdmVkYXRhX3NlcnZlci5qcy5cbiAgICBzb2NrZXQuc2V0V2Vic29ja2V0VGltZW91dCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICBpZiAoKHNvY2tldC5wcm90b2NvbCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgc29ja2V0LnByb3RvY29sID09PSAnd2Vic29ja2V0LXJhdycpXG4gICAgICAgICYmIHNvY2tldC5fc2Vzc2lvbi5yZWN2KSB7XG4gICAgICAgIHNvY2tldC5fc2Vzc2lvbi5yZWN2LmNvbm5lY3Rpb24uc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDQ1ICogMTAwMCk7XG5cbiAgICBzb2NrZXQuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBzb2NrZXQud3JpdGUoZGF0YSk7XG4gICAgfTtcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vcGVuX3NvY2tldHMgPSBfLndpdGhvdXQoc2VsZi5vcGVuX3NvY2tldHMsIHNvY2tldCk7XG4gICAgfSk7XG4gICAgc2VsZi5vcGVuX3NvY2tldHMucHVzaChzb2NrZXQpO1xuXG4gICAgLy8gWFhYIENPTVBBVCBXSVRIIDAuNi42LiBTZW5kIHRoZSBvbGQgc3R5bGUgd2VsY29tZSBtZXNzYWdlLCB3aGljaFxuICAgIC8vIHdpbGwgZm9yY2Ugb2xkIGNsaWVudHMgdG8gcmVsb2FkLiBSZW1vdmUgdGhpcyBvbmNlIHdlJ3JlIG5vdFxuICAgIC8vIGNvbmNlcm5lZCBhYm91dCBwZW9wbGUgdXBncmFkaW5nIGZyb20gYSBwcmUtMC43LjAgcmVsZWFzZS4gQWxzbyxcbiAgICAvLyByZW1vdmUgdGhlIGNsYXVzZSBpbiB0aGUgY2xpZW50IHRoYXQgaWdub3JlcyB0aGUgd2VsY29tZSBtZXNzYWdlXG4gICAgLy8gKGxpdmVkYXRhX2Nvbm5lY3Rpb24uanMpXG4gICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBzZXJ2ZXJfaWQ6IFwiMFwiIH0pKTtcblxuICAgIC8vIGNhbGwgYWxsIG91ciBjYWxsYmFja3Mgd2hlbiB3ZSBnZXQgYSBuZXcgc29ja2V0LiB0aGV5IHdpbGwgZG8gdGhlXG4gICAgLy8gd29yayBvZiBzZXR0aW5nIHVwIGhhbmRsZXJzIGFuZCBzdWNoIGZvciBzcGVjaWZpYyBtZXNzYWdlcy5cbiAgICBfLmVhY2goc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0pO1xuXG59O1xuXG5fLmV4dGVuZChTdHJlYW1TZXJ2ZXIucHJvdG90eXBlLCB7XG4gIC8vIGNhbGwgbXkgY2FsbGJhY2sgd2hlbiBhIG5ldyBzb2NrZXQgY29ubmVjdHMuXG4gIC8vIGFsc28gY2FsbCBpdCBmb3IgYWxsIGN1cnJlbnQgY29ubmVjdGlvbnMuXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZWdpc3RyYXRpb25fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIF8uZWFjaChzZWxmLmFsbF9zb2NrZXRzKCksIGZ1bmN0aW9uIChzb2NrZXQpIHtcbiAgICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgc29ja2V0c1xuICBhbGxfc29ja2V0czogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gXy52YWx1ZXMoc2VsZi5vcGVuX3NvY2tldHMpO1xuICB9LFxuXG4gIC8vIFJlZGlyZWN0IC93ZWJzb2NrZXQgdG8gL3NvY2tqcy93ZWJzb2NrZXQgaW4gb3JkZXIgdG8gbm90IGV4cG9zZVxuICAvLyBzb2NranMgdG8gY2xpZW50cyB0aGF0IHdhbnQgdG8gdXNlIHJhdyB3ZWJzb2NrZXRzXG4gIF9yZWRpcmVjdFdlYnNvY2tldEVuZHBvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgdXNlIGEgY29ubmVjdCBtaWRkbGV3YXJlIGhlcmUgc2luY2VcbiAgICAvLyBzb2NranMgaW5zdGFsbHMgaXRzZWxmIHByaW9yIHRvIGFsbCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAvLyAobWVhbmluZyBwcmlvciB0byBhbnkgY29ubmVjdCBtaWRkbGV3YXJlcykgc28gd2UgbmVlZCB0byB0YWtlXG4gICAgLy8gYW4gYXBwcm9hY2ggc2ltaWxhciB0byBvdmVyc2hhZG93TGlzdGVuZXJzIGluXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NvY2tqcy9zb2NranMtbm9kZS9ibG9iL2NmODIwYzU1YWY2YTk5NTNlMTY1NTg1NTVhMzFkZWNlYTU1NGY3MGUvc3JjL3V0aWxzLmNvZmZlZVxuICAgIF8uZWFjaChbJ3JlcXVlc3QnLCAndXBncmFkZSddLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBodHRwU2VydmVyID0gV2ViQXBwLmh0dHBTZXJ2ZXI7XG4gICAgICB2YXIgb2xkSHR0cFNlcnZlckxpc3RlbmVycyA9IGh0dHBTZXJ2ZXIubGlzdGVuZXJzKGV2ZW50KS5zbGljZSgwKTtcbiAgICAgIGh0dHBTZXJ2ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KTtcblxuICAgICAgLy8gcmVxdWVzdCBhbmQgdXBncmFkZSBoYXZlIGRpZmZlcmVudCBhcmd1bWVudHMgcGFzc2VkIGJ1dFxuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCBvbmUgd2hpY2ggaXMgYWx3YXlzIHJlcXVlc3RcbiAgICAgIHZhciBuZXdMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZXF1ZXN0IC8qLCBtb3JlQXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdpdGhpbiB0aGUgY2xvc3VyZSBiZWxvd1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAvLyBSZXdyaXRlIC93ZWJzb2NrZXQgYW5kIC93ZWJzb2NrZXQvIHVybHMgdG8gL3NvY2tqcy93ZWJzb2NrZXQgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBxdWVyeSBzdHJpbmcuXG4gICAgICAgIHZhciBwYXJzZWRVcmwgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAocGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQnIHx8XG4gICAgICAgICAgcGFyc2VkVXJsLnBhdGhuYW1lID09PSBwYXRoUHJlZml4ICsgJy93ZWJzb2NrZXQvJykge1xuICAgICAgICAgIHBhcnNlZFVybC5wYXRobmFtZSA9IHNlbGYucHJlZml4ICsgJy93ZWJzb2NrZXQnO1xuICAgICAgICAgIHJlcXVlc3QudXJsID0gdXJsLmZvcm1hdChwYXJzZWRVcmwpO1xuICAgICAgICB9XG4gICAgICAgIF8uZWFjaChvbGRIdHRwU2VydmVyTGlzdGVuZXJzLCBmdW5jdGlvbiAob2xkTGlzdGVuZXIpIHtcbiAgICAgICAgICBvbGRMaXN0ZW5lci5hcHBseShodHRwU2VydmVyLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaHR0cFNlcnZlci5hZGRMaXN0ZW5lcihldmVudCwgbmV3TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIkREUFNlcnZlciA9IHt9O1xuXG52YXIgRmliZXIgPSBOcG0ucmVxdWlyZSgnZmliZXJzJyk7XG5cbi8vIFRoaXMgZmlsZSBjb250YWlucyBjbGFzc2VzOlxuLy8gKiBTZXNzaW9uIC0gVGhlIHNlcnZlcidzIGNvbm5lY3Rpb24gdG8gYSBzaW5nbGUgRERQIGNsaWVudFxuLy8gKiBTdWJzY3JpcHRpb24gLSBBIHNpbmdsZSBzdWJzY3JpcHRpb24gZm9yIGEgc2luZ2xlIGNsaWVudFxuLy8gKiBTZXJ2ZXIgLSBBbiBlbnRpcmUgc2VydmVyIHRoYXQgbWF5IHRhbGsgdG8gPiAxIGNsaWVudC4gQSBERFAgZW5kcG9pbnQuXG4vL1xuLy8gU2Vzc2lvbiBhbmQgU3Vic2NyaXB0aW9uIGFyZSBmaWxlIHNjb3BlLiBGb3Igbm93LCB1bnRpbCB3ZSBmcmVlemVcbi8vIHRoZSBpbnRlcmZhY2UsIFNlcnZlciBpcyBwYWNrYWdlIHNjb3BlIChpbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBiZVxuLy8gZXhwb3J0ZWQuKVxuXG4vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGRvY3VtZW50IGluIGEgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG52YXIgU2Vzc2lvbkRvY3VtZW50VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmV4aXN0c0luID0gbmV3IFNldCgpOyAvLyBzZXQgb2Ygc3Vic2NyaXB0aW9uSGFuZGxlXG4gIHNlbGYuZGF0YUJ5S2V5ID0gbmV3IE1hcCgpOyAvLyBrZXktPiBbIHtzdWJzY3JpcHRpb25IYW5kbGUsIHZhbHVlfSBieSBwcmVjZWRlbmNlXVxufTtcblxuRERQU2VydmVyLl9TZXNzaW9uRG9jdW1lbnRWaWV3ID0gU2Vzc2lvbkRvY3VtZW50VmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uRG9jdW1lbnRWaWV3LnByb3RvdHlwZSwge1xuXG4gIGdldEZpZWxkczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmV0ID0ge307XG4gICAgc2VsZi5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgcmV0W2tleV0gPSBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGNsZWFyRmllbGQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlQ29sbGVjdG9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIFB1Ymxpc2ggQVBJIGlnbm9yZXMgX2lkIGlmIHByZXNlbnQgaW4gZmllbGRzXG4gICAgaWYgKGtleSA9PT0gXCJfaWRcIilcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcblxuICAgIC8vIEl0J3Mgb2theSB0byBjbGVhciBmaWVsZHMgdGhhdCBkaWRuJ3QgZXhpc3QuIE5vIG5lZWQgdG8gdGhyb3dcbiAgICAvLyBhbiBlcnJvci5cbiAgICBpZiAoIXByZWNlZGVuY2VMaXN0KVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJlbW92ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWNlZGVuY2VMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJlY2VkZW5jZSA9IHByZWNlZGVuY2VMaXN0W2ldO1xuICAgICAgaWYgKHByZWNlZGVuY2Uuc3Vic2NyaXB0aW9uSGFuZGxlID09PSBzdWJzY3JpcHRpb25IYW5kbGUpIHtcbiAgICAgICAgLy8gVGhlIHZpZXcncyB2YWx1ZSBjYW4gb25seSBjaGFuZ2UgaWYgdGhpcyBzdWJzY3JpcHRpb24gaXMgdGhlIG9uZSB0aGF0XG4gICAgICAgIC8vIHVzZWQgdG8gaGF2ZSBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoaSA9PT0gMClcbiAgICAgICAgICByZW1vdmVkVmFsdWUgPSBwcmVjZWRlbmNlLnZhbHVlO1xuICAgICAgICBwcmVjZWRlbmNlTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJlY2VkZW5jZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5kZWxldGUoa2V5KTtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlZFZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICFFSlNPTi5lcXVhbHMocmVtb3ZlZFZhbHVlLCBwcmVjZWRlbmNlTGlzdFswXS52YWx1ZSkpIHtcbiAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gcHJlY2VkZW5jZUxpc3RbMF0udmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZUZpZWxkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUNvbGxlY3RvciwgaXNBZGQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gUHVibGlzaCBBUEkgaWdub3JlcyBfaWQgaWYgcHJlc2VudCBpbiBmaWVsZHNcbiAgICBpZiAoa2V5ID09PSBcIl9pZFwiKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gRG9uJ3Qgc2hhcmUgc3RhdGUgd2l0aCB0aGUgZGF0YSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuXG4gICAgdmFsdWUgPSBFSlNPTi5jbG9uZSh2YWx1ZSk7XG5cbiAgICBpZiAoIXNlbGYuZGF0YUJ5S2V5LmhhcyhrZXkpKSB7XG4gICAgICBzZWxmLmRhdGFCeUtleS5zZXQoa2V5LCBbe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWV9XSk7XG4gICAgICBjaGFuZ2VDb2xsZWN0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJlY2VkZW5jZUxpc3QgPSBzZWxmLmRhdGFCeUtleS5nZXQoa2V5KTtcbiAgICB2YXIgZWx0O1xuICAgIGlmICghaXNBZGQpIHtcbiAgICAgIGVsdCA9IHByZWNlZGVuY2VMaXN0LmZpbmQoZnVuY3Rpb24gKHByZWNlZGVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gcHJlY2VkZW5jZS5zdWJzY3JpcHRpb25IYW5kbGUgPT09IHN1YnNjcmlwdGlvbkhhbmRsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbHQpIHtcbiAgICAgIGlmIChlbHQgPT09IHByZWNlZGVuY2VMaXN0WzBdICYmICFFSlNPTi5lcXVhbHModmFsdWUsIGVsdC52YWx1ZSkpIHtcbiAgICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuXG4gICAgICAgIGNoYW5nZUNvbGxlY3RvcltrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBlbHQudmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcyBzdWJzY3JpcHRpb24gaXMgbmV3bHkgY2FyaW5nIGFib3V0IHRoaXMgZmllbGRcbiAgICAgIHByZWNlZGVuY2VMaXN0LnB1c2goe3N1YnNjcmlwdGlvbkhhbmRsZTogc3Vic2NyaXB0aW9uSGFuZGxlLCB2YWx1ZTogdmFsdWV9KTtcbiAgICB9XG5cbiAgfVxufSk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNsaWVudCdzIHZpZXcgb2YgYSBzaW5nbGUgY29sbGVjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaXQgcmVwcmVzZW50c1xuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBzZXNzaW9uQ2FsbGJhY2tzIFRoZSBjYWxsYmFja3MgZm9yIGFkZGVkLCBjaGFuZ2VkLCByZW1vdmVkXG4gKiBAY2xhc3MgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3XG4gKi9cbnZhciBTZXNzaW9uQ29sbGVjdGlvblZpZXcgPSBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIHNlc3Npb25DYWxsYmFja3MpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7XG4gIHNlbGYuZG9jdW1lbnRzID0gbmV3IE1hcCgpO1xuICBzZWxmLmNhbGxiYWNrcyA9IHNlc3Npb25DYWxsYmFja3M7XG59O1xuXG5ERFBTZXJ2ZXIuX1Nlc3Npb25Db2xsZWN0aW9uVmlldyA9IFNlc3Npb25Db2xsZWN0aW9uVmlldztcblxuXG5fLmV4dGVuZChTZXNzaW9uQ29sbGVjdGlvblZpZXcucHJvdG90eXBlLCB7XG5cbiAgaXNFbXB0eTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gc2VsZi5kb2N1bWVudHMuc2l6ZSA9PT0gMDtcbiAgfSxcblxuICBkaWZmOiBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgRGlmZlNlcXVlbmNlLmRpZmZNYXBzKHByZXZpb3VzLmRvY3VtZW50cywgc2VsZi5kb2N1bWVudHMsIHtcbiAgICAgIGJvdGg6IF8uYmluZChzZWxmLmRpZmZEb2N1bWVudCwgc2VsZiksXG5cbiAgICAgIHJpZ2h0T25seTogZnVuY3Rpb24gKGlkLCBub3dEVikge1xuICAgICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgbm93RFYuZ2V0RmllbGRzKCkpO1xuICAgICAgfSxcblxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uIChpZCwgcHJldkRWKSB7XG4gICAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGRpZmZEb2N1bWVudDogZnVuY3Rpb24gKGlkLCBwcmV2RFYsIG5vd0RWKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBmaWVsZHMgPSB7fTtcbiAgICBEaWZmU2VxdWVuY2UuZGlmZk9iamVjdHMocHJldkRWLmdldEZpZWxkcygpLCBub3dEVi5nZXRGaWVsZHMoKSwge1xuICAgICAgYm90aDogZnVuY3Rpb24gKGtleSwgcHJldiwgbm93KSB7XG4gICAgICAgIGlmICghRUpTT04uZXF1YWxzKHByZXYsIG5vdykpXG4gICAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoa2V5LCBub3cpIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSBub3c7XG4gICAgICB9LFxuICAgICAgbGVmdE9ubHk6IGZ1bmN0aW9uKGtleSwgcHJldikge1xuICAgICAgICBmaWVsZHNba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpO1xuICB9LFxuXG4gIGFkZGVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkb2NWaWV3ID0gc2VsZi5kb2N1bWVudHMuZ2V0KGlkKTtcbiAgICB2YXIgYWRkZWQgPSBmYWxzZTtcbiAgICBpZiAoIWRvY1ZpZXcpIHtcbiAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgIGRvY1ZpZXcgPSBuZXcgU2Vzc2lvbkRvY3VtZW50VmlldygpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuc2V0KGlkLCBkb2NWaWV3KTtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5hZGQoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICB2YXIgY2hhbmdlQ29sbGVjdG9yID0ge307XG4gICAgXy5lYWNoKGZpZWxkcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoXG4gICAgICAgIHN1YnNjcmlwdGlvbkhhbmRsZSwga2V5LCB2YWx1ZSwgY2hhbmdlQ29sbGVjdG9yLCB0cnVlKTtcbiAgICB9KTtcbiAgICBpZiAoYWRkZWQpXG4gICAgICBzZWxmLmNhbGxiYWNrcy5hZGRlZChzZWxmLmNvbGxlY3Rpb25OYW1lLCBpZCwgY2hhbmdlQ29sbGVjdG9yKTtcbiAgICBlbHNlXG4gICAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VDb2xsZWN0b3IpO1xuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGlkLCBjaGFuZ2VkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFuZ2VkUmVzdWx0ID0ge307XG4gICAgdmFyIGRvY1ZpZXcgPSBzZWxmLmRvY3VtZW50cy5nZXQoaWQpO1xuICAgIGlmICghZG9jVmlldylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGVsZW1lbnQgd2l0aCBpZCBcIiArIGlkICsgXCIgdG8gY2hhbmdlXCIpO1xuICAgIF8uZWFjaChjaGFuZ2VkLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIGRvY1ZpZXcuY2xlYXJGaWVsZChzdWJzY3JpcHRpb25IYW5kbGUsIGtleSwgY2hhbmdlZFJlc3VsdCk7XG4gICAgICBlbHNlXG4gICAgICAgIGRvY1ZpZXcuY2hhbmdlRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIHZhbHVlLCBjaGFuZ2VkUmVzdWx0KTtcbiAgICB9KTtcbiAgICBzZWxmLmNhbGxiYWNrcy5jaGFuZ2VkKHNlbGYuY29sbGVjdGlvbk5hbWUsIGlkLCBjaGFuZ2VkUmVzdWx0KTtcbiAgfSxcblxuICByZW1vdmVkOiBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uSGFuZGxlLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZG9jVmlldyA9IHNlbGYuZG9jdW1lbnRzLmdldChpZCk7XG4gICAgaWYgKCFkb2NWaWV3KSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiUmVtb3ZlZCBub25leGlzdGVudCBkb2N1bWVudCBcIiArIGlkKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZG9jVmlldy5leGlzdHNJbi5kZWxldGUoc3Vic2NyaXB0aW9uSGFuZGxlKTtcbiAgICBpZiAoZG9jVmlldy5leGlzdHNJbi5zaXplID09PSAwKSB7XG4gICAgICAvLyBpdCBpcyBnb25lIGZyb20gZXZlcnlvbmVcbiAgICAgIHNlbGYuY2FsbGJhY2tzLnJlbW92ZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQpO1xuICAgICAgc2VsZi5kb2N1bWVudHMuZGVsZXRlKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNoYW5nZWQgPSB7fTtcbiAgICAgIC8vIHJlbW92ZSB0aGlzIHN1YnNjcmlwdGlvbiBmcm9tIGV2ZXJ5IHByZWNlZGVuY2UgbGlzdFxuICAgICAgLy8gYW5kIHJlY29yZCB0aGUgY2hhbmdlc1xuICAgICAgZG9jVmlldy5kYXRhQnlLZXkuZm9yRWFjaChmdW5jdGlvbiAocHJlY2VkZW5jZUxpc3QsIGtleSkge1xuICAgICAgICBkb2NWaWV3LmNsZWFyRmllbGQoc3Vic2NyaXB0aW9uSGFuZGxlLCBrZXksIGNoYW5nZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlbGYuY2FsbGJhY2tzLmNoYW5nZWQoc2VsZi5jb2xsZWN0aW9uTmFtZSwgaWQsIGNoYW5nZWQpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIFNlc3Npb24gPSBmdW5jdGlvbiAoc2VydmVyLCB2ZXJzaW9uLCBzb2NrZXQsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmlkID0gUmFuZG9tLmlkKCk7XG5cbiAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHNlbGYudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgc2VsZi5pbml0aWFsaXplZCA9IGZhbHNlO1xuICBzZWxmLnNvY2tldCA9IHNvY2tldDtcblxuICAvLyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGRlc3Ryb3llZC4gbXVsdGlwbGUgcGxhY2VzIGJlbG93XG4gIC8vIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBpcyBhbGl2ZSBvciBub3QuXG4gIHNlbGYuaW5RdWV1ZSA9IG5ldyBNZXRlb3IuX0RvdWJsZUVuZGVkUXVldWUoKTtcblxuICBzZWxmLmJsb2NrZWQgPSBmYWxzZTtcbiAgc2VsZi53b3JrZXJSdW5uaW5nID0gZmFsc2U7XG5cbiAgLy8gU3ViIG9iamVjdHMgZm9yIGFjdGl2ZSBzdWJzY3JpcHRpb25zXG4gIHNlbGYuX25hbWVkU3VicyA9IG5ldyBNYXAoKTtcbiAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gIHNlbGYudXNlcklkID0gbnVsbDtcblxuICBzZWxmLmNvbGxlY3Rpb25WaWV3cyA9IG5ldyBNYXAoKTtcblxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSB0byBub3Qgc2VuZCBtZXNzYWdlcyB3aGVuIGNvbGxlY3Rpb25WaWV3cyBhcmVcbiAgLy8gbW9kaWZpZWQuIFRoaXMgaXMgZG9uZSB3aGVuIHJlcnVubmluZyBzdWJzIGluIF9zZXRVc2VySWQgYW5kIHRob3NlIG1lc3NhZ2VzXG4gIC8vIGFyZSBjYWxjdWxhdGVkIHZpYSBhIGRpZmYgaW5zdGVhZC5cbiAgc2VsZi5faXNTZW5kaW5nID0gdHJ1ZTtcblxuICAvLyBJZiB0aGlzIGlzIHRydWUsIGRvbid0IHN0YXJ0IGEgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgcHVibGlzaGVyIG9uIHRoaXNcbiAgLy8gc2Vzc2lvbi4gVGhlIHNlc3Npb24gd2lsbCB0YWtlIGNhcmUgb2Ygc3RhcnRpbmcgaXQgd2hlbiBhcHByb3ByaWF0ZS5cbiAgc2VsZi5fZG9udFN0YXJ0TmV3VW5pdmVyc2FsU3VicyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gd2UgYXJlIHJlcnVubmluZyBzdWJzY3JpcHRpb25zLCBhbnkgcmVhZHkgbWVzc2FnZXNcbiAgLy8gd2Ugd2FudCB0byBidWZmZXIgdXAgZm9yIHdoZW4gd2UgYXJlIGRvbmUgcmVydW5uaW5nIHN1YnNjcmlwdGlvbnNcbiAgc2VsZi5fcGVuZGluZ1JlYWR5ID0gW107XG5cbiAgLy8gTGlzdCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIHRoaXMgY29ubmVjdGlvbiBpcyBjbG9zZWQuXG4gIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzID0gW107XG5cblxuICAvLyBYWFggSEFDSzogSWYgYSBzb2NranMgY29ubmVjdGlvbiwgc2F2ZSBvZmYgdGhlIFVSTC4gVGhpcyBpc1xuICAvLyB0ZW1wb3JhcnkgYW5kIHdpbGwgZ28gYXdheSBpbiB0aGUgbmVhciBmdXR1cmUuXG4gIHNlbGYuX3NvY2tldFVybCA9IHNvY2tldC51cmw7XG5cbiAgLy8gQWxsb3cgdGVzdHMgdG8gZGlzYWJsZSByZXNwb25kaW5nIHRvIHBpbmdzLlxuICBzZWxmLl9yZXNwb25kVG9QaW5ncyA9IG9wdGlvbnMucmVzcG9uZFRvUGluZ3M7XG5cbiAgLy8gVGhpcyBvYmplY3QgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIHNlc3Npb24uIEluIHRoZSBwdWJsaWNcbiAgLy8gQVBJLCBpdCBpcyBjYWxsZWQgdGhlIGBjb25uZWN0aW9uYCBvYmplY3QuICBJbnRlcm5hbGx5IHdlIGNhbGwgaXRcbiAgLy8gYSBgY29ubmVjdGlvbkhhbmRsZWAgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICBzZWxmLmNvbm5lY3Rpb25IYW5kbGUgPSB7XG4gICAgaWQ6IHNlbGYuaWQsXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICB9LFxuICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIChmbikge1xuICAgICAgdmFyIGNiID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmbiwgXCJjb25uZWN0aW9uIG9uQ2xvc2UgY2FsbGJhY2tcIik7XG4gICAgICBpZiAoc2VsZi5pblF1ZXVlKSB7XG4gICAgICAgIHNlbGYuX2Nsb3NlQ2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBjbG9zZWQsIGNhbGwgdGhlIGNhbGxiYWNrLlxuICAgICAgICBNZXRlb3IuZGVmZXIoY2IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xpZW50QWRkcmVzczogc2VsZi5fY2xpZW50QWRkcmVzcygpLFxuICAgIGh0dHBIZWFkZXJzOiBzZWxmLnNvY2tldC5oZWFkZXJzXG4gIH07XG5cbiAgc2VsZi5zZW5kKHsgbXNnOiAnY29ubmVjdGVkJywgc2Vzc2lvbjogc2VsZi5pZCB9KTtcblxuICAvLyBPbiBpbml0aWFsIGNvbm5lY3QsIHNwaW4gdXAgYWxsIHRoZSB1bml2ZXJzYWwgcHVibGlzaGVycy5cbiAgRmliZXIoZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gIH0pLnJ1bigpO1xuXG4gIGlmICh2ZXJzaW9uICE9PSAncHJlMScgJiYgb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCAhPT0gMCkge1xuICAgIC8vIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBsb3cgbGV2ZWwgdGltZW91dCBiZWNhdXNlIHdlIGhhdmUgaGVhcnRiZWF0aW5nLlxuICAgIHNvY2tldC5zZXRXZWJzb2NrZXRUaW1lb3V0KDApO1xuXG4gICAgc2VsZi5oZWFydGJlYXQgPSBuZXcgRERQQ29tbW9uLkhlYXJ0YmVhdCh7XG4gICAgICBoZWFydGJlYXRJbnRlcnZhbDogb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbCxcbiAgICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCxcbiAgICAgIG9uVGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgc2VuZFBpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5zZW5kKHttc2c6ICdwaW5nJ30pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYuaGVhcnRiZWF0LnN0YXJ0KCk7XG4gIH1cblxuICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU2Vzc2lvbi5wcm90b3R5cGUsIHtcblxuICBzZW5kUmVhZHk6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25JZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlYWR5XCIsIHN1YnM6IHN1YnNjcmlwdGlvbklkc30pO1xuICAgIGVsc2Uge1xuICAgICAgXy5lYWNoKHN1YnNjcmlwdGlvbklkcywgZnVuY3Rpb24gKHN1YnNjcmlwdGlvbklkKSB7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeS5wdXNoKHN1YnNjcmlwdGlvbklkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzZW5kQWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNTZW5kaW5nKVxuICAgICAgc2VsZi5zZW5kKHttc2c6IFwiYWRkZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZCwgZmllbGRzOiBmaWVsZHN9KTtcbiAgfSxcblxuICBzZW5kQ2hhbmdlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChfLmlzRW1wdHkoZmllbGRzKSlcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChzZWxmLl9pc1NlbmRpbmcpIHtcbiAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgIG1zZzogXCJjaGFuZ2VkXCIsXG4gICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2VuZFJlbW92ZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzU2VuZGluZylcbiAgICAgIHNlbGYuc2VuZCh7bXNnOiBcInJlbW92ZWRcIiwgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWUsIGlkOiBpZH0pO1xuICB9LFxuXG4gIGdldFNlbmRDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGVkOiBfLmJpbmQoc2VsZi5zZW5kQWRkZWQsIHNlbGYpLFxuICAgICAgY2hhbmdlZDogXy5iaW5kKHNlbGYuc2VuZENoYW5nZWQsIHNlbGYpLFxuICAgICAgcmVtb3ZlZDogXy5iaW5kKHNlbGYuc2VuZFJlbW92ZWQsIHNlbGYpXG4gICAgfTtcbiAgfSxcblxuICBnZXRDb2xsZWN0aW9uVmlldzogZnVuY3Rpb24gKGNvbGxlY3Rpb25OYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXQgPSBzZWxmLmNvbGxlY3Rpb25WaWV3cy5nZXQoY29sbGVjdGlvbk5hbWUpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICByZXQgPSBuZXcgU2Vzc2lvbkNvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0U2VuZENhbGxiYWNrcygpKTtcbiAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLnNldChjb2xsZWN0aW9uTmFtZSwgcmV0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBhZGRlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkLCBmaWVsZHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHZpZXcgPSBzZWxmLmdldENvbGxlY3Rpb25WaWV3KGNvbGxlY3Rpb25OYW1lKTtcbiAgICB2aWV3LmFkZGVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgcmVtb3ZlZDogZnVuY3Rpb24gKHN1YnNjcmlwdGlvbkhhbmRsZSwgY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5yZW1vdmVkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQpO1xuICAgIGlmICh2aWV3LmlzRW1wdHkoKSkge1xuICAgICAgIHNlbGYuY29sbGVjdGlvblZpZXdzLmRlbGV0ZShjb2xsZWN0aW9uTmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChzdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2aWV3ID0gc2VsZi5nZXRDb2xsZWN0aW9uVmlldyhjb2xsZWN0aW9uTmFtZSk7XG4gICAgdmlldy5jaGFuZ2VkKHN1YnNjcmlwdGlvbkhhbmRsZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgc3RhcnRVbml2ZXJzYWxTdWJzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIE1ha2UgYSBzaGFsbG93IGNvcHkgb2YgdGhlIHNldCBvZiB1bml2ZXJzYWwgaGFuZGxlcnMgYW5kIHN0YXJ0IHRoZW0uIElmXG4gICAgLy8gYWRkaXRpb25hbCB1bml2ZXJzYWwgcHVibGlzaGVycyBzdGFydCB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoZW0gKGR1ZSB0b1xuICAgIC8vIHlpZWxkaW5nKSwgdGhleSB3aWxsIHJ1biBzZXBhcmF0ZWx5IGFzIHBhcnQgb2YgU2VydmVyLnB1Ymxpc2guXG4gICAgdmFyIGhhbmRsZXJzID0gXy5jbG9uZShzZWxmLnNlcnZlci51bml2ZXJzYWxfcHVibGlzaF9oYW5kbGVycyk7XG4gICAgXy5lYWNoKGhhbmRsZXJzLCBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gRGVzdHJveSB0aGlzIHNlc3Npb24gYW5kIHVucmVnaXN0ZXIgaXQgYXQgdGhlIHNlcnZlci5cbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBEZXN0cm95IHRoaXMgc2Vzc2lvbiwgZXZlbiBpZiBpdCdzIG5vdCByZWdpc3RlcmVkIGF0IHRoZVxuICAgIC8vIHNlcnZlci4gU3RvcCBhbGwgcHJvY2Vzc2luZyBhbmQgdGVhciBldmVyeXRoaW5nIGRvd24uIElmIGEgc29ja2V0XG4gICAgLy8gd2FzIGF0dGFjaGVkLCBjbG9zZSBpdC5cblxuICAgIC8vIEFscmVhZHkgZGVzdHJveWVkLlxuICAgIGlmICghIHNlbGYuaW5RdWV1ZSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIERyb3AgdGhlIG1lcmdlIGJveCBkYXRhIGltbWVkaWF0ZWx5LlxuICAgIHNlbGYuaW5RdWV1ZSA9IG51bGw7XG4gICAgc2VsZi5jb2xsZWN0aW9uVmlld3MgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAoc2VsZi5oZWFydGJlYXQpIHtcbiAgICAgIHNlbGYuaGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIHNlbGYuaGVhcnRiZWF0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5zb2NrZXQpIHtcbiAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCk7XG4gICAgICBzZWxmLnNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgXCJsaXZlZGF0YVwiLCBcInNlc3Npb25zXCIsIC0xKTtcblxuICAgIE1ldGVvci5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdG9wIGNhbGxiYWNrcyBjYW4geWllbGQsIHNvIHdlIGRlZmVyIHRoaXMgb24gY2xvc2UuXG4gICAgICAvLyBzdWIuX2lzRGVhY3RpdmF0ZWQoKSBkZXRlY3RzIHRoYXQgd2Ugc2V0IGluUXVldWUgdG8gbnVsbCBhbmRcbiAgICAgIC8vIHRyZWF0cyBpdCBhcyBzZW1pLWRlYWN0aXZhdGVkIChpdCB3aWxsIGlnbm9yZSBpbmNvbWluZyBjYWxsYmFja3MsIGV0YykuXG4gICAgICBzZWxmLl9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9ucygpO1xuXG4gICAgICAvLyBEZWZlciBjYWxsaW5nIHRoZSBjbG9zZSBjYWxsYmFja3MsIHNvIHRoYXQgdGhlIGNhbGxlciBjbG9zaW5nXG4gICAgICAvLyB0aGUgc2Vzc2lvbiBpc24ndCB3YWl0aW5nIGZvciBhbGwgdGhlIGNhbGxiYWNrcyB0byBjb21wbGV0ZS5cbiAgICAgIF8uZWFjaChzZWxmLl9jbG9zZUNhbGxiYWNrcywgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFVucmVnaXN0ZXIgdGhlIHNlc3Npb24uXG4gICAgc2VsZi5zZXJ2ZXIuX3JlbW92ZVNlc3Npb24oc2VsZik7XG4gIH0sXG5cbiAgLy8gU2VuZCBhIG1lc3NhZ2UgKGRvaW5nIG5vdGhpbmcgaWYgbm8gc29ja2V0IGlzIGNvbm5lY3RlZCByaWdodCBub3cuKVxuICAvLyBJdCBzaG91bGQgYmUgYSBKU09OIG9iamVjdCAoaXQgd2lsbCBiZSBzdHJpbmdpZmllZC4pXG4gIHNlbmQ6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuc29ja2V0KSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFNlbnRERFApXG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJTZW50IEREUFwiLCBERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgICAgc2VsZi5zb2NrZXQuc2VuZChERFBDb21tb24uc3RyaW5naWZ5RERQKG1zZykpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZW5kIGEgY29ubmVjdGlvbiBlcnJvci5cbiAgc2VuZEVycm9yOiBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBtc2cgPSB7bXNnOiAnZXJyb3InLCByZWFzb246IHJlYXNvbn07XG4gICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICBtc2cub2ZmZW5kaW5nTWVzc2FnZSA9IG9mZmVuZGluZ01lc3NhZ2U7XG4gICAgc2VsZi5zZW5kKG1zZyk7XG4gIH0sXG5cbiAgLy8gUHJvY2VzcyAnbXNnJyBhcyBhbiBpbmNvbWluZyBtZXNzYWdlLiAoQnV0IGFzIGEgZ3VhcmQgYWdhaW5zdFxuICAvLyByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJlY29ubmVjdGlvbiwgaWdub3JlIHRoZSBtZXNzYWdlIGlmXG4gIC8vICdzb2NrZXQnIGlzIG5vdCB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBzb2NrZXQuKVxuICAvL1xuICAvLyBXZSBydW4gdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCBvbmUgYXQgYSB0aW1lLCBpbiB0aGUgb3JkZXJcbiAgLy8gZ2l2ZW4gYnkgdGhlIGNsaWVudC4gVGhlIG1lc3NhZ2UgaGFuZGxlciBpcyBwYXNzZWQgYW4gaWRlbXBvdGVudFxuICAvLyBmdW5jdGlvbiAndW5ibG9jaycgd2hpY2ggaXQgbWF5IGNhbGwgdG8gYWxsb3cgb3RoZXIgbWVzc2FnZXMgdG9cbiAgLy8gYmVnaW4gcnVubmluZyBpbiBwYXJhbGxlbCBpbiBhbm90aGVyIGZpYmVyIChmb3IgZXhhbXBsZSwgYSBtZXRob2RcbiAgLy8gdGhhdCB3YW50cyB0byB5aWVsZC4pIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseSB1bmJsb2NrZWRcbiAgLy8gd2hlbiBpdCByZXR1cm5zLlxuICAvL1xuICAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgaGF2ZSB0byAndG90YWxseSBvcmRlcicgdGhlIG1lc3NhZ2VzIGluIHRoaXNcbiAgLy8gd2F5LCBidXQgaXQncyB0aGUgZWFzaWVzdCB0aGluZyB0aGF0J3MgY29ycmVjdC4gKHVuc3ViIG5lZWRzIHRvXG4gIC8vIGJlIG9yZGVyZWQgYWdhaW5zdCBzdWIsIG1ldGhvZHMgbmVlZCB0byBiZSBvcmRlcmVkIGFnYWluc3QgZWFjaFxuICAvLyBvdGhlci4pXG4gIHByb2Nlc3NNZXNzYWdlOiBmdW5jdGlvbiAobXNnX2luKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5pblF1ZXVlKSAvLyB3ZSBoYXZlIGJlZW4gZGVzdHJveWVkLlxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gUmVzcG9uZCB0byBwaW5nIGFuZCBwb25nIG1lc3NhZ2VzIGltbWVkaWF0ZWx5IHdpdGhvdXQgcXVldWluZy5cbiAgICAvLyBJZiB0aGUgbmVnb3RpYXRlZCBERFAgdmVyc2lvbiBpcyBcInByZTFcIiB3aGljaCBkaWRuJ3Qgc3VwcG9ydFxuICAgIC8vIHBpbmdzLCBwcmVzZXJ2ZSB0aGUgXCJwcmUxXCIgYmVoYXZpb3Igb2YgcmVzcG9uZGluZyB3aXRoIGEgXCJiYWRcbiAgICAvLyByZXF1ZXN0XCIgZm9yIHRoZSB1bmtub3duIG1lc3NhZ2VzLlxuICAgIC8vXG4gICAgLy8gRmliZXJzIGFyZSBuZWVkZWQgYmVjYXVzZSBoZWFydGJlYXQgdXNlcyBNZXRlb3Iuc2V0VGltZW91dCwgd2hpY2hcbiAgICAvLyBuZWVkcyBhIEZpYmVyLiBXZSBjb3VsZCBhY3R1YWxseSB1c2UgcmVndWxhciBzZXRUaW1lb3V0IGFuZCBhdm9pZFxuICAgIC8vIHRoZXNlIG5ldyBmaWJlcnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8ganVzdCBtYWtlIGV2ZXJ5dGhpbmcgdXNlXG4gICAgLy8gTWV0ZW9yLnNldFRpbWVvdXQgYW5kIG5vdCB0aGluayB0b28gaGFyZC5cbiAgICAvL1xuICAgIC8vIEFueSBtZXNzYWdlIGNvdW50cyBhcyByZWNlaXZpbmcgYSBwb25nLCBhcyBpdCBkZW1vbnN0cmF0ZXMgdGhhdFxuICAgIC8vIHRoZSBjbGllbnQgaXMgc3RpbGwgYWxpdmUuXG4gICAgaWYgKHNlbGYuaGVhcnRiZWF0KSB7XG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuaGVhcnRiZWF0Lm1lc3NhZ2VSZWNlaXZlZCgpO1xuICAgICAgfSkucnVuKCk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwaW5nJykge1xuICAgICAgaWYgKHNlbGYuX3Jlc3BvbmRUb1BpbmdzKVxuICAgICAgICBzZWxmLnNlbmQoe21zZzogXCJwb25nXCIsIGlkOiBtc2dfaW4uaWR9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGYudmVyc2lvbiAhPT0gJ3ByZTEnICYmIG1zZ19pbi5tc2cgPT09ICdwb25nJykge1xuICAgICAgLy8gU2luY2UgZXZlcnl0aGluZyBpcyBhIHBvbmcsIG5vdGhpbmcgdG8gZG9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmluUXVldWUucHVzaChtc2dfaW4pO1xuICAgIGlmIChzZWxmLndvcmtlclJ1bm5pbmcpXG4gICAgICByZXR1cm47XG4gICAgc2VsZi53b3JrZXJSdW5uaW5nID0gdHJ1ZTtcblxuICAgIHZhciBwcm9jZXNzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBtc2cgPSBzZWxmLmluUXVldWUgJiYgc2VsZi5pblF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAoIW1zZykge1xuICAgICAgICBzZWxmLndvcmtlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBibG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWJsb2NrZWQpXG4gICAgICAgICAgICByZXR1cm47IC8vIGlkZW1wb3RlbnRcbiAgICAgICAgICBibG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgcHJvY2Vzc05leHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZWxmLnNlcnZlci5vbk1lc3NhZ2VIb29rLmVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2sobXNnLCBzZWxmKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF8uaGFzKHNlbGYucHJvdG9jb2xfaGFuZGxlcnMsIG1zZy5tc2cpKVxuICAgICAgICAgIHNlbGYucHJvdG9jb2xfaGFuZGxlcnNbbXNnLm1zZ10uY2FsbChzZWxmLCBtc2csIHVuYmxvY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc2VsZi5zZW5kRXJyb3IoJ0JhZCByZXF1ZXN0JywgbXNnKTtcbiAgICAgICAgdW5ibG9jaygpOyAvLyBpbiBjYXNlIHRoZSBoYW5kbGVyIGRpZG4ndCBhbHJlYWR5IGRvIGl0XG4gICAgICB9KS5ydW4oKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzc05leHQoKTtcbiAgfSxcblxuICBwcm90b2NvbF9oYW5kbGVyczoge1xuICAgIHN1YjogZnVuY3Rpb24gKG1zZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyByZWplY3QgbWFsZm9ybWVkIG1lc3NhZ2VzXG4gICAgICBpZiAodHlwZW9mIChtc2cuaWQpICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgdHlwZW9mIChtc2cubmFtZSkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSkge1xuICAgICAgICBzZWxmLnNlbmRFcnJvcihcIk1hbGZvcm1lZCBzdWJzY3JpcHRpb25cIiwgbXNnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNlbGYuc2VydmVyLnB1Ymxpc2hfaGFuZGxlcnNbbXNnLm5hbWVdKSB7XG4gICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgbXNnOiAnbm9zdWInLCBpZDogbXNnLmlkLFxuICAgICAgICAgIGVycm9yOiBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYFN1YnNjcmlwdGlvbiAnJHttc2cubmFtZX0nIG5vdCBmb3VuZGApfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX25hbWVkU3Vicy5oYXMobXNnLmlkKSlcbiAgICAgICAgLy8gc3VicyBhcmUgaWRlbXBvdGVudCwgb3IgcmF0aGVyLCB0aGV5IGFyZSBpZ25vcmVkIGlmIGEgc3ViXG4gICAgICAgIC8vIHdpdGggdGhhdCBpZCBhbHJlYWR5IGV4aXN0cy4gdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nXG4gICAgICAgIC8vIHJlY29ubmVjdC5cbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAvLyBYWFggSXQnZCBiZSBtdWNoIGJldHRlciBpZiB3ZSBoYWQgZ2VuZXJpYyBob29rcyB3aGVyZSBhbnkgcGFja2FnZSBjYW5cbiAgICAgIC8vIGhvb2sgaW50byBzdWJzY3JpcHRpb24gaGFuZGxpbmcsIGJ1dCBpbiB0aGUgbWVhbiB3aGlsZSB3ZSBzcGVjaWFsIGNhc2VcbiAgICAgIC8vIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZS4gVGhpcyBpcyBhbHNvIGRvbmUgZm9yIHdlYWsgcmVxdWlyZW1lbnRzIHRvXG4gICAgICAvLyBhZGQgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSBpbiBjYXNlIHdlIGRvbid0IGhhdmUgQWNjb3VudHMuIEFcbiAgICAgIC8vIHVzZXIgdHJ5aW5nIHRvIHVzZSB0aGUgZGRwLXJhdGUtbGltaXRlciBtdXN0IGV4cGxpY2l0bHkgcmVxdWlyZSBpdC5cbiAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgdmFyIEREUFJhdGVMaW1pdGVyID0gUGFja2FnZVsnZGRwLXJhdGUtbGltaXRlciddLkREUFJhdGVMaW1pdGVyO1xuICAgICAgICB2YXIgcmF0ZUxpbWl0ZXJJbnB1dCA9IHtcbiAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgIGNsaWVudEFkZHJlc3M6IHNlbGYuY29ubmVjdGlvbkhhbmRsZS5jbGllbnRBZGRyZXNzLFxuICAgICAgICAgIHR5cGU6IFwic3Vic2NyaXB0aW9uXCIsXG4gICAgICAgICAgbmFtZTogbXNnLm5hbWUsXG4gICAgICAgICAgY29ubmVjdGlvbklkOiBzZWxmLmlkXG4gICAgICAgIH07XG5cbiAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgdmFyIHJhdGVMaW1pdFJlc3VsdCA9IEREUFJhdGVMaW1pdGVyLl9jaGVjayhyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgIHNlbGYuc2VuZCh7XG4gICAgICAgICAgICBtc2c6ICdub3N1YicsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICBlcnJvcjogbmV3IE1ldGVvci5FcnJvcihcbiAgICAgICAgICAgICAgJ3Rvby1tYW55LXJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLnNlcnZlci5wdWJsaXNoX2hhbmRsZXJzW21zZy5uYW1lXTtcblxuICAgICAgc2VsZi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlciwgbXNnLmlkLCBtc2cucGFyYW1zLCBtc2cubmFtZSk7XG5cbiAgICB9LFxuXG4gICAgdW5zdWI6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgc2VsZi5fc3RvcFN1YnNjcmlwdGlvbihtc2cuaWQpO1xuICAgIH0sXG5cbiAgICBtZXRob2Q6IGZ1bmN0aW9uIChtc2csIHVuYmxvY2spIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gcmVqZWN0IG1hbGZvcm1lZCBtZXNzYWdlc1xuICAgICAgLy8gRm9yIG5vdywgd2Ugc2lsZW50bHkgaWdub3JlIHVua25vd24gYXR0cmlidXRlcyxcbiAgICAgIC8vIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgaWYgKHR5cGVvZiAobXNnLmlkKSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgIHR5cGVvZiAobXNnLm1ldGhvZCkgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAoKCdwYXJhbXMnIGluIG1zZykgJiYgIShtc2cucGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB8fFxuICAgICAgICAgICgoJ3JhbmRvbVNlZWQnIGluIG1zZykgJiYgKHR5cGVvZiBtc2cucmFuZG9tU2VlZCAhPT0gXCJzdHJpbmdcIikpKSB7XG4gICAgICAgIHNlbGYuc2VuZEVycm9yKFwiTWFsZm9ybWVkIG1ldGhvZCBpbnZvY2F0aW9uXCIsIG1zZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhbmRvbVNlZWQgPSBtc2cucmFuZG9tU2VlZCB8fCBudWxsO1xuXG4gICAgICAvLyBzZXQgdXAgdG8gbWFyayB0aGUgbWV0aG9kIGFzIHNhdGlzZmllZCBvbmNlIGFsbCBvYnNlcnZlcnNcbiAgICAgIC8vIChhbmQgc3Vic2NyaXB0aW9ucykgaGF2ZSByZWFjdGVkIHRvIGFueSB3cml0ZXMgdGhhdCB3ZXJlXG4gICAgICAvLyBkb25lLlxuICAgICAgdmFyIGZlbmNlID0gbmV3IEREUFNlcnZlci5fV3JpdGVGZW5jZTtcbiAgICAgIGZlbmNlLm9uQWxsQ29tbWl0dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmV0aXJlIHRoZSBmZW5jZSBzbyB0aGF0IGZ1dHVyZSB3cml0ZXMgYXJlIGFsbG93ZWQuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBjYWxsYmFja3MgbGlrZSB0aW1lcnMgYXJlIGZyZWUgdG8gdXNlXG4gICAgICAgIC8vIHRoZSBmZW5jZSwgYW5kIGlmIHRoZXkgZmlyZSBiZWZvcmUgaXQncyBhcm1lZCAoZm9yXG4gICAgICAgIC8vIGV4YW1wbGUsIGJlY2F1c2UgdGhlIG1ldGhvZCB3YWl0cyBmb3IgdGhlbSkgdGhlaXJcbiAgICAgICAgLy8gd3JpdGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZlbmNlLlxuICAgICAgICBmZW5jZS5yZXRpcmUoKTtcbiAgICAgICAgc2VsZi5zZW5kKHtcbiAgICAgICAgICBtc2c6ICd1cGRhdGVkJywgbWV0aG9kczogW21zZy5pZF19KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmaW5kIHRoZSBoYW5kbGVyXG4gICAgICB2YXIgaGFuZGxlciA9IHNlbGYuc2VydmVyLm1ldGhvZF9oYW5kbGVyc1ttc2cubWV0aG9kXTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBzZWxmLnNlbmQoe1xuICAgICAgICAgIG1zZzogJ3Jlc3VsdCcsIGlkOiBtc2cuaWQsXG4gICAgICAgICAgZXJyb3I6IG5ldyBNZXRlb3IuRXJyb3IoNDA0LCBgTWV0aG9kICcke21zZy5tZXRob2R9JyBub3QgZm91bmRgKX0pO1xuICAgICAgICBmZW5jZS5hcm0oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIHNlbGYuX3NldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGludm9jYXRpb24gPSBuZXcgRERQQ29tbW9uLk1ldGhvZEludm9jYXRpb24oe1xuICAgICAgICBpc1NpbXVsYXRpb246IGZhbHNlLFxuICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICBzZXRVc2VySWQ6IHNldFVzZXJJZCxcbiAgICAgICAgdW5ibG9jazogdW5ibG9jayxcbiAgICAgICAgY29ubmVjdGlvbjogc2VsZi5jb25uZWN0aW9uSGFuZGxlLFxuICAgICAgICByYW5kb21TZWVkOiByYW5kb21TZWVkXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gWFhYIEl0J2QgYmUgYmV0dGVyIGlmIHdlIGNvdWxkIGhvb2sgaW50byBtZXRob2QgaGFuZGxlcnMgYmV0dGVyIGJ1dFxuICAgICAgICAvLyBmb3Igbm93LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZHAtcmF0ZS1saW1pdGVyIGV4aXN0cyBzaW5jZSB3ZVxuICAgICAgICAvLyBoYXZlIGEgd2VhayByZXF1aXJlbWVudCBmb3IgdGhlIGRkcC1yYXRlLWxpbWl0ZXIgcGFja2FnZSB0byBiZSBhZGRlZFxuICAgICAgICAvLyB0byBvdXIgYXBwbGljYXRpb24uXG4gICAgICAgIGlmIChQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10pIHtcbiAgICAgICAgICB2YXIgRERQUmF0ZUxpbWl0ZXIgPSBQYWNrYWdlWydkZHAtcmF0ZS1saW1pdGVyJ10uRERQUmF0ZUxpbWl0ZXI7XG4gICAgICAgICAgdmFyIHJhdGVMaW1pdGVySW5wdXQgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHNlbGYudXNlcklkLFxuICAgICAgICAgICAgY2xpZW50QWRkcmVzczogc2VsZi5jb25uZWN0aW9uSGFuZGxlLmNsaWVudEFkZHJlc3MsXG4gICAgICAgICAgICB0eXBlOiBcIm1ldGhvZFwiLFxuICAgICAgICAgICAgbmFtZTogbXNnLm1ldGhvZCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogc2VsZi5pZFxuICAgICAgICAgIH07XG4gICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuX2luY3JlbWVudChyYXRlTGltaXRlcklucHV0KTtcbiAgICAgICAgICB2YXIgcmF0ZUxpbWl0UmVzdWx0ID0gRERQUmF0ZUxpbWl0ZXIuX2NoZWNrKHJhdGVMaW1pdGVySW5wdXQpXG4gICAgICAgICAgaWYgKCFyYXRlTGltaXRSZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgICAgICAgIFwidG9vLW1hbnktcmVxdWVzdHNcIixcbiAgICAgICAgICAgICAgRERQUmF0ZUxpbWl0ZXIuZ2V0RXJyb3JNZXNzYWdlKHJhdGVMaW1pdFJlc3VsdCksXG4gICAgICAgICAgICAgIHt0aW1lVG9SZXNldDogcmF0ZUxpbWl0UmVzdWx0LnRpbWVUb1Jlc2V0fVxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlLndpdGhWYWx1ZShcbiAgICAgICAgICBmZW5jZSxcbiAgICAgICAgICAoKSA9PiBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZShcbiAgICAgICAgICAgIGludm9jYXRpb24sXG4gICAgICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgICAgIGhhbmRsZXIsIGludm9jYXRpb24sIG1zZy5wYXJhbXMsXG4gICAgICAgICAgICAgIFwiY2FsbCB0byAnXCIgKyBtc2cubWV0aG9kICsgXCInXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICAgICAgZmVuY2UuYXJtKCk7XG4gICAgICAgIHVuYmxvY2soKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgbXNnOiBcInJlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkXG4gICAgICB9O1xuXG4gICAgICBwcm9taXNlLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGF5bG9hZC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZW5kKHBheWxvYWQpO1xuICAgICAgfSwgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgcGF5bG9hZC5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgICBleGNlcHRpb24sXG4gICAgICAgICAgYHdoaWxlIGludm9raW5nIG1ldGhvZCAnJHttc2cubWV0aG9kfSdgXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYuc2VuZChwYXlsb2FkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfZWFjaFN1YjogZnVuY3Rpb24gKGYpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5fbmFtZWRTdWJzLmZvckVhY2goZik7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5mb3JFYWNoKGYpO1xuICB9LFxuXG4gIF9kaWZmQ29sbGVjdGlvblZpZXdzOiBmdW5jdGlvbiAoYmVmb3JlQ1ZzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIERpZmZTZXF1ZW5jZS5kaWZmTWFwcyhiZWZvcmVDVnMsIHNlbGYuY29sbGVjdGlvblZpZXdzLCB7XG4gICAgICBib3RoOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRpZmYobGVmdFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICByaWdodE9ubHk6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgICByaWdodFZhbHVlLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2NWaWV3LCBpZCkge1xuICAgICAgICAgIHNlbGYuc2VuZEFkZGVkKGNvbGxlY3Rpb25OYW1lLCBpZCwgZG9jVmlldy5nZXRGaWVsZHMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGxlZnRPbmx5OiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGxlZnRWYWx1ZSkge1xuICAgICAgICBsZWZ0VmFsdWUuZG9jdW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvYywgaWQpIHtcbiAgICAgICAgICBzZWxmLnNlbmRSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIC8vIFNldHMgdGhlIGN1cnJlbnQgdXNlciBpZCBpbiBhbGwgYXBwcm9wcmlhdGUgY29udGV4dHMgYW5kIHJlcnVuc1xuICAvLyBhbGwgc3Vic2NyaXB0aW9uc1xuICBfc2V0VXNlcklkOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodXNlcklkICE9PSBudWxsICYmIHR5cGVvZiB1c2VySWQgIT09IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXRVc2VySWQgbXVzdCBiZSBjYWxsZWQgb24gc3RyaW5nIG9yIG51bGwsIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHVzZXJJZCk7XG5cbiAgICAvLyBQcmV2ZW50IG5ld2x5LWNyZWF0ZWQgdW5pdmVyc2FsIHN1YnNjcmlwdGlvbnMgZnJvbSBiZWluZyBhZGRlZCB0byBvdXJcbiAgICAvLyBzZXNzaW9uOyB0aGV5IHdpbGwgYmUgZm91bmQgYmVsb3cgd2hlbiB3ZSBjYWxsIHN0YXJ0VW5pdmVyc2FsU3Vicy5cbiAgICAvL1xuICAgIC8vIChXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG5hbWVkIHN1YnNjcmlwdGlvbnMsIGJlY2F1c2Ugd2Ugb25seSBhZGRcbiAgICAvLyB0aGVtIHdoZW4gd2UgcHJvY2VzcyBhICdzdWInIG1lc3NhZ2UuIFdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBhXG4gICAgLy8gJ21ldGhvZCcgbWVzc2FnZSwgYW5kIHRoZSBtZXRob2QgZGlkIG5vdCB1bmJsb2NrLCBiZWNhdXNlIGl0IGlzIGlsbGVnYWxcbiAgICAvLyB0byBjYWxsIHNldFVzZXJJZCBhZnRlciB1bmJsb2NrLiBUaHVzIHdlIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgYWRkaW5nIGFcbiAgICAvLyBuZXcgbmFtZWQgc3Vic2NyaXB0aW9uLilcbiAgICBzZWxmLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzID0gdHJ1ZTtcblxuICAgIC8vIFByZXZlbnQgY3VycmVudCBzdWJzIGZyb20gdXBkYXRpbmcgb3VyIGNvbGxlY3Rpb25WaWV3cyBhbmQgY2FsbCB0aGVpclxuICAgIC8vIHN0b3AgY2FsbGJhY2tzLiBUaGlzIG1heSB5aWVsZC5cbiAgICBzZWxmLl9lYWNoU3ViKGZ1bmN0aW9uIChzdWIpIHtcbiAgICAgIHN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gQWxsIHN1YnMgc2hvdWxkIG5vdyBiZSBkZWFjdGl2YXRlZC4gU3RvcCBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQsXG4gICAgLy8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIHB1Ymxpc2hlZCBjb2xsZWN0aW9ucywgcmVzZXQgdG8gYW4gZW1wdHkgdmlldywgYW5kXG4gICAgLy8gdXBkYXRlIHRoZSB1c2VySWQuXG4gICAgc2VsZi5faXNTZW5kaW5nID0gZmFsc2U7XG4gICAgdmFyIGJlZm9yZUNWcyA9IHNlbGYuY29sbGVjdGlvblZpZXdzO1xuICAgIHNlbGYuY29sbGVjdGlvblZpZXdzID0gbmV3IE1hcCgpO1xuICAgIHNlbGYudXNlcklkID0gdXNlcklkO1xuXG4gICAgLy8gX3NldFVzZXJJZCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSBhIE1ldGVvciBtZXRob2Qgd2l0aFxuICAgIC8vIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24gc2V0LiBCdXQgRERQLl9DdXJyZW50TWV0aG9kSW52b2NhdGlvbiBpcyBub3RcbiAgICAvLyBleHBlY3RlZCB0byBiZSBzZXQgaW5zaWRlIGEgcHVibGlzaCBmdW5jdGlvbiwgc28gd2UgdGVtcG9yYXJ5IHVuc2V0IGl0LlxuICAgIC8vIEluc2lkZSBhIHB1Ymxpc2ggZnVuY3Rpb24gRERQLl9DdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uIGlzIHNldC5cbiAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uLndpdGhWYWx1ZSh1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNhdmUgdGhlIG9sZCBuYW1lZCBzdWJzLCBhbmQgcmVzZXQgdG8gaGF2aW5nIG5vIHN1YnNjcmlwdGlvbnMuXG4gICAgICB2YXIgb2xkTmFtZWRTdWJzID0gc2VsZi5fbmFtZWRTdWJzO1xuICAgICAgc2VsZi5fbmFtZWRTdWJzID0gbmV3IE1hcCgpO1xuICAgICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuXG4gICAgICBvbGROYW1lZFN1YnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViLCBzdWJzY3JpcHRpb25JZCkge1xuICAgICAgICB2YXIgbmV3U3ViID0gc3ViLl9yZWNyZWF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuc2V0KHN1YnNjcmlwdGlvbklkLCBuZXdTdWIpO1xuICAgICAgICAvLyBuYjogaWYgdGhlIGhhbmRsZXIgdGhyb3dzIG9yIGNhbGxzIHRoaXMuZXJyb3IoKSwgaXQgd2lsbCBpbiBmYWN0XG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IHNlbmQgaXRzICdub3N1YicuIFRoaXMgaXMgT0ssIHRob3VnaC5cbiAgICAgICAgbmV3U3ViLl9ydW5IYW5kbGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3cgbmV3bHktY3JlYXRlZCB1bml2ZXJzYWwgc3VicyB0byBiZSBzdGFydGVkIG9uIG91ciBjb25uZWN0aW9uIGluXG4gICAgICAvLyBwYXJhbGxlbCB3aXRoIHRoZSBvbmVzIHdlJ3JlIHNwaW5uaW5nIHVwIGhlcmUsIGFuZCBzcGluIHVwIHVuaXZlcnNhbFxuICAgICAgLy8gc3Vicy5cbiAgICAgIHNlbGYuX2RvbnRTdGFydE5ld1VuaXZlcnNhbFN1YnMgPSBmYWxzZTtcbiAgICAgIHNlbGYuc3RhcnRVbml2ZXJzYWxTdWJzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBzZW5kaW5nIG1lc3NhZ2VzIGFnYWluLCBiZWdpbm5pbmcgd2l0aCB0aGUgZGlmZiBmcm9tIHRoZSBwcmV2aW91c1xuICAgIC8vIHN0YXRlIG9mIHRoZSB3b3JsZCB0byB0aGUgY3VycmVudCBzdGF0ZS4gTm8geWllbGRzIGFyZSBhbGxvd2VkIGR1cmluZ1xuICAgIC8vIHRoaXMgZGlmZiwgc28gdGhhdCBvdGhlciBjaGFuZ2VzIGNhbm5vdCBpbnRlcmxlYXZlLlxuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2lzU2VuZGluZyA9IHRydWU7XG4gICAgICBzZWxmLl9kaWZmQ29sbGVjdGlvblZpZXdzKGJlZm9yZUNWcyk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShzZWxmLl9wZW5kaW5nUmVhZHkpKSB7XG4gICAgICAgIHNlbGYuc2VuZFJlYWR5KHNlbGYuX3BlbmRpbmdSZWFkeSk7XG4gICAgICAgIHNlbGYuX3BlbmRpbmdSZWFkeSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIF9zdGFydFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc3ViID0gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYsIGhhbmRsZXIsIHN1YklkLCBwYXJhbXMsIG5hbWUpO1xuICAgIGlmIChzdWJJZClcbiAgICAgIHNlbGYuX25hbWVkU3Vicy5zZXQoc3ViSWQsIHN1Yik7XG4gICAgZWxzZVxuICAgICAgc2VsZi5fdW5pdmVyc2FsU3Vicy5wdXNoKHN1Yik7XG5cbiAgICBzdWIuX3J1bkhhbmRsZXIoKTtcbiAgfSxcblxuICAvLyB0ZWFyIGRvd24gc3BlY2lmaWVkIHN1YnNjcmlwdGlvblxuICBfc3RvcFN1YnNjcmlwdGlvbjogZnVuY3Rpb24gKHN1YklkLCBlcnJvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBzdWJOYW1lID0gbnVsbDtcbiAgICBpZiAoc3ViSWQpIHtcbiAgICAgIHZhciBtYXliZVN1YiA9IHNlbGYuX25hbWVkU3Vicy5nZXQoc3ViSWQpO1xuICAgICAgaWYgKG1heWJlU3ViKSB7XG4gICAgICAgIHN1Yk5hbWUgPSBtYXliZVN1Yi5fbmFtZTtcbiAgICAgICAgbWF5YmVTdWIuX3JlbW92ZUFsbERvY3VtZW50cygpO1xuICAgICAgICBtYXliZVN1Yi5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICBzZWxmLl9uYW1lZFN1YnMuZGVsZXRlKHN1YklkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2UgPSB7bXNnOiAnbm9zdWInLCBpZDogc3ViSWR9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXNwb25zZS5lcnJvciA9IHdyYXBJbnRlcm5hbEV4Y2VwdGlvbihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHN1Yk5hbWUgPyAoXCJmcm9tIHN1YiBcIiArIHN1Yk5hbWUgKyBcIiBpZCBcIiArIHN1YklkKVxuICAgICAgICAgIDogKFwiZnJvbSBzdWIgaWQgXCIgKyBzdWJJZCkpO1xuICAgIH1cblxuICAgIHNlbGYuc2VuZChyZXNwb25zZSk7XG4gIH0sXG5cbiAgLy8gdGVhciBkb3duIGFsbCBzdWJzY3JpcHRpb25zLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBzZW5kIHJlbW92ZWQgb3Igbm9zdWJcbiAgLy8gbWVzc2FnZXMsIHNpbmNlIHdlIGFzc3VtZSB0aGUgY2xpZW50IGlzIGdvbmUuXG4gIF9kZWFjdGl2YXRlQWxsU3Vic2NyaXB0aW9uczogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHNlbGYuX25hbWVkU3Vicy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIsIGlkKSB7XG4gICAgICBzdWIuX2RlYWN0aXZhdGUoKTtcbiAgICB9KTtcbiAgICBzZWxmLl9uYW1lZFN1YnMgPSBuZXcgTWFwKCk7XG5cbiAgICBzZWxmLl91bml2ZXJzYWxTdWJzLmZvckVhY2goZnVuY3Rpb24gKHN1Yikge1xuICAgICAgc3ViLl9kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG4gICAgc2VsZi5fdW5pdmVyc2FsU3VicyA9IFtdO1xuICB9LFxuXG4gIC8vIERldGVybWluZSB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MsIGJhc2VkIG9uIHRoZVxuICAvLyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXByZXNlbnRpbmcgaG93IG1hbnlcbiAgLy8gcHJveGllcyB0aGUgc2VydmVyIGlzIGJlaGluZC5cbiAgX2NsaWVudEFkZHJlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBGb3IgdGhlIHJlcG9ydGVkIGNsaWVudCBhZGRyZXNzIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgY29ycmVjdCxcbiAgICAvLyB0aGUgZGV2ZWxvcGVyIG11c3Qgc2V0IHRoZSBIVFRQX0ZPUldBUkRFRF9DT1VOVCBlbnZpcm9ubWVudFxuICAgIC8vIHZhcmlhYmxlIHRvIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgaG9wcyB0aGV5XG4gICAgLy8gZXhwZWN0IGluIHRoZSBgeC1mb3J3YXJkZWQtZm9yYCBoZWFkZXIuIEUuZy4sIHNldCB0byBcIjFcIiBpZiB0aGVcbiAgICAvLyBzZXJ2ZXIgaXMgYmVoaW5kIG9uZSBwcm94eS5cbiAgICAvL1xuICAgIC8vIFRoaXMgY291bGQgYmUgY29tcHV0ZWQgb25jZSBhdCBzdGFydHVwIGluc3RlYWQgb2YgZXZlcnkgdGltZS5cbiAgICB2YXIgaHR0cEZvcndhcmRlZENvdW50ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnZbJ0hUVFBfRk9SV0FSREVEX0NPVU5UJ10pIHx8IDA7XG5cbiAgICBpZiAoaHR0cEZvcndhcmRlZENvdW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LnJlbW90ZUFkZHJlc3M7XG5cbiAgICB2YXIgZm9yd2FyZGVkRm9yID0gc2VsZi5zb2NrZXQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWZvclwiXTtcbiAgICBpZiAoISBfLmlzU3RyaW5nKGZvcndhcmRlZEZvcikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3J3YXJkZWRGb3IgPSBmb3J3YXJkZWRGb3IudHJpbSgpLnNwbGl0KC9cXHMqLFxccyovKTtcblxuICAgIC8vIFR5cGljYWxseSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGB4LWZvcndhcmRlZC1mb3JgIGhlYWRlciBpc1xuICAgIC8vIHRoZSBvcmlnaW5hbCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgY29ubmVjdGluZyB0byB0aGUgZmlyc3RcbiAgICAvLyBwcm94eS4gIEhvd2V2ZXIsIHRoZSBlbmQgdXNlciBjYW4gZWFzaWx5IHNwb29mIHRoZSBoZWFkZXIsIGluXG4gICAgLy8gd2hpY2ggY2FzZSB0aGUgZmlyc3QgdmFsdWUocykgd2lsbCBiZSB0aGUgZmFrZSBJUCBhZGRyZXNzIGZyb21cbiAgICAvLyB0aGUgdXNlciBwcmV0ZW5kaW5nIHRvIGJlIGEgcHJveHkgcmVwb3J0aW5nIHRoZSBvcmlnaW5hbCBJUFxuICAgIC8vIGFkZHJlc3MgdmFsdWUuICBCeSBjb3VudGluZyBIVFRQX0ZPUldBUkRFRF9DT1VOVCBiYWNrIGZyb20gdGhlXG4gICAgLy8gZW5kIG9mIHRoZSBsaXN0LCB3ZSBlbnN1cmUgdGhhdCB3ZSBnZXQgdGhlIElQIGFkZHJlc3MgYmVpbmdcbiAgICAvLyByZXBvcnRlZCBieSAqb3VyKiBmaXJzdCBwcm94eS5cblxuICAgIGlmIChodHRwRm9yd2FyZGVkQ291bnQgPCAwIHx8IGh0dHBGb3J3YXJkZWRDb3VudCA+IGZvcndhcmRlZEZvci5sZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBmb3J3YXJkZWRGb3JbZm9yd2FyZGVkRm9yLmxlbmd0aCAtIGh0dHBGb3J3YXJkZWRDb3VudF07XG4gIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogU3Vic2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIGN0b3IgZm9yIGEgc3ViIGhhbmRsZTogdGhlIGlucHV0IHRvIGVhY2ggcHVibGlzaCBmdW5jdGlvblxuXG4vLyBJbnN0YW5jZSBuYW1lIGlzIHRoaXMgYmVjYXVzZSBpdCdzIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgdGhpcyBpbnNpZGUgYVxuLy8gcHVibGlzaFxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgc2VydmVyJ3Mgc2lkZSBvZiBhIHN1YnNjcmlwdGlvblxuICogQGNsYXNzIFN1YnNjcmlwdGlvblxuICogQGluc3RhbmNlTmFtZSB0aGlzXG4gKiBAc2hvd0luc3RhbmNlTmFtZSB0cnVlXG4gKi9cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoXG4gICAgc2Vzc2lvbiwgaGFuZGxlciwgc3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgbmFtZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuX3Nlc3Npb24gPSBzZXNzaW9uOyAvLyB0eXBlIGlzIFNlc3Npb25cblxuICAvKipcbiAgICogQHN1bW1hcnkgQWNjZXNzIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gVGhlIGluY29taW5nIFtjb25uZWN0aW9uXSgjbWV0ZW9yX29uY29ubmVjdGlvbikgZm9yIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBuYW1lICBjb25uZWN0aW9uXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBzZWxmLmNvbm5lY3Rpb24gPSBzZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGU7IC8vIHB1YmxpYyBBUEkgb2JqZWN0XG5cbiAgc2VsZi5faGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgLy8gbXkgc3Vic2NyaXB0aW9uIElEIChnZW5lcmF0ZWQgYnkgY2xpZW50LCB1bmRlZmluZWQgZm9yIHVuaXZlcnNhbCBzdWJzKS5cbiAgc2VsZi5fc3Vic2NyaXB0aW9uSWQgPSBzdWJzY3JpcHRpb25JZDtcbiAgLy8gdW5kZWZpbmVkIGZvciB1bml2ZXJzYWwgc3Vic1xuICBzZWxmLl9uYW1lID0gbmFtZTtcblxuICBzZWxmLl9wYXJhbXMgPSBwYXJhbXMgfHwgW107XG5cbiAgLy8gT25seSBuYW1lZCBzdWJzY3JpcHRpb25zIGhhdmUgSURzLCBidXQgd2UgbmVlZCBzb21lIHNvcnQgb2Ygc3RyaW5nXG4gIC8vIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhbGwgc3Vic2NyaXB0aW9ucyBpbnNpZGVcbiAgLy8gU2Vzc2lvbkRvY3VtZW50Vmlld3MuIFdlIHVzZSB0aGlzIHN1YnNjcmlwdGlvbkhhbmRsZSBmb3IgdGhhdC5cbiAgaWYgKHNlbGYuX3N1YnNjcmlwdGlvbklkKSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ04nICsgc2VsZi5fc3Vic2NyaXB0aW9uSWQ7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlID0gJ1UnICsgUmFuZG9tLmlkKCk7XG4gIH1cblxuICAvLyBoYXMgX2RlYWN0aXZhdGUgYmVlbiBjYWxsZWQ/XG4gIHNlbGYuX2RlYWN0aXZhdGVkID0gZmFsc2U7XG5cbiAgLy8gc3RvcCBjYWxsYmFja3MgdG8gZy9jIHRoaXMgc3ViLiAgY2FsbGVkIHcvIHplcm8gYXJndW1lbnRzLlxuICBzZWxmLl9zdG9wQ2FsbGJhY2tzID0gW107XG5cbiAgLy8gdGhlIHNldCBvZiAoY29sbGVjdGlvbiwgZG9jdW1lbnRpZCkgdGhhdCB0aGlzIHN1YnNjcmlwdGlvbiBoYXNcbiAgLy8gYW4gb3BpbmlvbiBhYm91dFxuICBzZWxmLl9kb2N1bWVudHMgPSBuZXcgTWFwKCk7XG5cbiAgLy8gcmVtZW1iZXIgaWYgd2UgYXJlIHJlYWR5LlxuICBzZWxmLl9yZWFkeSA9IGZhbHNlO1xuXG4gIC8vIFBhcnQgb2YgdGhlIHB1YmxpYyBBUEk6IHRoZSB1c2VyIG9mIHRoaXMgc3ViLlxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBY2Nlc3MgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiBUaGUgaWQgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyLCBvciBgbnVsbGAgaWYgbm8gdXNlciBpcyBsb2dnZWQgaW4uXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAbmFtZSAgdXNlcklkXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgc2VsZi51c2VySWQgPSBzZXNzaW9uLnVzZXJJZDtcblxuICAvLyBGb3Igbm93LCB0aGUgaWQgZmlsdGVyIGlzIGdvaW5nIHRvIGRlZmF1bHQgdG9cbiAgLy8gdGhlIHRvL2Zyb20gRERQIG1ldGhvZHMgb24gTW9uZ29JRCwgdG9cbiAgLy8gc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCBtb25nby9taW5pbW9uZ28gT2JqZWN0SWRzLlxuXG4gIC8vIExhdGVyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1ha2UgdGhpcyBiZSBcInJhd1wiXG4gIC8vIGlmIHlvdSB3YW50IHRvIHB1Ymxpc2ggYSBjb2xsZWN0aW9uIHRoYXQgeW91IGtub3dcbiAgLy8ganVzdCBoYXMgc3RyaW5ncyBmb3Iga2V5cyBhbmQgbm8gZnVubnkgYnVzaW5lc3MsIHRvXG4gIC8vIGEgZGRwIGNvbnN1bWVyIHRoYXQgaXNuJ3QgbWluaW1vbmdvXG5cbiAgc2VsZi5faWRGaWx0ZXIgPSB7XG4gICAgaWRTdHJpbmdpZnk6IE1vbmdvSUQuaWRTdHJpbmdpZnksXG4gICAgaWRQYXJzZTogTW9uZ29JRC5pZFBhcnNlXG4gIH07XG5cbiAgUGFja2FnZVsnZmFjdHMtYmFzZSddICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgIFwibGl2ZWRhdGFcIiwgXCJzdWJzY3JpcHRpb25zXCIsIDEpO1xufTtcblxuXy5leHRlbmQoU3Vic2NyaXB0aW9uLnByb3RvdHlwZSwge1xuICBfcnVuSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuICAgIC8vIFhYWCBzaG91bGQgd2UgdW5ibG9jaygpIGhlcmU/IEVpdGhlciBiZWZvcmUgcnVubmluZyB0aGUgcHVibGlzaFxuICAgIC8vIGZ1bmN0aW9uLCBvciBiZWZvcmUgcnVubmluZyBfcHVibGlzaEN1cnNvci5cbiAgICAvL1xuICAgIC8vIFJpZ2h0IG5vdywgZWFjaCBwdWJsaXNoIGZ1bmN0aW9uIGJsb2NrcyBhbGwgZnV0dXJlIHB1Ymxpc2hlcyBhbmRcbiAgICAvLyBtZXRob2RzIHdhaXRpbmcgb24gZGF0YSBmcm9tIE1vbmdvIChvciB3aGF0ZXZlciBlbHNlIHRoZSBmdW5jdGlvblxuICAgIC8vIGJsb2NrcyBvbikuIFRoaXMgcHJvYmFibHkgc2xvd3MgcGFnZSBsb2FkIGluIGNvbW1vbiBjYXNlcy5cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IEREUC5fQ3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi53aXRoVmFsdWUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgICgpID0+IG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyhcbiAgICAgICAgICBzZWxmLl9oYW5kbGVyLCBzZWxmLCBFSlNPTi5jbG9uZShzZWxmLl9wYXJhbXMpLFxuICAgICAgICAgIC8vIEl0J3MgT0sgdGhhdCB0aGlzIHdvdWxkIGxvb2sgd2VpcmQgZm9yIHVuaXZlcnNhbCBzdWJzY3JpcHRpb25zLFxuICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBoYXZlIG5vIGFyZ3VtZW50cyBzbyB0aGVyZSBjYW4gbmV2ZXIgYmUgYW5cbiAgICAgICAgICAvLyBhdWRpdC1hcmd1bWVudC1jaGVja3MgZmFpbHVyZS5cbiAgICAgICAgICBcInB1Ymxpc2hlciAnXCIgKyBzZWxmLl9uYW1lICsgXCInXCJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpZCB0aGUgaGFuZGxlciBjYWxsIHRoaXMuZXJyb3Igb3IgdGhpcy5zdG9wP1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWxmLl9wdWJsaXNoSGFuZGxlclJlc3VsdChyZXMpO1xuICB9LFxuXG4gIF9wdWJsaXNoSGFuZGxlclJlc3VsdDogZnVuY3Rpb24gKHJlcykge1xuICAgIC8vIFNQRUNJQUwgQ0FTRTogSW5zdGVhZCBvZiB3cml0aW5nIHRoZWlyIG93biBjYWxsYmFja3MgdGhhdCBpbnZva2VcbiAgICAvLyB0aGlzLmFkZGVkL2NoYW5nZWQvcmVhZHkvZXRjLCB0aGUgdXNlciBjYW4ganVzdCByZXR1cm4gYSBjb2xsZWN0aW9uXG4gICAgLy8gY3Vyc29yIG9yIGFycmF5IG9mIGN1cnNvcnMgZnJvbSB0aGUgcHVibGlzaCBmdW5jdGlvbjsgd2UgY2FsbCB0aGVpclxuICAgIC8vIF9wdWJsaXNoQ3Vyc29yIG1ldGhvZCB3aGljaCBzdGFydHMgb2JzZXJ2aW5nIHRoZSBjdXJzb3IgYW5kIHB1Ymxpc2hlcyB0aGVcbiAgICAvLyByZXN1bHRzLiBOb3RlIHRoYXQgX3B1Ymxpc2hDdXJzb3IgZG9lcyBOT1QgY2FsbCByZWFkeSgpLlxuICAgIC8vXG4gICAgLy8gWFhYIFRoaXMgdXNlcyBhbiB1bmRvY3VtZW50ZWQgaW50ZXJmYWNlIHdoaWNoIG9ubHkgdGhlIE1vbmdvIGN1cnNvclxuICAgIC8vIGludGVyZmFjZSBwdWJsaXNoZXMuIFNob3VsZCB3ZSBtYWtlIHRoaXMgaW50ZXJmYWNlIHB1YmxpYyBhbmQgZW5jb3VyYWdlXG4gICAgLy8gdXNlcnMgdG8gaW1wbGVtZW50IGl0IHRoZW1zZWx2ZXM/IEFyZ3VhYmx5LCBpdCdzIHVubmVjZXNzYXJ5OyB1c2VycyBjYW5cbiAgICAvLyBhbHJlYWR5IHdyaXRlIHRoZWlyIG93biBmdW5jdGlvbnMgbGlrZVxuICAgIC8vICAgdmFyIHB1Ymxpc2hNeVJlYWN0aXZlVGhpbmd5ID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICAvLyAgICAgTWV0ZW9yLnB1Ymxpc2gobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICAgIHZhciByZWFjdGl2ZVRoaW5neSA9IGhhbmRsZXIoKTtcbiAgICAvLyAgICAgICByZWFjdGl2ZVRoaW5neS5wdWJsaXNoTWUoKTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpc0N1cnNvciA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYyAmJiBjLl9wdWJsaXNoQ3Vyc29yO1xuICAgIH07XG4gICAgaWYgKGlzQ3Vyc29yKHJlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcy5fcHVibGlzaEN1cnNvcihzZWxmKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gX3B1Ymxpc2hDdXJzb3Igb25seSByZXR1cm5zIGFmdGVyIHRoZSBpbml0aWFsIGFkZGVkIGNhbGxiYWNrcyBoYXZlIHJ1bi5cbiAgICAgIC8vIG1hcmsgc3Vic2NyaXB0aW9uIGFzIHJlYWR5LlxuICAgICAgc2VsZi5yZWFkeSgpO1xuICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHJlcykpIHtcbiAgICAgIC8vIGNoZWNrIGFsbCB0aGUgZWxlbWVudHMgYXJlIGN1cnNvcnNcbiAgICAgIGlmICghIF8uYWxsKHJlcywgaXNDdXJzb3IpKSB7XG4gICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwiUHVibGlzaCBmdW5jdGlvbiByZXR1cm5lZCBhbiBhcnJheSBvZiBub24tQ3Vyc29yc1wiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgZHVwbGljYXRlIGNvbGxlY3Rpb24gbmFtZXNcbiAgICAgIC8vIFhYWCB3ZSBzaG91bGQgc3VwcG9ydCBvdmVybGFwcGluZyBjdXJzb3JzLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHRoZVxuICAgICAgLy8gbWVyZ2UgYm94IHRvIGFsbG93IG92ZXJsYXAgd2l0aGluIGEgc3Vic2NyaXB0aW9uXG4gICAgICB2YXIgY29sbGVjdGlvbk5hbWVzID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY29sbGVjdGlvbk5hbWUgPSByZXNbaV0uX2dldENvbGxlY3Rpb25OYW1lKCk7XG4gICAgICAgIGlmIChfLmhhcyhjb2xsZWN0aW9uTmFtZXMsIGNvbGxlY3Rpb25OYW1lKSkge1xuICAgICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFxuICAgICAgICAgICAgXCJQdWJsaXNoIGZ1bmN0aW9uIHJldHVybmVkIG11bHRpcGxlIGN1cnNvcnMgZm9yIGNvbGxlY3Rpb24gXCIgK1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uTmFtZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0aW9uTmFtZXNbY29sbGVjdGlvbk5hbWVdID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIF8uZWFjaChyZXMsIGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgICAgICBjdXIuX3B1Ymxpc2hDdXJzb3Ioc2VsZik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxmLnJlYWR5KCk7XG4gICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgIC8vIHRydXRoeSB2YWx1ZXMgb3RoZXIgdGhhbiBjdXJzb3JzIG9yIGFycmF5cyBhcmUgcHJvYmFibHkgYVxuICAgICAgLy8gdXNlciBtaXN0YWtlIChwb3NzaWJsZSByZXR1cm5pbmcgYSBNb25nbyBkb2N1bWVudCB2aWEsIHNheSxcbiAgICAgIC8vIGBjb2xsLmZpbmRPbmUoKWApLlxuICAgICAgc2VsZi5lcnJvcihuZXcgRXJyb3IoXCJQdWJsaXNoIGZ1bmN0aW9uIGNhbiBvbmx5IHJldHVybiBhIEN1cnNvciBvciBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBcImFuIGFycmF5IG9mIEN1cnNvcnNcIikpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaGlzIGNhbGxzIGFsbCBzdG9wIGNhbGxiYWNrcyBhbmQgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSB1cGRhdGluZyBhbnlcbiAgLy8gU2Vzc2lvbkNvbGxlY3Rpb25WaWV3cyBmdXJ0aGVyLiBJdCdzIHVzZWQgd2hlbiB0aGUgdXNlciB1bnN1YnNjcmliZXMgb3JcbiAgLy8gZGlzY29ubmVjdHMsIGFzIHdlbGwgYXMgZHVyaW5nIHNldFVzZXJJZCByZS1ydW5zLiBJdCBkb2VzICpOT1QqIHNlbmRcbiAgLy8gcmVtb3ZlZCBtZXNzYWdlcyBmb3IgdGhlIHB1Ymxpc2hlZCBvYmplY3RzOyBpZiB0aGF0IGlzIG5lY2Vzc2FyeSwgY2FsbFxuICAvLyBfcmVtb3ZlQWxsRG9jdW1lbnRzIGZpcnN0LlxuICBfZGVhY3RpdmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9kZWFjdGl2YXRlZClcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9kZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgc2VsZi5fY2FsbFN0b3BDYWxsYmFja3MoKTtcbiAgICBQYWNrYWdlWydmYWN0cy1iYXNlJ10gJiYgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICBcImxpdmVkYXRhXCIsIFwic3Vic2NyaXB0aW9uc1wiLCAtMSk7XG4gIH0sXG5cbiAgX2NhbGxTdG9wQ2FsbGJhY2tzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8vIHRlbGwgbGlzdGVuZXJzLCBzbyB0aGV5IGNhbiBjbGVhbiB1cFxuICAgIHZhciBjYWxsYmFja3MgPSBzZWxmLl9zdG9wQ2FsbGJhY2tzO1xuICAgIHNlbGYuX3N0b3BDYWxsYmFja3MgPSBbXTtcbiAgICBfLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gU2VuZCByZW1vdmUgbWVzc2FnZXMgZm9yIGV2ZXJ5IGRvY3VtZW50LlxuICBfcmVtb3ZlQWxsRG9jdW1lbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xsZWN0aW9uRG9jcywgY29sbGVjdGlvbk5hbWUpIHtcbiAgICAgICAgY29sbGVjdGlvbkRvY3MuZm9yRWFjaChmdW5jdGlvbiAoc3RySWQpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHNlbGYuX2lkRmlsdGVyLmlkUGFyc2Uoc3RySWQpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgbmV3IFN1YnNjcmlwdGlvbiBmb3IgdGhlIHNhbWUgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lXG4gIC8vIGluaXRpYWwgY3JlYXRpb24gcGFyYW1ldGVycy4gVGhpcyBpc24ndCBhIGNsb25lOiBpdCBkb2Vzbid0IGhhdmVcbiAgLy8gdGhlIHNhbWUgX2RvY3VtZW50cyBjYWNoZSwgc3RvcHBlZCBzdGF0ZSBvciBjYWxsYmFja3M7IG1heSBoYXZlIGFcbiAgLy8gZGlmZmVyZW50IF9zdWJzY3JpcHRpb25IYW5kbGUsIGFuZCBnZXRzIGl0cyB1c2VySWQgZnJvbSB0aGVcbiAgLy8gc2Vzc2lvbiwgbm90IGZyb20gdGhpcyBvYmplY3QuXG4gIF9yZWNyZWF0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihcbiAgICAgIHNlbGYuX3Nlc3Npb24sIHNlbGYuX2hhbmRsZXIsIHNlbGYuX3N1YnNjcmlwdGlvbklkLCBzZWxmLl9wYXJhbXMsXG4gICAgICBzZWxmLl9uYW1lKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBTdG9wcyB0aGlzIGNsaWVudCdzIHN1YnNjcmlwdGlvbiwgdHJpZ2dlcmluZyBhIGNhbGwgb24gdGhlIGNsaWVudCB0byB0aGUgYG9uU3RvcGAgY2FsbGJhY2sgcGFzc2VkIHRvIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LiBJZiBgZXJyb3JgIGlzIG5vdCBhIFtgTWV0ZW9yLkVycm9yYF0oI21ldGVvcl9lcnJvciksIGl0IHdpbGwgYmUgW3Nhbml0aXplZF0oI21ldGVvcl9lcnJvcikuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgVGhlIGVycm9yIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkLCBlcnJvcik7XG4gIH0sXG5cbiAgLy8gTm90ZSB0aGF0IHdoaWxlIG91ciBERFAgY2xpZW50IHdpbGwgbm90aWNlIHRoYXQgeW91J3ZlIGNhbGxlZCBzdG9wKCkgb24gdGhlXG4gIC8vIHNlcnZlciAoYW5kIGNsZWFuIHVwIGl0cyBfc3Vic2NyaXB0aW9ucyB0YWJsZSkgd2UgZG9uJ3QgYWN0dWFsbHkgcHJvdmlkZSBhXG4gIC8vIG1lY2hhbmlzbSBmb3IgYW4gYXBwIHRvIG5vdGljZSB0aGlzICh0aGUgc3Vic2NyaWJlIG9uRXJyb3IgY2FsbGJhY2sgb25seVxuICAvLyB0cmlnZ2VycyBpZiB0aGVyZSBpcyBhbiBlcnJvcikuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgU3RvcHMgdGhpcyBjbGllbnQncyBzdWJzY3JpcHRpb24gYW5kIGludm9rZXMgdGhlIGNsaWVudCdzIGBvblN0b3BgIGNhbGxiYWNrIHdpdGggbm8gZXJyb3IuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICovXG4gIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuX2lzRGVhY3RpdmF0ZWQoKSlcbiAgICAgIHJldHVybjtcbiAgICBzZWxmLl9zZXNzaW9uLl9zdG9wU3Vic2NyaXB0aW9uKHNlbGYuX3N1YnNjcmlwdGlvbklkKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIHN0b3BwZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG9uU3RvcDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNhbGxiYWNrID0gTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChjYWxsYmFjaywgJ29uU3RvcCBjYWxsYmFjaycsIHNlbGYpO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICBjYWxsYmFjaygpO1xuICAgIGVsc2VcbiAgICAgIHNlbGYuX3N0b3BDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHN1YiBoYXMgYmVlbiBkZWFjdGl2YXRlZCwgKk9SKiBpZiB0aGUgc2Vzc2lvbiB3YXNcbiAgLy8gZGVzdHJveWVkIGJ1dCB0aGUgZGVmZXJyZWQgY2FsbCB0byBfZGVhY3RpdmF0ZUFsbFN1YnNjcmlwdGlvbnMgaGFzbid0XG4gIC8vIGhhcHBlbmVkIHlldC5cbiAgX2lzRGVhY3RpdmF0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuX2RlYWN0aXZhdGVkIHx8IHNlbGYuX3Nlc3Npb24uaW5RdWV1ZSA9PT0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcmVjb3JkIHNldC5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAbWVtYmVyT2YgU3Vic2NyaXB0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29sbGVjdGlvbiBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBUaGUgbmV3IGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgbmV3IGRvY3VtZW50LiAgSWYgYF9pZGAgaXMgcHJlc2VudCBpdCBpcyBpZ25vcmVkLlxuICAgKi9cbiAgYWRkZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIGxldCBpZHMgPSBzZWxmLl9kb2N1bWVudHMuZ2V0KGNvbGxlY3Rpb25OYW1lKTtcbiAgICBpZiAoaWRzID09IG51bGwpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoKTtcbiAgICAgIHNlbGYuX2RvY3VtZW50cy5zZXQoY29sbGVjdGlvbk5hbWUsIGlkcyk7XG4gICAgfVxuICAgIGlkcy5hZGQoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uYWRkZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhbGwgaW5zaWRlIHRoZSBwdWJsaXNoIGZ1bmN0aW9uLiAgSW5mb3JtcyB0aGUgc3Vic2NyaWJlciB0aGF0IGEgZG9jdW1lbnQgaW4gdGhlIHJlY29yZCBzZXQgaGFzIGJlZW4gbW9kaWZpZWQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIFRoZSBjaGFuZ2VkIGRvY3VtZW50J3MgSUQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZHMgVGhlIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgdGhhdCBoYXZlIGNoYW5nZWQsIHRvZ2V0aGVyIHdpdGggdGhlaXIgbmV3IHZhbHVlcy4gIElmIGEgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gYGZpZWxkc2AgaXQgd2FzIGxlZnQgdW5jaGFuZ2VkOyBpZiBpdCBpcyBwcmVzZW50IGluIGBmaWVsZHNgIGFuZCBoYXMgYSB2YWx1ZSBvZiBgdW5kZWZpbmVkYCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudC4gIElmIGBfaWRgIGlzIHByZXNlbnQgaXQgaXMgaWdub3JlZC5cbiAgICovXG4gIGNoYW5nZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uTmFtZSwgaWQsIGZpZWxkcykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlkID0gc2VsZi5faWRGaWx0ZXIuaWRTdHJpbmdpZnkoaWQpO1xuICAgIHNlbGYuX3Nlc3Npb24uY2hhbmdlZChzZWxmLl9zdWJzY3JpcHRpb25IYW5kbGUsIGNvbGxlY3Rpb25OYW1lLCBpZCwgZmllbGRzKTtcbiAgfSxcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2FsbCBpbnNpZGUgdGhlIHB1Ymxpc2ggZnVuY3Rpb24uICBJbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHRoYXQgYSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlY29yZCBzZXQuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIFN1YnNjcmlwdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbGxlY3Rpb24gVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbk5hbWUsIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLl9pc0RlYWN0aXZhdGVkKCkpXG4gICAgICByZXR1cm47XG4gICAgaWQgPSBzZWxmLl9pZEZpbHRlci5pZFN0cmluZ2lmeShpZCk7XG4gICAgLy8gV2UgZG9uJ3QgYm90aGVyIHRvIGRlbGV0ZSBzZXRzIG9mIHRoaW5ncyBpbiBhIGNvbGxlY3Rpb24gaWYgdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpcyBlbXB0eS4gIEl0IGNvdWxkIGJyZWFrIF9yZW1vdmVBbGxEb2N1bWVudHMuXG4gICAgc2VsZi5fZG9jdW1lbnRzLmdldChjb2xsZWN0aW9uTmFtZSkuZGVsZXRlKGlkKTtcbiAgICBzZWxmLl9zZXNzaW9uLnJlbW92ZWQoc2VsZi5fc3Vic2NyaXB0aW9uSGFuZGxlLCBjb2xsZWN0aW9uTmFtZSwgaWQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSB0aGUgcHVibGlzaCBmdW5jdGlvbi4gIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgdGhhdCBhbiBpbml0aWFsLCBjb21wbGV0ZSBzbmFwc2hvdCBvZiB0aGUgcmVjb3JkIHNldCBoYXMgYmVlbiBzZW50LiAgVGhpcyB3aWxsIHRyaWdnZXIgYSBjYWxsIG9uIHRoZSBjbGllbnQgdG8gdGhlIGBvblJlYWR5YCBjYWxsYmFjayBwYXNzZWQgdG8gIFtgTWV0ZW9yLnN1YnNjcmliZWBdKCNtZXRlb3Jfc3Vic2NyaWJlKSwgaWYgYW55LlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBTdWJzY3JpcHRpb25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICByZWFkeTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5faXNEZWFjdGl2YXRlZCgpKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghc2VsZi5fc3Vic2NyaXB0aW9uSWQpXG4gICAgICByZXR1cm47ICAvLyB1bm5lY2Vzc2FyeSBidXQgaWdub3JlZCBmb3IgdW5pdmVyc2FsIHN1YlxuICAgIGlmICghc2VsZi5fcmVhZHkpIHtcbiAgICAgIHNlbGYuX3Nlc3Npb24uc2VuZFJlYWR5KFtzZWxmLl9zdWJzY3JpcHRpb25JZF0pO1xuICAgICAgc2VsZi5fcmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBTZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuU2VydmVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIFRoZSBkZWZhdWx0IGhlYXJ0YmVhdCBpbnRlcnZhbCBpcyAzMCBzZWNvbmRzIG9uIHRoZSBzZXJ2ZXIgYW5kIDM1XG4gIC8vIHNlY29uZHMgb24gdGhlIGNsaWVudC4gIFNpbmNlIHRoZSBjbGllbnQgZG9lc24ndCBuZWVkIHRvIHNlbmQgYVxuICAvLyBwaW5nIGFzIGxvbmcgYXMgaXQgaXMgcmVjZWl2aW5nIHBpbmdzLCB0aGlzIG1lYW5zIHRoYXQgcGluZ3NcbiAgLy8gbm9ybWFsbHkgZ28gZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuXG4gIC8vXG4gIC8vIE5vdGU6IFRyb3Bvc3BoZXJlIGRlcGVuZHMgb24gdGhlIGFiaWxpdHkgdG8gbXV0YXRlXG4gIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgc2VsZi5vcHRpb25zID0gXy5kZWZhdWx0cyhvcHRpb25zIHx8IHt9LCB7XG4gICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDE1MDAwLFxuICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IDE1MDAwLFxuICAgIC8vIEZvciB0ZXN0aW5nLCBhbGxvdyByZXNwb25kaW5nIHRvIHBpbmdzIHRvIGJlIGRpc2FibGVkLlxuICAgIHJlc3BvbmRUb1BpbmdzOiB0cnVlXG4gIH0pO1xuXG4gIC8vIE1hcCBvZiBjYWxsYmFja3MgdG8gY2FsbCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gY29tZXMgaW4gdG8gdGhlXG4gIC8vIHNlcnZlciBhbmQgY29tcGxldGVzIEREUCB2ZXJzaW9uIG5lZ290aWF0aW9uLiBVc2UgYW4gb2JqZWN0IGluc3RlYWRcbiAgLy8gb2YgYW4gYXJyYXkgc28gd2UgY2FuIHNhZmVseSByZW1vdmUgb25lIGZyb20gdGhlIGxpc3Qgd2hpbGVcbiAgLy8gaXRlcmF0aW5nIG92ZXIgaXQuXG4gIHNlbGYub25Db25uZWN0aW9uSG9vayA9IG5ldyBIb29rKHtcbiAgICBkZWJ1Z1ByaW50RXhjZXB0aW9uczogXCJvbkNvbm5lY3Rpb24gY2FsbGJhY2tcIlxuICB9KTtcblxuICAvLyBNYXAgb2YgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGNvbWVzIGluLlxuICBzZWxmLm9uTWVzc2FnZUhvb2sgPSBuZXcgSG9vayh7XG4gICAgZGVidWdQcmludEV4Y2VwdGlvbnM6IFwib25NZXNzYWdlIGNhbGxiYWNrXCJcbiAgfSk7XG5cbiAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzID0ge307XG4gIHNlbGYudW5pdmVyc2FsX3B1Ymxpc2hfaGFuZGxlcnMgPSBbXTtcblxuICBzZWxmLm1ldGhvZF9oYW5kbGVycyA9IHt9O1xuXG4gIHNlbGYuc2Vzc2lvbnMgPSBuZXcgTWFwKCk7IC8vIG1hcCBmcm9tIGlkIHRvIHNlc3Npb25cblxuICBzZWxmLnN0cmVhbV9zZXJ2ZXIgPSBuZXcgU3RyZWFtU2VydmVyO1xuXG4gIHNlbGYuc3RyZWFtX3NlcnZlci5yZWdpc3RlcihmdW5jdGlvbiAoc29ja2V0KSB7XG4gICAgLy8gc29ja2V0IGltcGxlbWVudHMgdGhlIFNvY2tKU0Nvbm5lY3Rpb24gaW50ZXJmYWNlXG4gICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uID0gbnVsbDtcblxuICAgIHZhciBzZW5kRXJyb3IgPSBmdW5jdGlvbiAocmVhc29uLCBvZmZlbmRpbmdNZXNzYWdlKSB7XG4gICAgICB2YXIgbXNnID0ge21zZzogJ2Vycm9yJywgcmVhc29uOiByZWFzb259O1xuICAgICAgaWYgKG9mZmVuZGluZ01lc3NhZ2UpXG4gICAgICAgIG1zZy5vZmZlbmRpbmdNZXNzYWdlID0gb2ZmZW5kaW5nTWVzc2FnZTtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAobXNnKSk7XG4gICAgfTtcblxuICAgIHNvY2tldC5vbignZGF0YScsIGZ1bmN0aW9uIChyYXdfbXNnKSB7XG4gICAgICBpZiAoTWV0ZW9yLl9wcmludFJlY2VpdmVkRERQKSB7XG4gICAgICAgIE1ldGVvci5fZGVidWcoXCJSZWNlaXZlZCBERFBcIiwgcmF3X21zZyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBtc2cgPSBERFBDb21tb24ucGFyc2VERFAocmF3X21zZyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNlbmRFcnJvcignUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zZyA9PT0gbnVsbCB8fCAhbXNnLm1zZykge1xuICAgICAgICAgIHNlbmRFcnJvcignQmFkIHJlcXVlc3QnLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtc2cubXNnID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgICAgICBzZW5kRXJyb3IoXCJBbHJlYWR5IGNvbm5lY3RlZFwiLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBGaWJlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9oYW5kbGVDb25uZWN0KHNvY2tldCwgbXNnKTtcbiAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNvY2tldC5fbWV0ZW9yU2Vzc2lvbikge1xuICAgICAgICAgIHNlbmRFcnJvcignTXVzdCBjb25uZWN0IGZpcnN0JywgbXNnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Ll9tZXRlb3JTZXNzaW9uLnByb2Nlc3NNZXNzYWdlKG1zZyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFhYWCBwcmludCBzdGFjayBuaWNlbHlcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIkludGVybmFsIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIG1lc3NhZ2VcIiwgbXNnLCBlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc29ja2V0Ll9tZXRlb3JTZXNzaW9uKSB7XG4gICAgICAgIEZpYmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzb2NrZXQuX21ldGVvclNlc3Npb24uY2xvc2UoKTtcbiAgICAgICAgfSkucnVuKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuXy5leHRlbmQoU2VydmVyLnByb3RvdHlwZSwge1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIG1hZGUgdG8gdGhlIHNlcnZlci5cbiAgICogQGxvY3VzIFNlcnZlclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgbmV3IEREUCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG9uQ29ubmVjdGlvbjogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLm9uQ29ubmVjdGlvbkhvb2sucmVnaXN0ZXIoZm4pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IEREUCBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBuZXcgRERQIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKi9cbiAgb25NZXNzYWdlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYub25NZXNzYWdlSG9vay5yZWdpc3Rlcihmbik7XG4gIH0sXG5cbiAgX2hhbmRsZUNvbm5lY3Q6IGZ1bmN0aW9uIChzb2NrZXQsIG1zZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFRoZSBjb25uZWN0IG1lc3NhZ2UgbXVzdCBzcGVjaWZ5IGEgdmVyc2lvbiBhbmQgYW4gYXJyYXkgb2Ygc3VwcG9ydGVkXG4gICAgLy8gdmVyc2lvbnMsIGFuZCBpdCBtdXN0IGNsYWltIHRvIHN1cHBvcnQgd2hhdCBpdCBpcyBwcm9wb3NpbmcuXG4gICAgaWYgKCEodHlwZW9mIChtc2cudmVyc2lvbikgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgXy5pc0FycmF5KG1zZy5zdXBwb3J0KSAmJlxuICAgICAgICAgIF8uYWxsKG1zZy5zdXBwb3J0LCBfLmlzU3RyaW5nKSAmJlxuICAgICAgICAgIF8uY29udGFpbnMobXNnLnN1cHBvcnQsIG1zZy52ZXJzaW9uKSkpIHtcbiAgICAgIHNvY2tldC5zZW5kKEREUENvbW1vbi5zdHJpbmdpZnlERFAoe21zZzogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IEREUENvbW1vbi5TVVBQT1JURURfRERQX1ZFUlNJT05TWzBdfSkpO1xuICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSwgaGFuZGxlIHNlc3Npb24gcmVzdW1wdGlvbjogc29tZXRoaW5nIGxpa2U6XG4gICAgLy8gIHNvY2tldC5fbWV0ZW9yU2Vzc2lvbiA9IHNlbGYuc2Vzc2lvbnNbbXNnLnNlc3Npb25dXG4gICAgdmFyIHZlcnNpb24gPSBjYWxjdWxhdGVWZXJzaW9uKG1zZy5zdXBwb3J0LCBERFBDb21tb24uU1VQUE9SVEVEX0REUF9WRVJTSU9OUyk7XG5cbiAgICBpZiAobXNnLnZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgIC8vIFRoZSBiZXN0IHZlcnNpb24gdG8gdXNlIChhY2NvcmRpbmcgdG8gdGhlIGNsaWVudCdzIHN0YXRlZCBwcmVmZXJlbmNlcylcbiAgICAgIC8vIGlzIG5vdCB0aGUgb25lIHRoZSBjbGllbnQgaXMgdHJ5aW5nIHRvIHVzZS4gSW5mb3JtIHRoZW0gYWJvdXQgdGhlIGJlc3RcbiAgICAgIC8vIHZlcnNpb24gdG8gdXNlLlxuICAgICAgc29ja2V0LnNlbmQoRERQQ29tbW9uLnN0cmluZ2lmeUREUCh7bXNnOiAnZmFpbGVkJywgdmVyc2lvbjogdmVyc2lvbn0pKTtcbiAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFlheSwgdmVyc2lvbiBtYXRjaGVzISBDcmVhdGUgYSBuZXcgc2Vzc2lvbi5cbiAgICAvLyBOb3RlOiBUcm9wb3NwaGVyZSBkZXBlbmRzIG9uIHRoZSBhYmlsaXR5IHRvIG11dGF0ZVxuICAgIC8vIE1ldGVvci5zZXJ2ZXIub3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0ISBUaGlzIGlzIGEgaGFjaywgYnV0IGl0J3MgbGlmZS5cbiAgICBzb2NrZXQuX21ldGVvclNlc3Npb24gPSBuZXcgU2Vzc2lvbihzZWxmLCB2ZXJzaW9uLCBzb2NrZXQsIHNlbGYub3B0aW9ucyk7XG4gICAgc2VsZi5zZXNzaW9ucy5zZXQoc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmlkLCBzb2NrZXQuX21ldGVvclNlc3Npb24pO1xuICAgIHNlbGYub25Db25uZWN0aW9uSG9vay5lYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgaWYgKHNvY2tldC5fbWV0ZW9yU2Vzc2lvbilcbiAgICAgICAgY2FsbGJhY2soc29ja2V0Ll9tZXRlb3JTZXNzaW9uLmNvbm5lY3Rpb25IYW5kbGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHB1Ymxpc2ggaGFuZGxlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUge1N0cmluZ30gaWRlbnRpZmllciBmb3IgcXVlcnlcbiAgICogQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSBwdWJsaXNoIGhhbmRsZXJcbiAgICogQHBhcmFtIG9wdGlvbnMge09iamVjdH1cbiAgICpcbiAgICogU2VydmVyIHdpbGwgY2FsbCBoYW5kbGVyIGZ1bmN0aW9uIG9uIGVhY2ggbmV3IHN1YnNjcmlwdGlvbixcbiAgICogZWl0aGVyIHdoZW4gcmVjZWl2aW5nIEREUCBzdWIgbWVzc2FnZSBmb3IgYSBuYW1lZCBzdWJzY3JpcHRpb24sIG9yIG9uXG4gICAqIEREUCBjb25uZWN0IGZvciBhIHVuaXZlcnNhbCBzdWJzY3JpcHRpb24uXG4gICAqXG4gICAqIElmIG5hbWUgaXMgbnVsbCwgdGhpcyB3aWxsIGJlIGEgc3Vic2NyaXB0aW9uIHRoYXQgaXNcbiAgICogYXV0b21hdGljYWxseSBlc3RhYmxpc2hlZCBhbmQgcGVybWFuZW50bHkgb24gZm9yIGFsbCBjb25uZWN0ZWRcbiAgICogY2xpZW50LCBpbnN0ZWFkIG9mIGEgc3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiBhbmQgb2ZmXG4gICAqIHdpdGggc3Vic2NyaWJlKCkuXG4gICAqXG4gICAqIG9wdGlvbnMgdG8gY29udGFpbjpcbiAgICogIC0gKG1vc3RseSBpbnRlcm5hbCkgaXNfYXV0bzogdHJ1ZSBpZiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKiAgICBmcm9tIGFuIGF1dG9wdWJsaXNoIGhvb2suIHRoaXMgaXMgZm9yIGNvc21ldGljIHB1cnBvc2VzIG9ubHlcbiAgICogICAgKGl0IGxldHMgdXMgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcHJpbnQgYSB3YXJuaW5nIHN1Z2dlc3RpbmdcbiAgICogICAgdGhhdCB5b3UgdHVybiBvZmYgYXV0b3B1Ymxpc2guKVxuICAgKi9cblxuICAvKipcbiAgICogQHN1bW1hcnkgUHVibGlzaCBhIHJlY29yZCBzZXQuXG4gICAqIEBtZW1iZXJPZiBNZXRlb3JcbiAgICogQGltcG9ydEZyb21QYWNrYWdlIG1ldGVvclxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gbmFtZSBJZiBTdHJpbmcsIG5hbWUgb2YgdGhlIHJlY29yZCBzZXQuICBJZiBPYmplY3QsIHB1YmxpY2F0aW9ucyBEaWN0aW9uYXJ5IG9mIHB1Ymxpc2ggZnVuY3Rpb25zIGJ5IG5hbWUuICBJZiBgbnVsbGAsIHRoZSBzZXQgaGFzIG5vIG5hbWUsIGFuZCB0aGUgcmVjb3JkIHNldCBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgdG8gYWxsIGNvbm5lY3RlZCBjbGllbnRzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIEZ1bmN0aW9uIGNhbGxlZCBvbiB0aGUgc2VydmVyIGVhY2ggdGltZSBhIGNsaWVudCBzdWJzY3JpYmVzLiAgSW5zaWRlIHRoZSBmdW5jdGlvbiwgYHRoaXNgIGlzIHRoZSBwdWJsaXNoIGhhbmRsZXIgb2JqZWN0LCBkZXNjcmliZWQgYmVsb3cuICBJZiB0aGUgY2xpZW50IHBhc3NlZCBhcmd1bWVudHMgdG8gYHN1YnNjcmliZWAsIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMuXG4gICAqL1xuICBwdWJsaXNoOiBmdW5jdGlvbiAobmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghIF8uaXNPYmplY3QobmFtZSkpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lIGluIHNlbGYucHVibGlzaF9oYW5kbGVycykge1xuICAgICAgICBNZXRlb3IuX2RlYnVnKFwiSWdub3JpbmcgZHVwbGljYXRlIHB1Ymxpc2ggbmFtZWQgJ1wiICsgbmFtZSArIFwiJ1wiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoUGFja2FnZS5hdXRvcHVibGlzaCAmJiAhb3B0aW9ucy5pc19hdXRvKSB7XG4gICAgICAgIC8vIFRoZXkgaGF2ZSBhdXRvcHVibGlzaCBvbiwgeWV0IHRoZXkncmUgdHJ5aW5nIHRvIG1hbnVhbGx5XG4gICAgICAgIC8vIHBpY2tpbmcgc3R1ZmYgdG8gcHVibGlzaC4gVGhleSBwcm9iYWJseSBzaG91bGQgdHVybiBvZmZcbiAgICAgICAgLy8gYXV0b3B1Ymxpc2guIChUaGlzIGNoZWNrIGlzbid0IHBlcmZlY3QgLS0gaWYgeW91IGNyZWF0ZSBhXG4gICAgICAgIC8vIHB1Ymxpc2ggYmVmb3JlIHlvdSB0dXJuIG9uIGF1dG9wdWJsaXNoLCBpdCB3b24ndCBjYXRjaFxuICAgICAgICAvLyBpdC4gQnV0IHRoaXMgd2lsbCBkZWZpbml0ZWx5IGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmVcbiAgICAgICAgLy8geW91J3ZlIGFkZGVkIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlIHRvIHlvdXIgYXBwLCBhbmQgYXJlXG4gICAgICAgIC8vIGNhbGxpbmcgcHVibGlzaCBmcm9tIHlvdXIgYXBwIGNvZGUuKVxuICAgICAgICBpZiAoIXNlbGYud2FybmVkX2Fib3V0X2F1dG9wdWJsaXNoKSB7XG4gICAgICAgICAgc2VsZi53YXJuZWRfYWJvdXRfYXV0b3B1Ymxpc2ggPSB0cnVlO1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXG4gICAgXCIqKiBZb3UndmUgc2V0IHVwIHNvbWUgZGF0YSBzdWJzY3JpcHRpb25zIHdpdGggTWV0ZW9yLnB1Ymxpc2goKSwgYnV0XFxuXCIgK1xuICAgIFwiKiogeW91IHN0aWxsIGhhdmUgYXV0b3B1Ymxpc2ggdHVybmVkIG9uLiBCZWNhdXNlIGF1dG9wdWJsaXNoIGlzIHN0aWxsXFxuXCIgK1xuICAgIFwiKiogb24sIHlvdXIgTWV0ZW9yLnB1Ymxpc2goKSBjYWxscyB3b24ndCBoYXZlIG11Y2ggZWZmZWN0LiBBbGwgZGF0YVxcblwiICtcbiAgICBcIioqIHdpbGwgc3RpbGwgYmUgc2VudCB0byBhbGwgY2xpZW50cy5cXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIFR1cm4gb2ZmIGF1dG9wdWJsaXNoIGJ5IHJlbW92aW5nIHRoZSBhdXRvcHVibGlzaCBwYWNrYWdlOlxcblwiICtcbiAgICBcIioqXFxuXCIgK1xuICAgIFwiKiogICAkIG1ldGVvciByZW1vdmUgYXV0b3B1Ymxpc2hcXG5cIiArXG4gICAgXCIqKlxcblwiICtcbiAgICBcIioqIC4uIGFuZCBtYWtlIHN1cmUgeW91IGhhdmUgTWV0ZW9yLnB1Ymxpc2goKSBhbmQgTWV0ZW9yLnN1YnNjcmliZSgpIGNhbGxzXFxuXCIgK1xuICAgIFwiKiogZm9yIGVhY2ggY29sbGVjdGlvbiB0aGF0IHlvdSB3YW50IGNsaWVudHMgdG8gc2VlLlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSlcbiAgICAgICAgc2VsZi5wdWJsaXNoX2hhbmRsZXJzW25hbWVdID0gaGFuZGxlcjtcbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWxmLnVuaXZlcnNhbF9wdWJsaXNoX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIC8vIFNwaW4gdXAgdGhlIG5ldyBwdWJsaXNoZXIgb24gYW55IGV4aXN0aW5nIHNlc3Npb24gdG9vLiBSdW4gZWFjaFxuICAgICAgICAvLyBzZXNzaW9uJ3Mgc3Vic2NyaXB0aW9uIGluIGEgbmV3IEZpYmVyLCBzbyB0aGF0IHRoZXJlJ3Mgbm8gY2hhbmdlIGZvclxuICAgICAgICAvLyBzZWxmLnNlc3Npb25zIHRvIGNoYW5nZSB3aGlsZSB3ZSdyZSBydW5uaW5nIHRoaXMgbG9vcC5cbiAgICAgICAgc2VsZi5zZXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLl9kb250U3RhcnROZXdVbml2ZXJzYWxTdWJzKSB7XG4gICAgICAgICAgICBGaWJlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbi5fc3RhcnRTdWJzY3JpcHRpb24oaGFuZGxlcik7XG4gICAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgXy5lYWNoKG5hbWUsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgc2VsZi5wdWJsaXNoKGtleSwgdmFsdWUsIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfcmVtb3ZlU2Vzc2lvbjogZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5zZXNzaW9ucy5kZWxldGUoc2Vzc2lvbi5pZCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGludm9rZWQgb3ZlciB0aGUgbmV0d29yayBieSBjbGllbnRzLlxuICAgKiBAbG9jdXMgQW55d2hlcmVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgRGljdGlvbmFyeSB3aG9zZSBrZXlzIGFyZSBtZXRob2QgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZnVuY3Rpb25zLlxuICAgKiBAbWVtYmVyT2YgTWV0ZW9yXG4gICAqIEBpbXBvcnRGcm9tUGFja2FnZSBtZXRlb3JcbiAgICovXG4gIG1ldGhvZHM6IGZ1bmN0aW9uIChtZXRob2RzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIF8uZWFjaChtZXRob2RzLCBmdW5jdGlvbiAoZnVuYywgbmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2QgJ1wiICsgbmFtZSArIFwiJyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICBpZiAoc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgbWV0aG9kIG5hbWVkICdcIiArIG5hbWUgKyBcIicgaXMgYWxyZWFkeSBkZWZpbmVkXCIpO1xuICAgICAgc2VsZi5tZXRob2RfaGFuZGxlcnNbbmFtZV0gPSBmdW5jO1xuICAgIH0pO1xuICB9LFxuXG4gIGNhbGw6IGZ1bmN0aW9uIChuYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoICYmIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcmVzdWx0IGNhbGxiYWNrLCBub3RcbiAgICAgIC8vIGEgcGFyYW1ldGVyIHRvIHRoZSByZW1vdGUgbWV0aG9kLlxuICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseShuYW1lLCBhcmdzLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgLy8gQSB2ZXJzaW9uIG9mIHRoZSBjYWxsIG1ldGhvZCB0aGF0IGFsd2F5cyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgY2FsbEFzeW5jOiBmdW5jdGlvbiAobmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncyk7XG4gIH0sXG5cbiAgYXBwbHk6IGZ1bmN0aW9uIChuYW1lLCBhcmdzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIC8vIFdlIHdlcmUgcGFzc2VkIDMgYXJndW1lbnRzLiBUaGV5IG1heSBiZSBlaXRoZXIgKG5hbWUsIGFyZ3MsIG9wdGlvbnMpXG4gICAgLy8gb3IgKG5hbWUsIGFyZ3MsIGNhbGxiYWNrKVxuICAgIGlmICghIGNhbGxiYWNrICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmFwcGx5QXN5bmMobmFtZSwgYXJncywgb3B0aW9ucyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpbiB3aGljaGV2ZXIgd2F5IHRoZSBjYWxsZXIgYXNrZWQgZm9yIGl0LiBOb3RlIHRoYXQgd2VcbiAgICAvLyBkbyBOT1QgYmxvY2sgb24gdGhlIHdyaXRlIGZlbmNlIGluIGFuIGFuYWxvZ291cyB3YXkgdG8gaG93IHRoZSBjbGllbnRcbiAgICAvLyBibG9ja3Mgb24gdGhlIHJlbGV2YW50IGRhdGEgYmVpbmcgdmlzaWJsZSwgc28geW91IGFyZSBOT1QgZ3VhcmFudGVlZCB0aGF0XG4gICAgLy8gY3Vyc29yIG9ic2VydmUgY2FsbGJhY2tzIGhhdmUgZmlyZWQgd2hlbiB5b3VyIGNhbGxiYWNrIGlzIGludm9rZWQuIChXZVxuICAgIC8vIGNhbiBjaGFuZ2UgdGhpcyBpZiB0aGVyZSdzIGEgcmVhbCB1c2UgY2FzZS4pXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwcm9taXNlLnRoZW4oXG4gICAgICAgIHJlc3VsdCA9PiBjYWxsYmFjayh1bmRlZmluZWQsIHJlc3VsdCksXG4gICAgICAgIGV4Y2VwdGlvbiA9PiBjYWxsYmFjayhleGNlcHRpb24pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS5hd2FpdCgpO1xuICAgIH1cbiAgfSxcblxuICAvLyBAcGFyYW0gb3B0aW9ucyB7T3B0aW9uYWwgT2JqZWN0fVxuICBhcHBseUFzeW5jOiBmdW5jdGlvbiAobmFtZSwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFJ1biB0aGUgaGFuZGxlclxuICAgIHZhciBoYW5kbGVyID0gdGhpcy5tZXRob2RfaGFuZGxlcnNbbmFtZV07XG4gICAgaWYgKCEgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgTWV0ZW9yLkVycm9yKDQwNCwgYE1ldGhvZCAnJHtuYW1lfScgbm90IGZvdW5kYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIG1ldGhvZCBjYWxsIGZyb20gd2l0aGluIGFub3RoZXIgbWV0aG9kIG9yIHB1Ymxpc2ggZnVuY3Rpb24sXG4gICAgLy8gZ2V0IHRoZSB1c2VyIHN0YXRlIGZyb20gdGhlIG91dGVyIG1ldGhvZCBvciBwdWJsaXNoIGZ1bmN0aW9uLCBvdGhlcndpc2VcbiAgICAvLyBkb24ndCBhbGxvdyBzZXRVc2VySWQgdG8gYmUgY2FsbGVkXG4gICAgdmFyIHVzZXJJZCA9IG51bGw7XG4gICAgdmFyIHNldFVzZXJJZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY2FsbCBzZXRVc2VySWQgb24gYSBzZXJ2ZXIgaW5pdGlhdGVkIG1ldGhvZCBjYWxsXCIpO1xuICAgIH07XG4gICAgdmFyIGNvbm5lY3Rpb24gPSBudWxsO1xuICAgIHZhciBjdXJyZW50TWV0aG9kSW52b2NhdGlvbiA9IEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIGN1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24gPSBERFAuX0N1cnJlbnRQdWJsaWNhdGlvbkludm9jYXRpb24uZ2V0KCk7XG4gICAgdmFyIHJhbmRvbVNlZWQgPSBudWxsO1xuICAgIGlmIChjdXJyZW50TWV0aG9kSW52b2NhdGlvbikge1xuICAgICAgdXNlcklkID0gY3VycmVudE1ldGhvZEludm9jYXRpb24udXNlcklkO1xuICAgICAgc2V0VXNlcklkID0gZnVuY3Rpb24odXNlcklkKSB7XG4gICAgICAgIGN1cnJlbnRNZXRob2RJbnZvY2F0aW9uLnNldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfTtcbiAgICAgIGNvbm5lY3Rpb24gPSBjdXJyZW50TWV0aG9kSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgICAgcmFuZG9tU2VlZCA9IEREUENvbW1vbi5tYWtlUnBjU2VlZChjdXJyZW50TWV0aG9kSW52b2NhdGlvbiwgbmFtZSk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uKSB7XG4gICAgICB1c2VySWQgPSBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLnVzZXJJZDtcbiAgICAgIHNldFVzZXJJZCA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgICBjdXJyZW50UHVibGljYXRpb25JbnZvY2F0aW9uLl9zZXNzaW9uLl9zZXRVc2VySWQodXNlcklkKTtcbiAgICAgIH07XG4gICAgICBjb25uZWN0aW9uID0gY3VycmVudFB1YmxpY2F0aW9uSW52b2NhdGlvbi5jb25uZWN0aW9uO1xuICAgIH1cblxuICAgIHZhciBpbnZvY2F0aW9uID0gbmV3IEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uKHtcbiAgICAgIGlzU2ltdWxhdGlvbjogZmFsc2UsXG4gICAgICB1c2VySWQsXG4gICAgICBzZXRVc2VySWQsXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgcmFuZG9tU2VlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVzb2x2ZShcbiAgICAgIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24ud2l0aFZhbHVlKFxuICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAoKSA9PiBtYXliZUF1ZGl0QXJndW1lbnRDaGVja3MoXG4gICAgICAgICAgaGFuZGxlciwgaW52b2NhdGlvbiwgRUpTT04uY2xvbmUoYXJncyksXG4gICAgICAgICAgXCJpbnRlcm5hbCBjYWxsIHRvICdcIiArIG5hbWUgKyBcIidcIlxuICAgICAgICApXG4gICAgICApXG4gICAgKSkudGhlbihFSlNPTi5jbG9uZSk7XG4gIH0sXG5cbiAgX3VybEZvclNlc3Npb246IGZ1bmN0aW9uIChzZXNzaW9uSWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNlc3Npb24gPSBzZWxmLnNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChzZXNzaW9uKVxuICAgICAgcmV0dXJuIHNlc3Npb24uX3NvY2tldFVybDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbnZhciBjYWxjdWxhdGVWZXJzaW9uID0gZnVuY3Rpb24gKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU3VwcG9ydGVkVmVyc2lvbnMpIHtcbiAgdmFyIGNvcnJlY3RWZXJzaW9uID0gXy5maW5kKGNsaWVudFN1cHBvcnRlZFZlcnNpb25zLCBmdW5jdGlvbiAodmVyc2lvbikge1xuICAgIHJldHVybiBfLmNvbnRhaW5zKHNlcnZlclN1cHBvcnRlZFZlcnNpb25zLCB2ZXJzaW9uKTtcbiAgfSk7XG4gIGlmICghY29ycmVjdFZlcnNpb24pIHtcbiAgICBjb3JyZWN0VmVyc2lvbiA9IHNlcnZlclN1cHBvcnRlZFZlcnNpb25zWzBdO1xuICB9XG4gIHJldHVybiBjb3JyZWN0VmVyc2lvbjtcbn07XG5cbkREUFNlcnZlci5fY2FsY3VsYXRlVmVyc2lvbiA9IGNhbGN1bGF0ZVZlcnNpb247XG5cblxuLy8gXCJibGluZFwiIGV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0aG9zZSB0aGF0IHdlcmUgZGVsaWJlcmF0ZWx5IHRocm93biB0byBzaWduYWxcbi8vIGVycm9ycyB0byB0aGUgY2xpZW50XG52YXIgd3JhcEludGVybmFsRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgY29udGV4dCkge1xuICBpZiAoIWV4Y2VwdGlvbikgcmV0dXJuIGV4Y2VwdGlvbjtcblxuICAvLyBUbyBhbGxvdyBwYWNrYWdlcyB0byB0aHJvdyBlcnJvcnMgaW50ZW5kZWQgZm9yIHRoZSBjbGllbnQgYnV0IG5vdCBoYXZlIHRvXG4gIC8vIGRlcGVuZCBvbiB0aGUgTWV0ZW9yLkVycm9yIGNsYXNzLCBgaXNDbGllbnRTYWZlYCBjYW4gYmUgc2V0IHRvIHRydWUgb24gYW55XG4gIC8vIGVycm9yIGJlZm9yZSBpdCBpcyB0aHJvd24uXG4gIGlmIChleGNlcHRpb24uaXNDbGllbnRTYWZlKSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgTWV0ZW9yLkVycm9yKSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTWV0ZW9yLkVycm9yKGV4Y2VwdGlvbi5lcnJvciwgZXhjZXB0aW9uLnJlYXNvbiwgZXhjZXB0aW9uLmRldGFpbHMpO1xuICAgICAgZXhjZXB0aW9uLm1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG4gIH1cblxuICAvLyBUZXN0cyBjYW4gc2V0IHRoZSAnX2V4cGVjdGVkQnlUZXN0JyBmbGFnIG9uIGFuIGV4Y2VwdGlvbiBzbyBpdCB3b24ndCBnbyB0b1xuICAvLyB0aGUgc2VydmVyIGxvZy5cbiAgaWYgKCFleGNlcHRpb24uX2V4cGVjdGVkQnlUZXN0KSB7XG4gICAgTWV0ZW9yLl9kZWJ1ZyhcIkV4Y2VwdGlvbiBcIiArIGNvbnRleHQsIGV4Y2VwdGlvbi5zdGFjayk7XG4gICAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgICAgTWV0ZW9yLl9kZWJ1ZyhcIlNhbml0aXplZCBhbmQgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCBhczpcIiwgZXhjZXB0aW9uLnNhbml0aXplZEVycm9yKTtcbiAgICAgIE1ldGVvci5fZGVidWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBEaWQgdGhlIGVycm9yIGNvbnRhaW4gbW9yZSBkZXRhaWxzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHVzZWZ1bCBpZiBjYXVnaHQgaW5cbiAgLy8gc2VydmVyIGNvZGUgKG9yIGlmIHRocm93biBmcm9tIG5vbi1jbGllbnQtb3JpZ2luYXRlZCBjb2RlKSwgYnV0IGFsc29cbiAgLy8gcHJvdmlkZWQgYSBcInNhbml0aXplZFwiIHZlcnNpb24gd2l0aCBtb3JlIGNvbnRleHQgdGhhbiA1MDAgSW50ZXJuYWwgc2VydmVyXG4gIC8vIGVycm9yPyBVc2UgdGhhdC5cbiAgaWYgKGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcikge1xuICAgIGlmIChleGNlcHRpb24uc2FuaXRpemVkRXJyb3IuaXNDbGllbnRTYWZlKVxuICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5zYW5pdGl6ZWRFcnJvcjtcbiAgICBNZXRlb3IuX2RlYnVnKFwiRXhjZXB0aW9uIFwiICsgY29udGV4dCArIFwiIHByb3ZpZGVzIGEgc2FuaXRpemVkRXJyb3IgdGhhdCBcIiArXG4gICAgICAgICAgICAgICAgICBcImRvZXMgbm90IGhhdmUgaXNDbGllbnRTYWZlIHByb3BlcnR5IHNldDsgaWdub3JpbmdcIik7XG4gIH1cblxuICByZXR1cm4gbmV3IE1ldGVvci5FcnJvcig1MDAsIFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIpO1xufTtcblxuXG4vLyBBdWRpdCBhcmd1bWVudCBjaGVja3MsIGlmIHRoZSBhdWRpdC1hcmd1bWVudC1jaGVja3MgcGFja2FnZSBleGlzdHMgKGl0IGlzIGFcbi8vIHdlYWsgZGVwZW5kZW5jeSBvZiB0aGlzIHBhY2thZ2UpLlxudmFyIG1heWJlQXVkaXRBcmd1bWVudENoZWNrcyA9IGZ1bmN0aW9uIChmLCBjb250ZXh0LCBhcmdzLCBkZXNjcmlwdGlvbikge1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgaWYgKFBhY2thZ2VbJ2F1ZGl0LWFyZ3VtZW50LWNoZWNrcyddKSB7XG4gICAgcmV0dXJuIE1hdGNoLl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkKFxuICAgICAgZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pO1xuICB9XG4gIHJldHVybiBmLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xufTtcbiIsInZhciBGdXR1cmUgPSBOcG0ucmVxdWlyZSgnZmliZXJzL2Z1dHVyZScpO1xuXG4vLyBBIHdyaXRlIGZlbmNlIGNvbGxlY3RzIGEgZ3JvdXAgb2Ygd3JpdGVzLCBhbmQgcHJvdmlkZXMgYSBjYWxsYmFja1xuLy8gd2hlbiBhbGwgb2YgdGhlIHdyaXRlcyBhcmUgZnVsbHkgY29tbWl0dGVkIGFuZCBwcm9wYWdhdGVkIChhbGxcbi8vIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQgb2YgdGhlIHdyaXRlIGFuZCBhY2tub3dsZWRnZWQgaXQuKVxuLy9cbkREUFNlcnZlci5fV3JpdGVGZW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuYXJtZWQgPSBmYWxzZTtcbiAgc2VsZi5maXJlZCA9IGZhbHNlO1xuICBzZWxmLnJldGlyZWQgPSBmYWxzZTtcbiAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMgPSAwO1xuICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICBzZWxmLmNvbXBsZXRpb25fY2FsbGJhY2tzID0gW107XG59O1xuXG4vLyBUaGUgY3VycmVudCB3cml0ZSBmZW5jZS4gV2hlbiB0aGVyZSBpcyBhIGN1cnJlbnQgd3JpdGUgZmVuY2UsIGNvZGVcbi8vIHRoYXQgd3JpdGVzIHRvIGRhdGFiYXNlcyBzaG91bGQgcmVnaXN0ZXIgdGhlaXIgd3JpdGVzIHdpdGggaXQgdXNpbmdcbi8vIGJlZ2luV3JpdGUoKS5cbi8vXG5ERFBTZXJ2ZXIuX0N1cnJlbnRXcml0ZUZlbmNlID0gbmV3IE1ldGVvci5FbnZpcm9ubWVudFZhcmlhYmxlO1xuXG5fLmV4dGVuZChERFBTZXJ2ZXIuX1dyaXRlRmVuY2UucHJvdG90eXBlLCB7XG4gIC8vIFN0YXJ0IHRyYWNraW5nIGEgd3JpdGUsIGFuZCByZXR1cm4gYW4gb2JqZWN0IHRvIHJlcHJlc2VudCBpdC4gVGhlXG4gIC8vIG9iamVjdCBoYXMgYSBzaW5nbGUgbWV0aG9kLCBjb21taXR0ZWQoKS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlXG4gIC8vIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBpcyBmdWxseSBjb21taXR0ZWQgYW5kIHByb3BhZ2F0ZWQuIFlvdSBjYW5cbiAgLy8gY29udGludWUgdG8gYWRkIHdyaXRlcyB0byB0aGUgV3JpdGVGZW5jZSB1cCB1bnRpbCBpdCBpcyB0cmlnZ2VyZWRcbiAgLy8gKGNhbGxzIGl0cyBjYWxsYmFja3MgYmVjYXVzZSBhbGwgd3JpdGVzIGhhdmUgY29tbWl0dGVkLilcbiAgYmVnaW5Xcml0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmIChzZWxmLnJldGlyZWQpXG4gICAgICByZXR1cm4geyBjb21taXR0ZWQ6IGZ1bmN0aW9uICgpIHt9IH07XG5cbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBhZGQgd3JpdGVzXCIpO1xuXG4gICAgc2VsZi5vdXRzdGFuZGluZ193cml0ZXMrKztcbiAgICB2YXIgY29tbWl0dGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1pdHRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29tbWl0dGVkKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbW1pdHRlZCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUgd3JpdGVcIik7XG4gICAgICAgIGNvbW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHNlbGYub3V0c3RhbmRpbmdfd3JpdGVzLS07XG4gICAgICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgLy8gQXJtIHRoZSBmZW5jZS4gT25jZSB0aGUgZmVuY2UgaXMgYXJtZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZVxuICAvLyB1bmNvbW1pdHRlZCB3cml0ZXMsIGl0IHdpbGwgYWN0aXZhdGUuXG4gIGFybTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZiA9PT0gRERQU2VydmVyLl9DdXJyZW50V3JpdGVGZW5jZS5nZXQoKSlcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgYXJtIHRoZSBjdXJyZW50IGZlbmNlXCIpO1xuICAgIHNlbGYuYXJtZWQgPSB0cnVlO1xuICAgIHNlbGYuX21heWJlRmlyZSgpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGZpcmluZyB0aGUgZmVuY2UuXG4gIC8vIENhbGxiYWNrIGZ1bmN0aW9uIGNhbiBhZGQgbmV3IHdyaXRlcyB0byB0aGUgZmVuY2UsIGluIHdoaWNoIGNhc2VcbiAgLy8gaXQgd29uJ3QgZmlyZSB1bnRpbCB0aG9zZSB3cml0ZXMgYXJlIGRvbmUgYXMgd2VsbC5cbiAgb25CZWZvcmVGaXJlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5maXJlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZlbmNlIGhhcyBhbHJlYWR5IGFjdGl2YXRlZCAtLSB0b28gbGF0ZSB0byBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJhZGQgYSBjYWxsYmFja1wiKTtcbiAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlbmNlIGZpcmVzLlxuICBvbkFsbENvbW1pdHRlZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmZW5jZSBoYXMgYWxyZWFkeSBhY3RpdmF0ZWQgLS0gdG9vIGxhdGUgdG8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiYWRkIGEgY2FsbGJhY2tcIik7XG4gICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9LFxuXG4gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uLiBBcm1zIHRoZSBmZW5jZSwgdGhlbiBibG9ja3MgdW50aWwgaXQgZmlyZXMuXG4gIGFybUFuZFdhaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmU7XG4gICAgc2VsZi5vbkFsbENvbW1pdHRlZChmdW5jdGlvbiAoKSB7XG4gICAgICBmdXR1cmVbJ3JldHVybiddKCk7XG4gICAgfSk7XG4gICAgc2VsZi5hcm0oKTtcbiAgICBmdXR1cmUud2FpdCgpO1xuICB9LFxuXG4gIF9tYXliZUZpcmU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYuZmlyZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSBmZW5jZSBhbHJlYWR5IGFjdGl2YXRlZD9cIik7XG4gICAgaWYgKHNlbGYuYXJtZWQgJiYgIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICBmdW5jdGlvbiBpbnZva2VDYWxsYmFjayAoZnVuYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZ1bmMoc2VsZik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIE1ldGVvci5fZGVidWcoXCJleGNlcHRpb24gaW4gd3JpdGUgZmVuY2UgY2FsbGJhY2tcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcysrO1xuICAgICAgd2hpbGUgKHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHNlbGYuYmVmb3JlX2ZpcmVfY2FsbGJhY2tzO1xuICAgICAgICBzZWxmLmJlZm9yZV9maXJlX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgICBzZWxmLm91dHN0YW5kaW5nX3dyaXRlcy0tO1xuXG4gICAgICBpZiAoIXNlbGYub3V0c3RhbmRpbmdfd3JpdGVzKSB7XG4gICAgICAgIHNlbGYuZmlyZWQgPSB0cnVlO1xuICAgICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcztcbiAgICAgICAgc2VsZi5jb21wbGV0aW9uX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBfLmVhY2goY2FsbGJhY2tzLCBpbnZva2VDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIERlYWN0aXZhdGUgdGhpcyBmZW5jZSBzbyB0aGF0IGFkZGluZyBtb3JlIHdyaXRlcyBoYXMgbm8gZWZmZWN0LlxuICAvLyBUaGUgZmVuY2UgbXVzdCBoYXZlIGFscmVhZHkgZmlyZWQuXG4gIHJldGlyZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoISBzZWxmLmZpcmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcmV0aXJlIGEgZmVuY2UgdGhhdCBoYXNuJ3QgZmlyZWQuXCIpO1xuICAgIHNlbGYucmV0aXJlZCA9IHRydWU7XG4gIH1cbn0pO1xuIiwiLy8gQSBcImNyb3NzYmFyXCIgaXMgYSBjbGFzcyB0aGF0IHByb3ZpZGVzIHN0cnVjdHVyZWQgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbi5cbi8vIFNlZSBfbWF0Y2ggZm9yIHRoZSBkZWZpbml0aW9uIG9mIGhvdyBhIG5vdGlmaWNhdGlvbiBtYXRjaGVzIGEgdHJpZ2dlci5cbi8vIEFsbCBub3RpZmljYXRpb25zIGFuZCB0cmlnZ2VycyBtdXN0IGhhdmUgYSBzdHJpbmcga2V5IG5hbWVkICdjb2xsZWN0aW9uJy5cblxuRERQU2VydmVyLl9Dcm9zc2JhciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgc2VsZi5uZXh0SWQgPSAxO1xuICAvLyBtYXAgZnJvbSBjb2xsZWN0aW9uIG5hbWUgKHN0cmluZykgLT4gbGlzdGVuZXIgaWQgLT4gb2JqZWN0LiBlYWNoIG9iamVjdCBoYXNcbiAgLy8ga2V5cyAndHJpZ2dlcicsICdjYWxsYmFjaycuICBBcyBhIGhhY2ssIHRoZSBlbXB0eSBzdHJpbmcgbWVhbnMgXCJub1xuICAvLyBjb2xsZWN0aW9uXCIuXG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uID0ge307XG4gIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnQgPSB7fTtcbiAgc2VsZi5mYWN0UGFja2FnZSA9IG9wdGlvbnMuZmFjdFBhY2thZ2UgfHwgXCJsaXZlZGF0YVwiO1xuICBzZWxmLmZhY3ROYW1lID0gb3B0aW9ucy5mYWN0TmFtZSB8fCBudWxsO1xufTtcblxuXy5leHRlbmQoRERQU2VydmVyLl9Dcm9zc2Jhci5wcm90b3R5cGUsIHtcbiAgLy8gbXNnIGlzIGEgdHJpZ2dlciBvciBhIG5vdGlmaWNhdGlvblxuICBfY29sbGVjdGlvbkZvck1lc3NhZ2U6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEgXy5oYXMobXNnLCAnY29sbGVjdGlvbicpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YobXNnLmNvbGxlY3Rpb24pID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG1zZy5jb2xsZWN0aW9uID09PSAnJylcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBlbXB0eSBjb2xsZWN0aW9uIVwiKTtcbiAgICAgIHJldHVybiBtc2cuY29sbGVjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGhhcyBub24tc3RyaW5nIGNvbGxlY3Rpb24hXCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBMaXN0ZW4gZm9yIG5vdGlmaWNhdGlvbiB0aGF0IG1hdGNoICd0cmlnZ2VyJy4gQSBub3RpZmljYXRpb25cbiAgLy8gbWF0Y2hlcyBpZiBpdCBoYXMgdGhlIGtleS12YWx1ZSBwYWlycyBpbiB0cmlnZ2VyIGFzIGFcbiAgLy8gc3Vic2V0LiBXaGVuIGEgbm90aWZpY2F0aW9uIG1hdGNoZXMsIGNhbGwgJ2NhbGxiYWNrJywgcGFzc2luZ1xuICAvLyB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbi5cbiAgLy9cbiAgLy8gUmV0dXJucyBhIGxpc3RlbiBoYW5kbGUsIHdoaWNoIGlzIGFuIG9iamVjdCB3aXRoIGEgbWV0aG9kXG4gIC8vIHN0b3AoKS4gQ2FsbCBzdG9wKCkgdG8gc3RvcCBsaXN0ZW5pbmcuXG4gIC8vXG4gIC8vIFhYWCBJdCBzaG91bGQgYmUgbGVnYWwgdG8gY2FsbCBmaXJlKCkgZnJvbSBpbnNpZGUgYSBsaXN0ZW4oKVxuICAvLyBjYWxsYmFjaz9cbiAgbGlzdGVuOiBmdW5jdGlvbiAodHJpZ2dlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGlkID0gc2VsZi5uZXh0SWQrKztcblxuICAgIHZhciBjb2xsZWN0aW9uID0gc2VsZi5fY29sbGVjdGlvbkZvck1lc3NhZ2UodHJpZ2dlcik7XG4gICAgdmFyIHJlY29yZCA9IHt0cmlnZ2VyOiBFSlNPTi5jbG9uZSh0cmlnZ2VyKSwgY2FsbGJhY2s6IGNhbGxiYWNrfTtcbiAgICBpZiAoISBfLmhhcyhzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiwgY29sbGVjdGlvbikpIHtcbiAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uW2NvbGxlY3Rpb25dID0ge307XG4gICAgICBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbkNvdW50W2NvbGxlY3Rpb25dID0gMDtcbiAgICB9XG4gICAgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl1baWRdID0gcmVjb3JkO1xuICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0rKztcblxuICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgUGFja2FnZVsnZmFjdHMtYmFzZSddLkZhY3RzLmluY3JlbWVudFNlcnZlckZhY3QoXG4gICAgICAgIHNlbGYuZmFjdFBhY2thZ2UsIHNlbGYuZmFjdE5hbWUsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLmZhY3ROYW1lICYmIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXSkge1xuICAgICAgICAgIFBhY2thZ2VbJ2ZhY3RzLWJhc2UnXS5GYWN0cy5pbmNyZW1lbnRTZXJ2ZXJGYWN0KFxuICAgICAgICAgICAgc2VsZi5mYWN0UGFja2FnZSwgc2VsZi5mYWN0TmFtZSwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXVtpZF07XG4gICAgICAgIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0tLTtcbiAgICAgICAgaWYgKHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl0gPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb25bY29sbGVjdGlvbl07XG4gICAgICAgICAgZGVsZXRlIHNlbGYubGlzdGVuZXJzQnlDb2xsZWN0aW9uQ291bnRbY29sbGVjdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vIEZpcmUgdGhlIHByb3ZpZGVkICdub3RpZmljYXRpb24nIChhbiBvYmplY3Qgd2hvc2UgYXR0cmlidXRlXG4gIC8vIHZhbHVlcyBhcmUgYWxsIEpTT04tY29tcGF0aWJpbGUpIC0tIGluZm9ybSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzXG4gIC8vIChyZWdpc3RlcmVkIHdpdGggbGlzdGVuKCkpLlxuICAvL1xuICAvLyBJZiBmaXJlKCkgaXMgY2FsbGVkIGluc2lkZSBhIHdyaXRlIGZlbmNlLCB0aGVuIGVhY2ggb2YgdGhlXG4gIC8vIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBpbnNpZGUgdGhlIHdyaXRlIGZlbmNlIGFzIHdlbGwuXG4gIC8vXG4gIC8vIFRoZSBsaXN0ZW5lcnMgbWF5IGJlIGludm9rZWQgaW4gcGFyYWxsZWwsIHJhdGhlciB0aGFuIHNlcmlhbGx5LlxuICBmaXJlOiBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIGNvbGxlY3Rpb24gPSBzZWxmLl9jb2xsZWN0aW9uRm9yTWVzc2FnZShub3RpZmljYXRpb24pO1xuXG4gICAgaWYgKCEgXy5oYXMoc2VsZi5saXN0ZW5lcnNCeUNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb24gPSBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXTtcbiAgICB2YXIgY2FsbGJhY2tJZHMgPSBbXTtcbiAgICBfLmVhY2gobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgZnVuY3Rpb24gKGwsIGlkKSB7XG4gICAgICBpZiAoc2VsZi5fbWF0Y2hlcyhub3RpZmljYXRpb24sIGwudHJpZ2dlcikpIHtcbiAgICAgICAgY2FsbGJhY2tJZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW5lciBjYWxsYmFja3MgY2FuIHlpZWxkLCBzbyB3ZSBuZWVkIHRvIGZpcnN0IGZpbmQgYWxsIHRoZSBvbmVzIHRoYXRcbiAgICAvLyBtYXRjaCBpbiBhIHNpbmdsZSBpdGVyYXRpb24gb3ZlciBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbiAod2hpY2ggY2FuJ3RcbiAgICAvLyBiZSBtdXRhdGVkIGR1cmluZyB0aGlzIGl0ZXJhdGlvbiksIGFuZCB0aGVuIGludm9rZSB0aGUgbWF0Y2hpbmdcbiAgICAvLyBjYWxsYmFja3MsIGNoZWNraW5nIGJlZm9yZSBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoZXkgaGF2ZW4ndCBzdG9wcGVkLlxuICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoYXRcbiAgICAvLyBzZWxmLmxpc3RlbmVyc0J5Q29sbGVjdGlvbltjb2xsZWN0aW9uXSBzdGlsbCA9PT0gbGlzdGVuZXJzRm9yQ29sbGVjdGlvbixcbiAgICAvLyBiZWNhdXNlIHRoZSBvbmx5IHdheSB0aGF0IHN0b3BzIGJlaW5nIHRydWUgaXMgaWYgbGlzdGVuZXJzRm9yQ29sbGVjdGlvblxuICAgIC8vIGZpcnN0IGdldHMgcmVkdWNlZCBkb3duIHRvIHRoZSBlbXB0eSBvYmplY3QgKGFuZCB0aGVuIG5ldmVyIGdldHNcbiAgICAvLyBpbmNyZWFzZWQgYWdhaW4pLlxuICAgIF8uZWFjaChjYWxsYmFja0lkcywgZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoXy5oYXMobGlzdGVuZXJzRm9yQ29sbGVjdGlvbiwgaWQpKSB7XG4gICAgICAgIGxpc3RlbmVyc0ZvckNvbGxlY3Rpb25baWRdLmNhbGxiYWNrKG5vdGlmaWNhdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gQSBub3RpZmljYXRpb24gbWF0Y2hlcyBhIHRyaWdnZXIgaWYgYWxsIGtleXMgdGhhdCBleGlzdCBpbiBib3RoIGFyZSBlcXVhbC5cbiAgLy9cbiAgLy8gRXhhbXBsZXM6XG4gIC8vICBOOntjb2xsZWN0aW9uOiBcIkNcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIG5vbi10YXJnZXRlZCBxdWVyeSlcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGEgbm9uLXRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCJ9IG1hdGNoZXMgVDp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn1cbiAgLy8gICAgKGEgbm9uLXRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBtYXRjaGVzIGFcbiAgLy8gICAgIHRhcmdldGVkIHF1ZXJ5KVxuICAvLyAgTjp7Y29sbGVjdGlvbjogXCJDXCIsIGlkOiBcIlhcIn0gbWF0Y2hlcyBUOntjb2xsZWN0aW9uOiBcIkNcIiwgaWQ6IFwiWFwifVxuICAvLyAgICAoYSB0YXJnZXRlZCB3cml0ZSB0byBhIGNvbGxlY3Rpb24gbWF0Y2hlcyBhIHRhcmdldGVkIHF1ZXJ5IHRhcmdldGVkXG4gIC8vICAgICBhdCB0aGUgc2FtZSBkb2N1bWVudClcbiAgLy8gIE46e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJYXCJ9IGRvZXMgbm90IG1hdGNoIFQ6e2NvbGxlY3Rpb246IFwiQ1wiLCBpZDogXCJZXCJ9XG4gIC8vICAgIChhIHRhcmdldGVkIHdyaXRlIHRvIGEgY29sbGVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhIHRhcmdldGVkIHF1ZXJ5XG4gIC8vICAgICB0YXJnZXRlZCBhdCBhIGRpZmZlcmVudCBkb2N1bWVudClcbiAgX21hdGNoZXM6IGZ1bmN0aW9uIChub3RpZmljYXRpb24sIHRyaWdnZXIpIHtcbiAgICAvLyBNb3N0IG5vdGlmaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGNyb3NzYmFyIGhhdmUgYSBzdHJpbmcgYGNvbGxlY3Rpb25gIGFuZFxuICAgIC8vIG1heWJlIGFuIGBpZGAgdGhhdCBpcyBhIHN0cmluZyBvciBPYmplY3RJRC4gV2UncmUgYWxyZWFkeSBkaXZpZGluZyB1cFxuICAgIC8vIHRyaWdnZXJzIGJ5IGNvbGxlY3Rpb24sIGJ1dCBsZXQncyBmYXN0LXRyYWNrIFwibm9wZSwgZGlmZmVyZW50IElEXCIgKGFuZFxuICAgIC8vIGF2b2lkIHRoZSBvdmVybHkgZ2VuZXJpYyBFSlNPTi5lcXVhbHMpLiBUaGlzIG1ha2VzIGEgbm90aWNlYWJsZVxuICAgIC8vIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2U7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9wdWxsLzM2OTdcbiAgICBpZiAodHlwZW9mKG5vdGlmaWNhdGlvbi5pZCkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZih0cmlnZ2VyLmlkKSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgbm90aWZpY2F0aW9uLmlkICE9PSB0cmlnZ2VyLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub3RpZmljYXRpb24uaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgIHRyaWdnZXIuaWQgaW5zdGFuY2VvZiBNb25nb0lELk9iamVjdElEICYmXG4gICAgICAgICEgbm90aWZpY2F0aW9uLmlkLmVxdWFscyh0cmlnZ2VyLmlkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBfLmFsbCh0cmlnZ2VyLCBmdW5jdGlvbiAodHJpZ2dlclZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVybiAhXy5oYXMobm90aWZpY2F0aW9uLCBrZXkpIHx8XG4gICAgICAgIEVKU09OLmVxdWFscyh0cmlnZ2VyVmFsdWUsIG5vdGlmaWNhdGlvbltrZXldKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8vIFRoZSBcImludmFsaWRhdGlvbiBjcm9zc2JhclwiIGlzIGEgc3BlY2lmaWMgaW5zdGFuY2UgdXNlZCBieSB0aGUgRERQIHNlcnZlciB0b1xuLy8gaW1wbGVtZW50IHdyaXRlIGZlbmNlIG5vdGlmaWNhdGlvbnMuIExpc3RlbmVyIGNhbGxiYWNrcyBvbiB0aGlzIGNyb3NzYmFyXG4vLyBzaG91bGQgY2FsbCBiZWdpbldyaXRlIG9uIHRoZSBjdXJyZW50IHdyaXRlIGZlbmNlIGJlZm9yZSB0aGV5IHJldHVybiwgaWYgdGhleVxuLy8gd2FudCB0byBkZWxheSB0aGUgd3JpdGUgZmVuY2UgZnJvbSBmaXJpbmcgKGllLCB0aGUgRERQIG1ldGhvZC1kYXRhLXVwZGF0ZWRcbi8vIG1lc3NhZ2UgZnJvbSBiZWluZyBzZW50KS5cbkREUFNlcnZlci5fSW52YWxpZGF0aW9uQ3Jvc3NiYXIgPSBuZXcgRERQU2VydmVyLl9Dcm9zc2Jhcih7XG4gIGZhY3ROYW1lOiBcImludmFsaWRhdGlvbi1jcm9zc2Jhci1saXN0ZW5lcnNcIlxufSk7XG4iLCJpZiAocHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwpIHtcbiAgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCA9XG4gICAgcHJvY2Vzcy5lbnYuRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkw7XG59XG5cbk1ldGVvci5zZXJ2ZXIgPSBuZXcgU2VydmVyO1xuXG5NZXRlb3IucmVmcmVzaCA9IGZ1bmN0aW9uIChub3RpZmljYXRpb24pIHtcbiAgRERQU2VydmVyLl9JbnZhbGlkYXRpb25Dcm9zc2Jhci5maXJlKG5vdGlmaWNhdGlvbik7XG59O1xuXG4vLyBQcm94eSB0aGUgcHVibGljIG1ldGhvZHMgb2YgTWV0ZW9yLnNlcnZlciBzbyB0aGV5IGNhblxuLy8gYmUgY2FsbGVkIGRpcmVjdGx5IG9uIE1ldGVvci5cbl8uZWFjaChbJ3B1Ymxpc2gnLCAnbWV0aG9kcycsICdjYWxsJywgJ2FwcGx5JywgJ29uQ29ubmVjdGlvbicsICdvbk1lc3NhZ2UnXSxcbiAgICAgICBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgTWV0ZW9yW25hbWVdID0gXy5iaW5kKE1ldGVvci5zZXJ2ZXJbbmFtZV0sIE1ldGVvci5zZXJ2ZXIpO1xuICAgICAgIH0pO1xuXG4vLyBNZXRlb3Iuc2VydmVyIHVzZWQgdG8gYmUgY2FsbGVkIE1ldGVvci5kZWZhdWx0X3NlcnZlci4gUHJvdmlkZVxuLy8gYmFja2NvbXBhdCBhcyBhIGNvdXJ0ZXN5IGV2ZW4gdGhvdWdoIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkLlxuLy8gWFhYIENPTVBBVCBXSVRIIDAuNi40XG5NZXRlb3IuZGVmYXVsdF9zZXJ2ZXIgPSBNZXRlb3Iuc2VydmVyO1xuIl19 diff --git a/server/bundle/programs/server/packages/ddp-server.js.map b/server/bundle/programs/server/packages/ddp-server.js.map index 7f7cbe1659..066ef88f20 100644 --- a/server/bundle/programs/server/packages/ddp-server.js.map +++ b/server/bundle/programs/server/packages/ddp-server.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","jsessionid","USE_JSESSIONID","disable_cors","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","stack","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function () { },\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID,\n // 禁用cors,防止请求response返回Access-Control-Allow-Origin:*\n disable_cors: true\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({ server_id: \"0\" }));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function () {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function (event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function (request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function (oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception.stack);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/ddp-server/stream_server.js","meteor://💻app/packages/ddp-server/livedata_server.js","meteor://💻app/packages/ddp-server/writefence.js","meteor://💻app/packages/ddp-server/crossbar.js","meteor://💻app/packages/ddp-server/server_convenience.js"],"names":["url","Npm","require","websocketExtensions","_","once","extensions","websocketCompressionConfig","process","env","SERVER_WEBSOCKET_COMPRESSION","JSON","parse","push","configure","pathPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","StreamServer","self","registration_callbacks","open_sockets","prefix","RoutePolicy","declare","sockjs","serverOptions","log","heartbeat_delay","disconnect_delay","disable_cors","DISABLE_SOCKJS_CORS","jsessionid","USE_JSESSIONID","DISABLE_WEBSOCKETS","websocket","faye_server_options","server","createServer","WebApp","httpServer","removeListener","_timeoutAdjustmentRequestCallback","installHandlers","addListener","_redirectWebsocketEndpoint","on","socket","setWebsocketTimeout","timeout","protocol","_session","recv","connection","setTimeout","send","data","write","without","stringify","server_id","each","callback","extend","prototype","register","all_sockets","values","event","oldHttpServerListeners","listeners","slice","removeAllListeners","newListener","request","args","arguments","parsedUrl","pathname","format","oldListener","apply","DDPServer","Fiber","SessionDocumentView","existsIn","Set","dataByKey","Map","_SessionDocumentView","getFields","ret","forEach","precedenceList","key","value","clearField","subscriptionHandle","changeCollector","get","removedValue","undefined","i","length","precedence","splice","delete","EJSON","equals","changeField","isAdd","clone","has","set","elt","find","SessionCollectionView","collectionName","sessionCallbacks","documents","callbacks","_SessionCollectionView","isEmpty","size","diff","previous","DiffSequence","diffMaps","both","bind","diffDocument","rightOnly","id","nowDV","added","leftOnly","prevDV","removed","fields","diffObjects","prev","now","changed","docView","add","changedResult","Error","err","Session","version","options","Random","initialized","inQueue","Meteor","_DoubleEndedQueue","blocked","workerRunning","_namedSubs","_universalSubs","userId","collectionViews","_isSending","_dontStartNewUniversalSubs","_pendingReady","_closeCallbacks","_socketUrl","_respondToPings","respondToPings","connectionHandle","close","onClose","fn","cb","bindEnvironment","defer","clientAddress","_clientAddress","httpHeaders","headers","msg","session","startUniversalSubs","run","heartbeatInterval","heartbeat","DDPCommon","Heartbeat","heartbeatTimeout","onTimeout","sendPing","start","Package","Facts","incrementServerFact","sendReady","subscriptionIds","subs","subscriptionId","sendAdded","collection","sendChanged","sendRemoved","getSendCallbacks","getCollectionView","view","handlers","universal_publish_handlers","handler","_startSubscription","stop","_meteorSession","_deactivateAllSubscriptions","_removeSession","_printSentDDP","_debug","stringifyDDP","sendError","reason","offendingMessage","processMessage","msg_in","messageReceived","processNext","shift","unblock","onMessageHook","protocol_handlers","call","sub","name","params","Array","publish_handlers","error","DDPRateLimiter","rateLimiterInput","type","connectionId","_increment","rateLimitResult","_check","allowed","getErrorMessage","timeToReset","unsub","_stopSubscription","method","randomSeed","fence","_WriteFence","onAllCommitted","retire","methods","method_handlers","arm","setUserId","_setUserId","invocation","MethodInvocation","isSimulation","promise","Promise","resolve","reject","_CurrentWriteFence","withValue","DDP","_CurrentMethodInvocation","maybeAuditArgumentChecks","finish","payload","then","result","exception","wrapInternalException","_eachSub","f","_diffCollectionViews","beforeCVs","leftValue","rightValue","doc","_deactivate","oldNamedSubs","newSub","_recreate","_runHandler","_noYieldsAllowed","subId","Subscription","subName","maybeSub","_name","_removeAllDocuments","response","httpForwardedCount","parseInt","remoteAddress","forwardedFor","isString","trim","split","_handler","_subscriptionId","_params","_subscriptionHandle","_deactivated","_stopCallbacks","_documents","_ready","_idFilter","idStringify","MongoID","idParse","res","_CurrentPublicationInvocation","e","_isDeactivated","_publishHandlerResult","isCursor","c","_publishCursor","ready","isArray","all","collectionNames","_getCollectionName","cur","_callStopCallbacks","collectionDocs","strId","onStop","ids","Server","defaults","onConnectionHook","Hook","debugPrintExceptions","sessions","stream_server","raw_msg","_printReceivedDDP","parseDDP","_handleConnect","onConnection","onMessage","support","contains","SUPPORTED_DDP_VERSIONS","calculateVersion","publish","isObject","autopublish","is_auto","warned_about_autopublish","func","pop","callAsync","applyAsync","await","currentMethodInvocation","currentPublicationInvocation","makeRpcSeed","_urlForSession","sessionId","clientSupportedVersions","serverSupportedVersions","correctVersion","_calculateVersion","context","isClientSafe","originalMessage","message","details","_expectedByTest","stack","sanitizedError","description","Match","_failIfArgumentsAreNotAllChecked","Future","armed","fired","retired","outstanding_writes","before_fire_callbacks","completion_callbacks","EnvironmentVariable","beginWrite","committed","_maybeFire","onBeforeFire","armAndWait","future","wait","invokeCallback","_Crossbar","nextId","listenersByCollection","listenersByCollectionCount","factPackage","factName","_collectionForMessage","listen","trigger","record","fire","notification","listenersForCollection","callbackIds","l","_matches","ObjectID","triggerValue","_InvalidationCrossbar","DDP_DEFAULT_CONNECTION_URL","refresh","default_server"],"mappings":"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","file":"/packages/ddp-server.js","sourcesContent":["var url = Npm.require('url');\n\n// By default, we use the permessage-deflate extension with default\n// configuration. If $SERVER_WEBSOCKET_COMPRESSION is set, then it must be valid\n// JSON. If it represents a falsey value, then we do not use permessage-deflate\n// at all; otherwise, the JSON value is used as an argument to deflate's\n// configure method; see\n// https://github.com/faye/permessage-deflate-node/blob/master/README.md\n//\n// (We do this in an _.once instead of at startup, because we don't want to\n// crash the tool during isopacket load if your JSON doesn't parse. This is only\n// a problem because the tool has to load the DDP server code just in order to\n// be a DDP client; see https://github.com/meteor/meteor/issues/3452 .)\nvar websocketExtensions = _.once(function () {\n var extensions = [];\n\n var websocketCompressionConfig = process.env.SERVER_WEBSOCKET_COMPRESSION\n ? JSON.parse(process.env.SERVER_WEBSOCKET_COMPRESSION) : {};\n if (websocketCompressionConfig) {\n extensions.push(Npm.require('permessage-deflate').configure(\n websocketCompressionConfig\n ));\n }\n\n return extensions;\n});\n\nvar pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || \"\";\n\nStreamServer = function () {\n var self = this;\n self.registration_callbacks = [];\n self.open_sockets = [];\n\n // Because we are installing directly onto WebApp.httpServer instead of using\n // WebApp.app, we have to process the path prefix ourselves.\n self.prefix = pathPrefix + '/sockjs';\n RoutePolicy.declare(self.prefix + '/', 'network');\n\n // set up sockjs\n var sockjs = Npm.require('sockjs');\n var serverOptions = {\n prefix: self.prefix,\n log: function () { },\n // this is the default, but we code it explicitly because we depend\n // on it in stream_client:HEARTBEAT_TIMEOUT\n heartbeat_delay: 45000,\n // The default disconnect_delay is 5 seconds, but if the server ends up CPU\n // bound for that much time, SockJS might not notice that the user has\n // reconnected because the timer (of disconnect_delay ms) can fire before\n // SockJS processes the new connection. Eventually we'll fix this by not\n // combining CPU-heavy processing with SockJS termination (eg a proxy which\n // converts to Unix sockets) but for now, raise the delay.\n disconnect_delay: 60 * 1000,\n // Allow disabling of CORS requests to address\n // https://github.com/meteor/meteor/issues/8317.\n disable_cors: !!process.env.DISABLE_SOCKJS_CORS,\n // Set the USE_JSESSIONID environment variable to enable setting the\n // JSESSIONID cookie. This is useful for setting up proxies with\n // session affinity.\n jsessionid: !!process.env.USE_JSESSIONID\n };\n\n // If you know your server environment (eg, proxies) will prevent websockets\n // from ever working, set $DISABLE_WEBSOCKETS and SockJS clients (ie,\n // browsers) will not waste time attempting to use them.\n // (Your server will still have a /websocket endpoint.)\n if (process.env.DISABLE_WEBSOCKETS) {\n serverOptions.websocket = false;\n } else {\n serverOptions.faye_server_options = {\n extensions: websocketExtensions()\n };\n }\n\n self.server = sockjs.createServer(serverOptions);\n\n // Install the sockjs handlers, but we want to keep around our own particular\n // request handler that adjusts idle timeouts while we have an outstanding\n // request. This compensates for the fact that sockjs removes all listeners\n // for \"request\" to add its own.\n WebApp.httpServer.removeListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n self.server.installHandlers(WebApp.httpServer);\n WebApp.httpServer.addListener(\n 'request', WebApp._timeoutAdjustmentRequestCallback);\n\n // Support the /websocket endpoint\n self._redirectWebsocketEndpoint();\n\n self.server.on('connection', function (socket) {\n // We want to make sure that if a client connects to us and does the initial\n // Websocket handshake but never gets to the DDP handshake, that we\n // eventually kill the socket. Once the DDP handshake happens, DDP\n // heartbeating will work. And before the Websocket handshake, the timeouts\n // we set at the server level in webapp_server.js will work. But\n // faye-websocket calls setTimeout(0) on any socket it takes over, so there\n // is an \"in between\" state where this doesn't happen. We work around this\n // by explicitly setting the socket timeout to a relatively large time here,\n // and setting it back to zero when we set up the heartbeat in\n // livedata_server.js.\n socket.setWebsocketTimeout = function (timeout) {\n if ((socket.protocol === 'websocket' ||\n socket.protocol === 'websocket-raw')\n && socket._session.recv) {\n socket._session.recv.connection.setTimeout(timeout);\n }\n };\n socket.setWebsocketTimeout(45 * 1000);\n\n socket.send = function (data) {\n socket.write(data);\n };\n socket.on('close', function () {\n self.open_sockets = _.without(self.open_sockets, socket);\n });\n self.open_sockets.push(socket);\n\n // XXX COMPAT WITH 0.6.6. Send the old style welcome message, which\n // will force old clients to reload. Remove this once we're not\n // concerned about people upgrading from a pre-0.7.0 release. Also,\n // remove the clause in the client that ignores the welcome message\n // (livedata_connection.js)\n socket.send(JSON.stringify({ server_id: \"0\" }));\n\n // call all our callbacks when we get a new socket. they will do the\n // work of setting up handlers and such for specific messages.\n _.each(self.registration_callbacks, function (callback) {\n callback(socket);\n });\n });\n\n};\n\n_.extend(StreamServer.prototype, {\n // call my callback when a new socket connects.\n // also call it for all current connections.\n register: function (callback) {\n var self = this;\n self.registration_callbacks.push(callback);\n _.each(self.all_sockets(), function (socket) {\n callback(socket);\n });\n },\n\n // get a list of all sockets\n all_sockets: function () {\n var self = this;\n return _.values(self.open_sockets);\n },\n\n // Redirect /websocket to /sockjs/websocket in order to not expose\n // sockjs to clients that want to use raw websockets\n _redirectWebsocketEndpoint: function () {\n var self = this;\n // Unfortunately we can't use a connect middleware here since\n // sockjs installs itself prior to all existing listeners\n // (meaning prior to any connect middlewares) so we need to take\n // an approach similar to overshadowListeners in\n // https://github.com/sockjs/sockjs-node/blob/cf820c55af6a9953e16558555a31decea554f70e/src/utils.coffee\n _.each(['request', 'upgrade'], function (event) {\n var httpServer = WebApp.httpServer;\n var oldHttpServerListeners = httpServer.listeners(event).slice(0);\n httpServer.removeAllListeners(event);\n\n // request and upgrade have different arguments passed but\n // we only care about the first one which is always request\n var newListener = function (request /*, moreArguments */) {\n // Store arguments for use within the closure below\n var args = arguments;\n\n // Rewrite /websocket and /websocket/ urls to /sockjs/websocket while\n // preserving query string.\n var parsedUrl = url.parse(request.url);\n if (parsedUrl.pathname === pathPrefix + '/websocket' ||\n parsedUrl.pathname === pathPrefix + '/websocket/') {\n parsedUrl.pathname = self.prefix + '/websocket';\n request.url = url.format(parsedUrl);\n }\n _.each(oldHttpServerListeners, function (oldListener) {\n oldListener.apply(httpServer, args);\n });\n };\n httpServer.addListener(event, newListener);\n });\n }\n});\n","DDPServer = {};\n\nvar Fiber = Npm.require('fibers');\n\n// This file contains classes:\n// * Session - The server's connection to a single DDP client\n// * Subscription - A single subscription for a single client\n// * Server - An entire server that may talk to > 1 client. A DDP endpoint.\n//\n// Session and Subscription are file scope. For now, until we freeze\n// the interface, Server is package scope (in the future it should be\n// exported.)\n\n// Represents a single document in a SessionCollectionView\nvar SessionDocumentView = function () {\n var self = this;\n self.existsIn = new Set(); // set of subscriptionHandle\n self.dataByKey = new Map(); // key-> [ {subscriptionHandle, value} by precedence]\n};\n\nDDPServer._SessionDocumentView = SessionDocumentView;\n\n\n_.extend(SessionDocumentView.prototype, {\n\n getFields: function () {\n var self = this;\n var ret = {};\n self.dataByKey.forEach(function (precedenceList, key) {\n ret[key] = precedenceList[0].value;\n });\n return ret;\n },\n\n clearField: function (subscriptionHandle, key, changeCollector) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n var precedenceList = self.dataByKey.get(key);\n\n // It's okay to clear fields that didn't exist. No need to throw\n // an error.\n if (!precedenceList)\n return;\n\n var removedValue = undefined;\n for (var i = 0; i < precedenceList.length; i++) {\n var precedence = precedenceList[i];\n if (precedence.subscriptionHandle === subscriptionHandle) {\n // The view's value can only change if this subscription is the one that\n // used to have precedence.\n if (i === 0)\n removedValue = precedence.value;\n precedenceList.splice(i, 1);\n break;\n }\n }\n if (precedenceList.length === 0) {\n self.dataByKey.delete(key);\n changeCollector[key] = undefined;\n } else if (removedValue !== undefined &&\n !EJSON.equals(removedValue, precedenceList[0].value)) {\n changeCollector[key] = precedenceList[0].value;\n }\n },\n\n changeField: function (subscriptionHandle, key, value,\n changeCollector, isAdd) {\n var self = this;\n // Publish API ignores _id if present in fields\n if (key === \"_id\")\n return;\n\n // Don't share state with the data passed in by the user.\n value = EJSON.clone(value);\n\n if (!self.dataByKey.has(key)) {\n self.dataByKey.set(key, [{subscriptionHandle: subscriptionHandle,\n value: value}]);\n changeCollector[key] = value;\n return;\n }\n var precedenceList = self.dataByKey.get(key);\n var elt;\n if (!isAdd) {\n elt = precedenceList.find(function (precedence) {\n return precedence.subscriptionHandle === subscriptionHandle;\n });\n }\n\n if (elt) {\n if (elt === precedenceList[0] && !EJSON.equals(value, elt.value)) {\n // this subscription is changing the value of this field.\n changeCollector[key] = value;\n }\n elt.value = value;\n } else {\n // this subscription is newly caring about this field\n precedenceList.push({subscriptionHandle: subscriptionHandle, value: value});\n }\n\n }\n});\n\n/**\n * Represents a client's view of a single collection\n * @param {String} collectionName Name of the collection it represents\n * @param {Object.} sessionCallbacks The callbacks for added, changed, removed\n * @class SessionCollectionView\n */\nvar SessionCollectionView = function (collectionName, sessionCallbacks) {\n var self = this;\n self.collectionName = collectionName;\n self.documents = new Map();\n self.callbacks = sessionCallbacks;\n};\n\nDDPServer._SessionCollectionView = SessionCollectionView;\n\n\n_.extend(SessionCollectionView.prototype, {\n\n isEmpty: function () {\n var self = this;\n return self.documents.size === 0;\n },\n\n diff: function (previous) {\n var self = this;\n DiffSequence.diffMaps(previous.documents, self.documents, {\n both: _.bind(self.diffDocument, self),\n\n rightOnly: function (id, nowDV) {\n self.callbacks.added(self.collectionName, id, nowDV.getFields());\n },\n\n leftOnly: function (id, prevDV) {\n self.callbacks.removed(self.collectionName, id);\n }\n });\n },\n\n diffDocument: function (id, prevDV, nowDV) {\n var self = this;\n var fields = {};\n DiffSequence.diffObjects(prevDV.getFields(), nowDV.getFields(), {\n both: function (key, prev, now) {\n if (!EJSON.equals(prev, now))\n fields[key] = now;\n },\n rightOnly: function (key, now) {\n fields[key] = now;\n },\n leftOnly: function(key, prev) {\n fields[key] = undefined;\n }\n });\n self.callbacks.changed(self.collectionName, id, fields);\n },\n\n added: function (subscriptionHandle, id, fields) {\n var self = this;\n var docView = self.documents.get(id);\n var added = false;\n if (!docView) {\n added = true;\n docView = new SessionDocumentView();\n self.documents.set(id, docView);\n }\n docView.existsIn.add(subscriptionHandle);\n var changeCollector = {};\n _.each(fields, function (value, key) {\n docView.changeField(\n subscriptionHandle, key, value, changeCollector, true);\n });\n if (added)\n self.callbacks.added(self.collectionName, id, changeCollector);\n else\n self.callbacks.changed(self.collectionName, id, changeCollector);\n },\n\n changed: function (subscriptionHandle, id, changed) {\n var self = this;\n var changedResult = {};\n var docView = self.documents.get(id);\n if (!docView)\n throw new Error(\"Could not find element with id \" + id + \" to change\");\n _.each(changed, function (value, key) {\n if (value === undefined)\n docView.clearField(subscriptionHandle, key, changedResult);\n else\n docView.changeField(subscriptionHandle, key, value, changedResult);\n });\n self.callbacks.changed(self.collectionName, id, changedResult);\n },\n\n removed: function (subscriptionHandle, id) {\n var self = this;\n var docView = self.documents.get(id);\n if (!docView) {\n var err = new Error(\"Removed nonexistent document \" + id);\n throw err;\n }\n docView.existsIn.delete(subscriptionHandle);\n if (docView.existsIn.size === 0) {\n // it is gone from everyone\n self.callbacks.removed(self.collectionName, id);\n self.documents.delete(id);\n } else {\n var changed = {};\n // remove this subscription from every precedence list\n // and record the changes\n docView.dataByKey.forEach(function (precedenceList, key) {\n docView.clearField(subscriptionHandle, key, changed);\n });\n\n self.callbacks.changed(self.collectionName, id, changed);\n }\n }\n});\n\n/******************************************************************************/\n/* Session */\n/******************************************************************************/\n\nvar Session = function (server, version, socket, options) {\n var self = this;\n self.id = Random.id();\n\n self.server = server;\n self.version = version;\n\n self.initialized = false;\n self.socket = socket;\n\n // set to null when the session is destroyed. multiple places below\n // use this to determine if the session is alive or not.\n self.inQueue = new Meteor._DoubleEndedQueue();\n\n self.blocked = false;\n self.workerRunning = false;\n\n // Sub objects for active subscriptions\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n self.userId = null;\n\n self.collectionViews = new Map();\n\n // Set this to false to not send messages when collectionViews are\n // modified. This is done when rerunning subs in _setUserId and those messages\n // are calculated via a diff instead.\n self._isSending = true;\n\n // If this is true, don't start a newly-created universal publisher on this\n // session. The session will take care of starting it when appropriate.\n self._dontStartNewUniversalSubs = false;\n\n // when we are rerunning subscriptions, any ready messages\n // we want to buffer up for when we are done rerunning subscriptions\n self._pendingReady = [];\n\n // List of callbacks to call when this connection is closed.\n self._closeCallbacks = [];\n\n\n // XXX HACK: If a sockjs connection, save off the URL. This is\n // temporary and will go away in the near future.\n self._socketUrl = socket.url;\n\n // Allow tests to disable responding to pings.\n self._respondToPings = options.respondToPings;\n\n // This object is the public interface to the session. In the public\n // API, it is called the `connection` object. Internally we call it\n // a `connectionHandle` to avoid ambiguity.\n self.connectionHandle = {\n id: self.id,\n close: function () {\n self.close();\n },\n onClose: function (fn) {\n var cb = Meteor.bindEnvironment(fn, \"connection onClose callback\");\n if (self.inQueue) {\n self._closeCallbacks.push(cb);\n } else {\n // if we're already closed, call the callback.\n Meteor.defer(cb);\n }\n },\n clientAddress: self._clientAddress(),\n httpHeaders: self.socket.headers\n };\n\n self.send({ msg: 'connected', session: self.id });\n\n // On initial connect, spin up all the universal publishers.\n Fiber(function () {\n self.startUniversalSubs();\n }).run();\n\n if (version !== 'pre1' && options.heartbeatInterval !== 0) {\n // We no longer need the low level timeout because we have heartbeating.\n socket.setWebsocketTimeout(0);\n\n self.heartbeat = new DDPCommon.Heartbeat({\n heartbeatInterval: options.heartbeatInterval,\n heartbeatTimeout: options.heartbeatTimeout,\n onTimeout: function () {\n self.close();\n },\n sendPing: function () {\n self.send({msg: 'ping'});\n }\n });\n self.heartbeat.start();\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", 1);\n};\n\n_.extend(Session.prototype, {\n\n sendReady: function (subscriptionIds) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"ready\", subs: subscriptionIds});\n else {\n _.each(subscriptionIds, function (subscriptionId) {\n self._pendingReady.push(subscriptionId);\n });\n }\n },\n\n sendAdded: function (collectionName, id, fields) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"added\", collection: collectionName, id: id, fields: fields});\n },\n\n sendChanged: function (collectionName, id, fields) {\n var self = this;\n if (_.isEmpty(fields))\n return;\n\n if (self._isSending) {\n self.send({\n msg: \"changed\",\n collection: collectionName,\n id: id,\n fields: fields\n });\n }\n },\n\n sendRemoved: function (collectionName, id) {\n var self = this;\n if (self._isSending)\n self.send({msg: \"removed\", collection: collectionName, id: id});\n },\n\n getSendCallbacks: function () {\n var self = this;\n return {\n added: _.bind(self.sendAdded, self),\n changed: _.bind(self.sendChanged, self),\n removed: _.bind(self.sendRemoved, self)\n };\n },\n\n getCollectionView: function (collectionName) {\n var self = this;\n var ret = self.collectionViews.get(collectionName);\n if (!ret) {\n ret = new SessionCollectionView(collectionName,\n self.getSendCallbacks());\n self.collectionViews.set(collectionName, ret);\n }\n return ret;\n },\n\n added: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.added(subscriptionHandle, id, fields);\n },\n\n removed: function (subscriptionHandle, collectionName, id) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.removed(subscriptionHandle, id);\n if (view.isEmpty()) {\n self.collectionViews.delete(collectionName);\n }\n },\n\n changed: function (subscriptionHandle, collectionName, id, fields) {\n var self = this;\n var view = self.getCollectionView(collectionName);\n view.changed(subscriptionHandle, id, fields);\n },\n\n startUniversalSubs: function () {\n var self = this;\n // Make a shallow copy of the set of universal handlers and start them. If\n // additional universal publishers start while we're running them (due to\n // yielding), they will run separately as part of Server.publish.\n var handlers = _.clone(self.server.universal_publish_handlers);\n _.each(handlers, function (handler) {\n self._startSubscription(handler);\n });\n },\n\n // Destroy this session and unregister it at the server.\n close: function () {\n var self = this;\n\n // Destroy this session, even if it's not registered at the\n // server. Stop all processing and tear everything down. If a socket\n // was attached, close it.\n\n // Already destroyed.\n if (! self.inQueue)\n return;\n\n // Drop the merge box data immediately.\n self.inQueue = null;\n self.collectionViews = new Map();\n\n if (self.heartbeat) {\n self.heartbeat.stop();\n self.heartbeat = null;\n }\n\n if (self.socket) {\n self.socket.close();\n self.socket._meteorSession = null;\n }\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"sessions\", -1);\n\n Meteor.defer(function () {\n // stop callbacks can yield, so we defer this on close.\n // sub._isDeactivated() detects that we set inQueue to null and\n // treats it as semi-deactivated (it will ignore incoming callbacks, etc).\n self._deactivateAllSubscriptions();\n\n // Defer calling the close callbacks, so that the caller closing\n // the session isn't waiting for all the callbacks to complete.\n _.each(self._closeCallbacks, function (callback) {\n callback();\n });\n });\n\n // Unregister the session.\n self.server._removeSession(self);\n },\n\n // Send a message (doing nothing if no socket is connected right now.)\n // It should be a JSON object (it will be stringified.)\n send: function (msg) {\n var self = this;\n if (self.socket) {\n if (Meteor._printSentDDP)\n Meteor._debug(\"Sent DDP\", DDPCommon.stringifyDDP(msg));\n self.socket.send(DDPCommon.stringifyDDP(msg));\n }\n },\n\n // Send a connection error.\n sendError: function (reason, offendingMessage) {\n var self = this;\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n self.send(msg);\n },\n\n // Process 'msg' as an incoming message. (But as a guard against\n // race conditions during reconnection, ignore the message if\n // 'socket' is not the currently connected socket.)\n //\n // We run the messages from the client one at a time, in the order\n // given by the client. The message handler is passed an idempotent\n // function 'unblock' which it may call to allow other messages to\n // begin running in parallel in another fiber (for example, a method\n // that wants to yield.) Otherwise, it is automatically unblocked\n // when it returns.\n //\n // Actually, we don't have to 'totally order' the messages in this\n // way, but it's the easiest thing that's correct. (unsub needs to\n // be ordered against sub, methods need to be ordered against each\n // other.)\n processMessage: function (msg_in) {\n var self = this;\n if (!self.inQueue) // we have been destroyed.\n return;\n\n // Respond to ping and pong messages immediately without queuing.\n // If the negotiated DDP version is \"pre1\" which didn't support\n // pings, preserve the \"pre1\" behavior of responding with a \"bad\n // request\" for the unknown messages.\n //\n // Fibers are needed because heartbeat uses Meteor.setTimeout, which\n // needs a Fiber. We could actually use regular setTimeout and avoid\n // these new fibers, but it is easier to just make everything use\n // Meteor.setTimeout and not think too hard.\n //\n // Any message counts as receiving a pong, as it demonstrates that\n // the client is still alive.\n if (self.heartbeat) {\n Fiber(function () {\n self.heartbeat.messageReceived();\n }).run();\n }\n\n if (self.version !== 'pre1' && msg_in.msg === 'ping') {\n if (self._respondToPings)\n self.send({msg: \"pong\", id: msg_in.id});\n return;\n }\n if (self.version !== 'pre1' && msg_in.msg === 'pong') {\n // Since everything is a pong, nothing to do\n return;\n }\n\n self.inQueue.push(msg_in);\n if (self.workerRunning)\n return;\n self.workerRunning = true;\n\n var processNext = function () {\n var msg = self.inQueue && self.inQueue.shift();\n if (!msg) {\n self.workerRunning = false;\n return;\n }\n\n Fiber(function () {\n var blocked = true;\n\n var unblock = function () {\n if (!blocked)\n return; // idempotent\n blocked = false;\n processNext();\n };\n\n self.server.onMessageHook.each(function (callback) {\n callback(msg, self);\n return true;\n });\n\n if (_.has(self.protocol_handlers, msg.msg))\n self.protocol_handlers[msg.msg].call(self, msg, unblock);\n else\n self.sendError('Bad request', msg);\n unblock(); // in case the handler didn't already do it\n }).run();\n };\n\n processNext();\n },\n\n protocol_handlers: {\n sub: function (msg) {\n var self = this;\n\n // reject malformed messages\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.name) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array))) {\n self.sendError(\"Malformed subscription\", msg);\n return;\n }\n\n if (!self.server.publish_handlers[msg.name]) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(404, `Subscription '${msg.name}' not found`)});\n return;\n }\n\n if (self._namedSubs.has(msg.id))\n // subs are idempotent, or rather, they are ignored if a sub\n // with that id already exists. this is important during\n // reconnect.\n return;\n\n // XXX It'd be much better if we had generic hooks where any package can\n // hook into subscription handling, but in the mean while we special case\n // ddp-rate-limiter package. This is also done for weak requirements to\n // add the ddp-rate-limiter package in case we don't have Accounts. A\n // user trying to use the ddp-rate-limiter must explicitly require it.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"subscription\",\n name: msg.name,\n connectionId: self.id\n };\n\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput);\n if (!rateLimitResult.allowed) {\n self.send({\n msg: 'nosub', id: msg.id,\n error: new Meteor.Error(\n 'too-many-requests',\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset})\n });\n return;\n }\n }\n\n var handler = self.server.publish_handlers[msg.name];\n\n self._startSubscription(handler, msg.id, msg.params, msg.name);\n\n },\n\n unsub: function (msg) {\n var self = this;\n\n self._stopSubscription(msg.id);\n },\n\n method: function (msg, unblock) {\n var self = this;\n\n // reject malformed messages\n // For now, we silently ignore unknown attributes,\n // for forwards compatibility.\n if (typeof (msg.id) !== \"string\" ||\n typeof (msg.method) !== \"string\" ||\n (('params' in msg) && !(msg.params instanceof Array)) ||\n (('randomSeed' in msg) && (typeof msg.randomSeed !== \"string\"))) {\n self.sendError(\"Malformed method invocation\", msg);\n return;\n }\n\n var randomSeed = msg.randomSeed || null;\n\n // set up to mark the method as satisfied once all observers\n // (and subscriptions) have reacted to any writes that were\n // done.\n var fence = new DDPServer._WriteFence;\n fence.onAllCommitted(function () {\n // Retire the fence so that future writes are allowed.\n // This means that callbacks like timers are free to use\n // the fence, and if they fire before it's armed (for\n // example, because the method waits for them) their\n // writes will be included in the fence.\n fence.retire();\n self.send({\n msg: 'updated', methods: [msg.id]});\n });\n\n // find the handler\n var handler = self.server.method_handlers[msg.method];\n if (!handler) {\n self.send({\n msg: 'result', id: msg.id,\n error: new Meteor.Error(404, `Method '${msg.method}' not found`)});\n fence.arm();\n return;\n }\n\n var setUserId = function(userId) {\n self._setUserId(userId);\n };\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId: self.userId,\n setUserId: setUserId,\n unblock: unblock,\n connection: self.connectionHandle,\n randomSeed: randomSeed\n });\n\n const promise = new Promise((resolve, reject) => {\n // XXX It'd be better if we could hook into method handlers better but\n // for now, we need to check if the ddp-rate-limiter exists since we\n // have a weak requirement for the ddp-rate-limiter package to be added\n // to our application.\n if (Package['ddp-rate-limiter']) {\n var DDPRateLimiter = Package['ddp-rate-limiter'].DDPRateLimiter;\n var rateLimiterInput = {\n userId: self.userId,\n clientAddress: self.connectionHandle.clientAddress,\n type: \"method\",\n name: msg.method,\n connectionId: self.id\n };\n DDPRateLimiter._increment(rateLimiterInput);\n var rateLimitResult = DDPRateLimiter._check(rateLimiterInput)\n if (!rateLimitResult.allowed) {\n reject(new Meteor.Error(\n \"too-many-requests\",\n DDPRateLimiter.getErrorMessage(rateLimitResult),\n {timeToReset: rateLimitResult.timeToReset}\n ));\n return;\n }\n }\n\n resolve(DDPServer._CurrentWriteFence.withValue(\n fence,\n () => DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, msg.params,\n \"call to '\" + msg.method + \"'\"\n )\n )\n ));\n });\n\n function finish() {\n fence.arm();\n unblock();\n }\n\n const payload = {\n msg: \"result\",\n id: msg.id\n };\n\n promise.then((result) => {\n finish();\n if (result !== undefined) {\n payload.result = result;\n }\n self.send(payload);\n }, (exception) => {\n finish();\n payload.error = wrapInternalException(\n exception,\n `while invoking method '${msg.method}'`\n );\n self.send(payload);\n });\n }\n },\n\n _eachSub: function (f) {\n var self = this;\n self._namedSubs.forEach(f);\n self._universalSubs.forEach(f);\n },\n\n _diffCollectionViews: function (beforeCVs) {\n var self = this;\n DiffSequence.diffMaps(beforeCVs, self.collectionViews, {\n both: function (collectionName, leftValue, rightValue) {\n rightValue.diff(leftValue);\n },\n rightOnly: function (collectionName, rightValue) {\n rightValue.documents.forEach(function (docView, id) {\n self.sendAdded(collectionName, id, docView.getFields());\n });\n },\n leftOnly: function (collectionName, leftValue) {\n leftValue.documents.forEach(function (doc, id) {\n self.sendRemoved(collectionName, id);\n });\n }\n });\n },\n\n // Sets the current user id in all appropriate contexts and reruns\n // all subscriptions\n _setUserId: function(userId) {\n var self = this;\n\n if (userId !== null && typeof userId !== \"string\")\n throw new Error(\"setUserId must be called on string or null, not \" +\n typeof userId);\n\n // Prevent newly-created universal subscriptions from being added to our\n // session; they will be found below when we call startUniversalSubs.\n //\n // (We don't have to worry about named subscriptions, because we only add\n // them when we process a 'sub' message. We are currently processing a\n // 'method' message, and the method did not unblock, because it is illegal\n // to call setUserId after unblock. Thus we cannot be concurrently adding a\n // new named subscription.)\n self._dontStartNewUniversalSubs = true;\n\n // Prevent current subs from updating our collectionViews and call their\n // stop callbacks. This may yield.\n self._eachSub(function (sub) {\n sub._deactivate();\n });\n\n // All subs should now be deactivated. Stop sending messages to the client,\n // save the state of the published collections, reset to an empty view, and\n // update the userId.\n self._isSending = false;\n var beforeCVs = self.collectionViews;\n self.collectionViews = new Map();\n self.userId = userId;\n\n // _setUserId is normally called from a Meteor method with\n // DDP._CurrentMethodInvocation set. But DDP._CurrentMethodInvocation is not\n // expected to be set inside a publish function, so we temporary unset it.\n // Inside a publish function DDP._CurrentPublicationInvocation is set.\n DDP._CurrentMethodInvocation.withValue(undefined, function () {\n // Save the old named subs, and reset to having no subscriptions.\n var oldNamedSubs = self._namedSubs;\n self._namedSubs = new Map();\n self._universalSubs = [];\n\n oldNamedSubs.forEach(function (sub, subscriptionId) {\n var newSub = sub._recreate();\n self._namedSubs.set(subscriptionId, newSub);\n // nb: if the handler throws or calls this.error(), it will in fact\n // immediately send its 'nosub'. This is OK, though.\n newSub._runHandler();\n });\n\n // Allow newly-created universal subs to be started on our connection in\n // parallel with the ones we're spinning up here, and spin up universal\n // subs.\n self._dontStartNewUniversalSubs = false;\n self.startUniversalSubs();\n });\n\n // Start sending messages again, beginning with the diff from the previous\n // state of the world to the current state. No yields are allowed during\n // this diff, so that other changes cannot interleave.\n Meteor._noYieldsAllowed(function () {\n self._isSending = true;\n self._diffCollectionViews(beforeCVs);\n if (!_.isEmpty(self._pendingReady)) {\n self.sendReady(self._pendingReady);\n self._pendingReady = [];\n }\n });\n },\n\n _startSubscription: function (handler, subId, params, name) {\n var self = this;\n\n var sub = new Subscription(\n self, handler, subId, params, name);\n if (subId)\n self._namedSubs.set(subId, sub);\n else\n self._universalSubs.push(sub);\n\n sub._runHandler();\n },\n\n // tear down specified subscription\n _stopSubscription: function (subId, error) {\n var self = this;\n\n var subName = null;\n if (subId) {\n var maybeSub = self._namedSubs.get(subId);\n if (maybeSub) {\n subName = maybeSub._name;\n maybeSub._removeAllDocuments();\n maybeSub._deactivate();\n self._namedSubs.delete(subId);\n }\n }\n\n var response = {msg: 'nosub', id: subId};\n\n if (error) {\n response.error = wrapInternalException(\n error,\n subName ? (\"from sub \" + subName + \" id \" + subId)\n : (\"from sub id \" + subId));\n }\n\n self.send(response);\n },\n\n // tear down all subscriptions. Note that this does NOT send removed or nosub\n // messages, since we assume the client is gone.\n _deactivateAllSubscriptions: function () {\n var self = this;\n\n self._namedSubs.forEach(function (sub, id) {\n sub._deactivate();\n });\n self._namedSubs = new Map();\n\n self._universalSubs.forEach(function (sub) {\n sub._deactivate();\n });\n self._universalSubs = [];\n },\n\n // Determine the remote client's IP address, based on the\n // HTTP_FORWARDED_COUNT environment variable representing how many\n // proxies the server is behind.\n _clientAddress: function () {\n var self = this;\n\n // For the reported client address for a connection to be correct,\n // the developer must set the HTTP_FORWARDED_COUNT environment\n // variable to an integer representing the number of hops they\n // expect in the `x-forwarded-for` header. E.g., set to \"1\" if the\n // server is behind one proxy.\n //\n // This could be computed once at startup instead of every time.\n var httpForwardedCount = parseInt(process.env['HTTP_FORWARDED_COUNT']) || 0;\n\n if (httpForwardedCount === 0)\n return self.socket.remoteAddress;\n\n var forwardedFor = self.socket.headers[\"x-forwarded-for\"];\n if (! _.isString(forwardedFor))\n return null;\n forwardedFor = forwardedFor.trim().split(/\\s*,\\s*/);\n\n // Typically the first value in the `x-forwarded-for` header is\n // the original IP address of the client connecting to the first\n // proxy. However, the end user can easily spoof the header, in\n // which case the first value(s) will be the fake IP address from\n // the user pretending to be a proxy reporting the original IP\n // address value. By counting HTTP_FORWARDED_COUNT back from the\n // end of the list, we ensure that we get the IP address being\n // reported by *our* first proxy.\n\n if (httpForwardedCount < 0 || httpForwardedCount > forwardedFor.length)\n return null;\n\n return forwardedFor[forwardedFor.length - httpForwardedCount];\n }\n});\n\n/******************************************************************************/\n/* Subscription */\n/******************************************************************************/\n\n// ctor for a sub handle: the input to each publish function\n\n// Instance name is this because it's usually referred to as this inside a\n// publish\n/**\n * @summary The server's side of a subscription\n * @class Subscription\n * @instanceName this\n * @showInstanceName true\n */\nvar Subscription = function (\n session, handler, subscriptionId, params, name) {\n var self = this;\n self._session = session; // type is Session\n\n /**\n * @summary Access inside the publish function. The incoming [connection](#meteor_onconnection) for this subscription.\n * @locus Server\n * @name connection\n * @memberOf Subscription\n * @instance\n */\n self.connection = session.connectionHandle; // public API object\n\n self._handler = handler;\n\n // my subscription ID (generated by client, undefined for universal subs).\n self._subscriptionId = subscriptionId;\n // undefined for universal subs\n self._name = name;\n\n self._params = params || [];\n\n // Only named subscriptions have IDs, but we need some sort of string\n // internally to keep track of all subscriptions inside\n // SessionDocumentViews. We use this subscriptionHandle for that.\n if (self._subscriptionId) {\n self._subscriptionHandle = 'N' + self._subscriptionId;\n } else {\n self._subscriptionHandle = 'U' + Random.id();\n }\n\n // has _deactivate been called?\n self._deactivated = false;\n\n // stop callbacks to g/c this sub. called w/ zero arguments.\n self._stopCallbacks = [];\n\n // the set of (collection, documentid) that this subscription has\n // an opinion about\n self._documents = new Map();\n\n // remember if we are ready.\n self._ready = false;\n\n // Part of the public API: the user of this sub.\n\n /**\n * @summary Access inside the publish function. The id of the logged-in user, or `null` if no user is logged in.\n * @locus Server\n * @memberOf Subscription\n * @name userId\n * @instance\n */\n self.userId = session.userId;\n\n // For now, the id filter is going to default to\n // the to/from DDP methods on MongoID, to\n // specifically deal with mongo/minimongo ObjectIds.\n\n // Later, you will be able to make this be \"raw\"\n // if you want to publish a collection that you know\n // just has strings for keys and no funny business, to\n // a ddp consumer that isn't minimongo\n\n self._idFilter = {\n idStringify: MongoID.idStringify,\n idParse: MongoID.idParse\n };\n\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", 1);\n};\n\n_.extend(Subscription.prototype, {\n _runHandler: function () {\n // XXX should we unblock() here? Either before running the publish\n // function, or before running _publishCursor.\n //\n // Right now, each publish function blocks all future publishes and\n // methods waiting on data from Mongo (or whatever else the function\n // blocks on). This probably slows page load in common cases.\n\n var self = this;\n try {\n var res = DDP._CurrentPublicationInvocation.withValue(\n self,\n () => maybeAuditArgumentChecks(\n self._handler, self, EJSON.clone(self._params),\n // It's OK that this would look weird for universal subscriptions,\n // because they have no arguments so there can never be an\n // audit-argument-checks failure.\n \"publisher '\" + self._name + \"'\"\n )\n );\n } catch (e) {\n self.error(e);\n return;\n }\n\n // Did the handler call this.error or this.stop?\n if (self._isDeactivated())\n return;\n\n self._publishHandlerResult(res);\n },\n\n _publishHandlerResult: function (res) {\n // SPECIAL CASE: Instead of writing their own callbacks that invoke\n // this.added/changed/ready/etc, the user can just return a collection\n // cursor or array of cursors from the publish function; we call their\n // _publishCursor method which starts observing the cursor and publishes the\n // results. Note that _publishCursor does NOT call ready().\n //\n // XXX This uses an undocumented interface which only the Mongo cursor\n // interface publishes. Should we make this interface public and encourage\n // users to implement it themselves? Arguably, it's unnecessary; users can\n // already write their own functions like\n // var publishMyReactiveThingy = function (name, handler) {\n // Meteor.publish(name, function () {\n // var reactiveThingy = handler();\n // reactiveThingy.publishMe();\n // });\n // };\n\n var self = this;\n var isCursor = function (c) {\n return c && c._publishCursor;\n };\n if (isCursor(res)) {\n try {\n res._publishCursor(self);\n } catch (e) {\n self.error(e);\n return;\n }\n // _publishCursor only returns after the initial added callbacks have run.\n // mark subscription as ready.\n self.ready();\n } else if (_.isArray(res)) {\n // check all the elements are cursors\n if (! _.all(res, isCursor)) {\n self.error(new Error(\"Publish function returned an array of non-Cursors\"));\n return;\n }\n // find duplicate collection names\n // XXX we should support overlapping cursors, but that would require the\n // merge box to allow overlap within a subscription\n var collectionNames = {};\n for (var i = 0; i < res.length; ++i) {\n var collectionName = res[i]._getCollectionName();\n if (_.has(collectionNames, collectionName)) {\n self.error(new Error(\n \"Publish function returned multiple cursors for collection \" +\n collectionName));\n return;\n }\n collectionNames[collectionName] = true;\n };\n\n try {\n _.each(res, function (cur) {\n cur._publishCursor(self);\n });\n } catch (e) {\n self.error(e);\n return;\n }\n self.ready();\n } else if (res) {\n // truthy values other than cursors or arrays are probably a\n // user mistake (possible returning a Mongo document via, say,\n // `coll.findOne()`).\n self.error(new Error(\"Publish function can only return a Cursor or \"\n + \"an array of Cursors\"));\n }\n },\n\n // This calls all stop callbacks and prevents the handler from updating any\n // SessionCollectionViews further. It's used when the user unsubscribes or\n // disconnects, as well as during setUserId re-runs. It does *NOT* send\n // removed messages for the published objects; if that is necessary, call\n // _removeAllDocuments first.\n _deactivate: function() {\n var self = this;\n if (self._deactivated)\n return;\n self._deactivated = true;\n self._callStopCallbacks();\n Package['facts-base'] && Package['facts-base'].Facts.incrementServerFact(\n \"livedata\", \"subscriptions\", -1);\n },\n\n _callStopCallbacks: function () {\n var self = this;\n // tell listeners, so they can clean up\n var callbacks = self._stopCallbacks;\n self._stopCallbacks = [];\n _.each(callbacks, function (callback) {\n callback();\n });\n },\n\n // Send remove messages for every document.\n _removeAllDocuments: function () {\n var self = this;\n Meteor._noYieldsAllowed(function () {\n self._documents.forEach(function (collectionDocs, collectionName) {\n collectionDocs.forEach(function (strId) {\n self.removed(collectionName, self._idFilter.idParse(strId));\n });\n });\n });\n },\n\n // Returns a new Subscription for the same session with the same\n // initial creation parameters. This isn't a clone: it doesn't have\n // the same _documents cache, stopped state or callbacks; may have a\n // different _subscriptionHandle, and gets its userId from the\n // session, not from this object.\n _recreate: function () {\n var self = this;\n return new Subscription(\n self._session, self._handler, self._subscriptionId, self._params,\n self._name);\n },\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription, triggering a call on the client to the `onStop` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any. If `error` is not a [`Meteor.Error`](#meteor_error), it will be [sanitized](#meteor_error).\n * @locus Server\n * @param {Error} error The error to pass to the client.\n * @instance\n * @memberOf Subscription\n */\n error: function (error) {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId, error);\n },\n\n // Note that while our DDP client will notice that you've called stop() on the\n // server (and clean up its _subscriptions table) we don't actually provide a\n // mechanism for an app to notice this (the subscribe onError callback only\n // triggers if there is an error).\n\n /**\n * @summary Call inside the publish function. Stops this client's subscription and invokes the client's `onStop` callback with no error.\n * @locus Server\n * @instance\n * @memberOf Subscription\n */\n stop: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n self._session._stopSubscription(self._subscriptionId);\n },\n\n /**\n * @summary Call inside the publish function. Registers a callback function to run when the subscription is stopped.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {Function} func The callback function\n */\n onStop: function (callback) {\n var self = this;\n callback = Meteor.bindEnvironment(callback, 'onStop callback', self);\n if (self._isDeactivated())\n callback();\n else\n self._stopCallbacks.push(callback);\n },\n\n // This returns true if the sub has been deactivated, *OR* if the session was\n // destroyed but the deferred call to _deactivateAllSubscriptions hasn't\n // happened yet.\n _isDeactivated: function () {\n var self = this;\n return self._deactivated || self._session.inQueue === null;\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been added to the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the new document.\n * @param {String} id The new document's ID.\n * @param {Object} fields The fields in the new document. If `_id` is present it is ignored.\n */\n added: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n let ids = self._documents.get(collectionName);\n if (ids == null) {\n ids = new Set();\n self._documents.set(collectionName, ids);\n }\n ids.add(id);\n self._session.added(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document in the record set has been modified.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that contains the changed document.\n * @param {String} id The changed document's ID.\n * @param {Object} fields The fields in the document that have changed, together with their new values. If a field is not present in `fields` it was left unchanged; if it is present in `fields` and has a value of `undefined` it was removed from the document. If `_id` is present it is ignored.\n */\n changed: function (collectionName, id, fields) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n self._session.changed(self._subscriptionHandle, collectionName, id, fields);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that a document has been removed from the record set.\n * @locus Server\n * @memberOf Subscription\n * @instance\n * @param {String} collection The name of the collection that the document has been removed from.\n * @param {String} id The ID of the document that has been removed.\n */\n removed: function (collectionName, id) {\n var self = this;\n if (self._isDeactivated())\n return;\n id = self._idFilter.idStringify(id);\n // We don't bother to delete sets of things in a collection if the\n // collection is empty. It could break _removeAllDocuments.\n self._documents.get(collectionName).delete(id);\n self._session.removed(self._subscriptionHandle, collectionName, id);\n },\n\n /**\n * @summary Call inside the publish function. Informs the subscriber that an initial, complete snapshot of the record set has been sent. This will trigger a call on the client to the `onReady` callback passed to [`Meteor.subscribe`](#meteor_subscribe), if any.\n * @locus Server\n * @memberOf Subscription\n * @instance\n */\n ready: function () {\n var self = this;\n if (self._isDeactivated())\n return;\n if (!self._subscriptionId)\n return; // unnecessary but ignored for universal sub\n if (!self._ready) {\n self._session.sendReady([self._subscriptionId]);\n self._ready = true;\n }\n }\n});\n\n/******************************************************************************/\n/* Server */\n/******************************************************************************/\n\nServer = function (options) {\n var self = this;\n\n // The default heartbeat interval is 30 seconds on the server and 35\n // seconds on the client. Since the client doesn't need to send a\n // ping as long as it is receiving pings, this means that pings\n // normally go from the server to the client.\n //\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n self.options = _.defaults(options || {}, {\n heartbeatInterval: 15000,\n heartbeatTimeout: 15000,\n // For testing, allow responding to pings to be disabled.\n respondToPings: true\n });\n\n // Map of callbacks to call when a new connection comes in to the\n // server and completes DDP version negotiation. Use an object instead\n // of an array so we can safely remove one from the list while\n // iterating over it.\n self.onConnectionHook = new Hook({\n debugPrintExceptions: \"onConnection callback\"\n });\n\n // Map of callbacks to call when a new message comes in.\n self.onMessageHook = new Hook({\n debugPrintExceptions: \"onMessage callback\"\n });\n\n self.publish_handlers = {};\n self.universal_publish_handlers = [];\n\n self.method_handlers = {};\n\n self.sessions = new Map(); // map from id to session\n\n self.stream_server = new StreamServer;\n\n self.stream_server.register(function (socket) {\n // socket implements the SockJSConnection interface\n socket._meteorSession = null;\n\n var sendError = function (reason, offendingMessage) {\n var msg = {msg: 'error', reason: reason};\n if (offendingMessage)\n msg.offendingMessage = offendingMessage;\n socket.send(DDPCommon.stringifyDDP(msg));\n };\n\n socket.on('data', function (raw_msg) {\n if (Meteor._printReceivedDDP) {\n Meteor._debug(\"Received DDP\", raw_msg);\n }\n try {\n try {\n var msg = DDPCommon.parseDDP(raw_msg);\n } catch (err) {\n sendError('Parse error');\n return;\n }\n if (msg === null || !msg.msg) {\n sendError('Bad request', msg);\n return;\n }\n\n if (msg.msg === 'connect') {\n if (socket._meteorSession) {\n sendError(\"Already connected\", msg);\n return;\n }\n Fiber(function () {\n self._handleConnect(socket, msg);\n }).run();\n return;\n }\n\n if (!socket._meteorSession) {\n sendError('Must connect first', msg);\n return;\n }\n socket._meteorSession.processMessage(msg);\n } catch (e) {\n // XXX print stack nicely\n Meteor._debug(\"Internal exception while processing message\", msg, e);\n }\n });\n\n socket.on('close', function () {\n if (socket._meteorSession) {\n Fiber(function () {\n socket._meteorSession.close();\n }).run();\n }\n });\n });\n};\n\n_.extend(Server.prototype, {\n\n /**\n * @summary Register a callback to be called when a new DDP connection is made to the server.\n * @locus Server\n * @param {function} callback The function to call when a new DDP connection is established.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onConnection: function (fn) {\n var self = this;\n return self.onConnectionHook.register(fn);\n },\n\n /**\n * @summary Register a callback to be called when a new DDP message is received.\n * @locus Server\n * @param {function} callback The function to call when a new DDP message is received.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n onMessage: function (fn) {\n var self = this;\n return self.onMessageHook.register(fn);\n },\n\n _handleConnect: function (socket, msg) {\n var self = this;\n\n // The connect message must specify a version and an array of supported\n // versions, and it must claim to support what it is proposing.\n if (!(typeof (msg.version) === 'string' &&\n _.isArray(msg.support) &&\n _.all(msg.support, _.isString) &&\n _.contains(msg.support, msg.version))) {\n socket.send(DDPCommon.stringifyDDP({msg: 'failed',\n version: DDPCommon.SUPPORTED_DDP_VERSIONS[0]}));\n socket.close();\n return;\n }\n\n // In the future, handle session resumption: something like:\n // socket._meteorSession = self.sessions[msg.session]\n var version = calculateVersion(msg.support, DDPCommon.SUPPORTED_DDP_VERSIONS);\n\n if (msg.version !== version) {\n // The best version to use (according to the client's stated preferences)\n // is not the one the client is trying to use. Inform them about the best\n // version to use.\n socket.send(DDPCommon.stringifyDDP({msg: 'failed', version: version}));\n socket.close();\n return;\n }\n\n // Yay, version matches! Create a new session.\n // Note: Troposphere depends on the ability to mutate\n // Meteor.server.options.heartbeatTimeout! This is a hack, but it's life.\n socket._meteorSession = new Session(self, version, socket, self.options);\n self.sessions.set(socket._meteorSession.id, socket._meteorSession);\n self.onConnectionHook.each(function (callback) {\n if (socket._meteorSession)\n callback(socket._meteorSession.connectionHandle);\n return true;\n });\n },\n /**\n * Register a publish handler function.\n *\n * @param name {String} identifier for query\n * @param handler {Function} publish handler\n * @param options {Object}\n *\n * Server will call handler function on each new subscription,\n * either when receiving DDP sub message for a named subscription, or on\n * DDP connect for a universal subscription.\n *\n * If name is null, this will be a subscription that is\n * automatically established and permanently on for all connected\n * client, instead of a subscription that can be turned on and off\n * with subscribe().\n *\n * options to contain:\n * - (mostly internal) is_auto: true if generated automatically\n * from an autopublish hook. this is for cosmetic purposes only\n * (it lets us determine whether to print a warning suggesting\n * that you turn off autopublish.)\n */\n\n /**\n * @summary Publish a record set.\n * @memberOf Meteor\n * @importFromPackage meteor\n * @locus Server\n * @param {String|Object} name If String, name of the record set. If Object, publications Dictionary of publish functions by name. If `null`, the set has no name, and the record set is automatically sent to all connected clients.\n * @param {Function} func Function called on the server each time a client subscribes. Inside the function, `this` is the publish handler object, described below. If the client passed arguments to `subscribe`, the function is called with the same arguments.\n */\n publish: function (name, handler, options) {\n var self = this;\n\n if (! _.isObject(name)) {\n options = options || {};\n\n if (name && name in self.publish_handlers) {\n Meteor._debug(\"Ignoring duplicate publish named '\" + name + \"'\");\n return;\n }\n\n if (Package.autopublish && !options.is_auto) {\n // They have autopublish on, yet they're trying to manually\n // picking stuff to publish. They probably should turn off\n // autopublish. (This check isn't perfect -- if you create a\n // publish before you turn on autopublish, it won't catch\n // it. But this will definitely handle the simple case where\n // you've added the autopublish package to your app, and are\n // calling publish from your app code.)\n if (!self.warned_about_autopublish) {\n self.warned_about_autopublish = true;\n Meteor._debug(\n \"** You've set up some data subscriptions with Meteor.publish(), but\\n\" +\n \"** you still have autopublish turned on. Because autopublish is still\\n\" +\n \"** on, your Meteor.publish() calls won't have much effect. All data\\n\" +\n \"** will still be sent to all clients.\\n\" +\n \"**\\n\" +\n \"** Turn off autopublish by removing the autopublish package:\\n\" +\n \"**\\n\" +\n \"** $ meteor remove autopublish\\n\" +\n \"**\\n\" +\n \"** .. and make sure you have Meteor.publish() and Meteor.subscribe() calls\\n\" +\n \"** for each collection that you want clients to see.\\n\");\n }\n }\n\n if (name)\n self.publish_handlers[name] = handler;\n else {\n self.universal_publish_handlers.push(handler);\n // Spin up the new publisher on any existing session too. Run each\n // session's subscription in a new Fiber, so that there's no change for\n // self.sessions to change while we're running this loop.\n self.sessions.forEach(function (session) {\n if (!session._dontStartNewUniversalSubs) {\n Fiber(function() {\n session._startSubscription(handler);\n }).run();\n }\n });\n }\n }\n else{\n _.each(name, function(value, key) {\n self.publish(key, value, {});\n });\n }\n },\n\n _removeSession: function (session) {\n var self = this;\n self.sessions.delete(session.id);\n },\n\n /**\n * @summary Defines functions that can be invoked over the network by clients.\n * @locus Anywhere\n * @param {Object} methods Dictionary whose keys are method names and values are functions.\n * @memberOf Meteor\n * @importFromPackage meteor\n */\n methods: function (methods) {\n var self = this;\n _.each(methods, function (func, name) {\n if (typeof func !== 'function')\n throw new Error(\"Method '\" + name + \"' must be a function\");\n if (self.method_handlers[name])\n throw new Error(\"A method named '\" + name + \"' is already defined\");\n self.method_handlers[name] = func;\n });\n },\n\n call: function (name, ...args) {\n if (args.length && typeof args[args.length - 1] === \"function\") {\n // If it's a function, the last argument is the result callback, not\n // a parameter to the remote method.\n var callback = args.pop();\n }\n\n return this.apply(name, args, callback);\n },\n\n // A version of the call method that always returns a Promise.\n callAsync: function (name, ...args) {\n return this.applyAsync(name, args);\n },\n\n apply: function (name, args, options, callback) {\n // We were passed 3 arguments. They may be either (name, args, options)\n // or (name, args, callback)\n if (! callback && typeof options === 'function') {\n callback = options;\n options = {};\n } else {\n options = options || {};\n }\n\n const promise = this.applyAsync(name, args, options);\n\n // Return the result in whichever way the caller asked for it. Note that we\n // do NOT block on the write fence in an analogous way to how the client\n // blocks on the relevant data being visible, so you are NOT guaranteed that\n // cursor observe callbacks have fired when your callback is invoked. (We\n // can change this if there's a real use case.)\n if (callback) {\n promise.then(\n result => callback(undefined, result),\n exception => callback(exception)\n );\n } else {\n return promise.await();\n }\n },\n\n // @param options {Optional Object}\n applyAsync: function (name, args, options) {\n // Run the handler\n var handler = this.method_handlers[name];\n if (! handler) {\n return Promise.reject(\n new Meteor.Error(404, `Method '${name}' not found`)\n );\n }\n\n // If this is a method call from within another method or publish function,\n // get the user state from the outer method or publish function, otherwise\n // don't allow setUserId to be called\n var userId = null;\n var setUserId = function() {\n throw new Error(\"Can't call setUserId on a server initiated method call\");\n };\n var connection = null;\n var currentMethodInvocation = DDP._CurrentMethodInvocation.get();\n var currentPublicationInvocation = DDP._CurrentPublicationInvocation.get();\n var randomSeed = null;\n if (currentMethodInvocation) {\n userId = currentMethodInvocation.userId;\n setUserId = function(userId) {\n currentMethodInvocation.setUserId(userId);\n };\n connection = currentMethodInvocation.connection;\n randomSeed = DDPCommon.makeRpcSeed(currentMethodInvocation, name);\n } else if (currentPublicationInvocation) {\n userId = currentPublicationInvocation.userId;\n setUserId = function(userId) {\n currentPublicationInvocation._session._setUserId(userId);\n };\n connection = currentPublicationInvocation.connection;\n }\n\n var invocation = new DDPCommon.MethodInvocation({\n isSimulation: false,\n userId,\n setUserId,\n connection,\n randomSeed\n });\n\n return new Promise(resolve => resolve(\n DDP._CurrentMethodInvocation.withValue(\n invocation,\n () => maybeAuditArgumentChecks(\n handler, invocation, EJSON.clone(args),\n \"internal call to '\" + name + \"'\"\n )\n )\n )).then(EJSON.clone);\n },\n\n _urlForSession: function (sessionId) {\n var self = this;\n var session = self.sessions.get(sessionId);\n if (session)\n return session._socketUrl;\n else\n return null;\n }\n});\n\nvar calculateVersion = function (clientSupportedVersions,\n serverSupportedVersions) {\n var correctVersion = _.find(clientSupportedVersions, function (version) {\n return _.contains(serverSupportedVersions, version);\n });\n if (!correctVersion) {\n correctVersion = serverSupportedVersions[0];\n }\n return correctVersion;\n};\n\nDDPServer._calculateVersion = calculateVersion;\n\n\n// \"blind\" exceptions other than those that were deliberately thrown to signal\n// errors to the client\nvar wrapInternalException = function (exception, context) {\n if (!exception) return exception;\n\n // To allow packages to throw errors intended for the client but not have to\n // depend on the Meteor.Error class, `isClientSafe` can be set to true on any\n // error before it is thrown.\n if (exception.isClientSafe) {\n if (!(exception instanceof Meteor.Error)) {\n const originalMessage = exception.message;\n exception = new Meteor.Error(exception.error, exception.reason, exception.details);\n exception.message = originalMessage;\n }\n return exception;\n }\n\n // Tests can set the '_expectedByTest' flag on an exception so it won't go to\n // the server log.\n if (!exception._expectedByTest) {\n Meteor._debug(\"Exception \" + context, exception.stack);\n if (exception.sanitizedError) {\n Meteor._debug(\"Sanitized and reported to the client as:\", exception.sanitizedError);\n Meteor._debug();\n }\n }\n\n // Did the error contain more details that could have been useful if caught in\n // server code (or if thrown from non-client-originated code), but also\n // provided a \"sanitized\" version with more context than 500 Internal server\n // error? Use that.\n if (exception.sanitizedError) {\n if (exception.sanitizedError.isClientSafe)\n return exception.sanitizedError;\n Meteor._debug(\"Exception \" + context + \" provides a sanitizedError that \" +\n \"does not have isClientSafe property set; ignoring\");\n }\n\n return new Meteor.Error(500, \"Internal server error\");\n};\n\n\n// Audit argument checks, if the audit-argument-checks package exists (it is a\n// weak dependency of this package).\nvar maybeAuditArgumentChecks = function (f, context, args, description) {\n args = args || [];\n if (Package['audit-argument-checks']) {\n return Match._failIfArgumentsAreNotAllChecked(\n f, context, args, description);\n }\n return f.apply(context, args);\n};\n","var Future = Npm.require('fibers/future');\n\n// A write fence collects a group of writes, and provides a callback\n// when all of the writes are fully committed and propagated (all\n// observers have been notified of the write and acknowledged it.)\n//\nDDPServer._WriteFence = function () {\n var self = this;\n\n self.armed = false;\n self.fired = false;\n self.retired = false;\n self.outstanding_writes = 0;\n self.before_fire_callbacks = [];\n self.completion_callbacks = [];\n};\n\n// The current write fence. When there is a current write fence, code\n// that writes to databases should register their writes with it using\n// beginWrite().\n//\nDDPServer._CurrentWriteFence = new Meteor.EnvironmentVariable;\n\n_.extend(DDPServer._WriteFence.prototype, {\n // Start tracking a write, and return an object to represent it. The\n // object has a single method, committed(). This method should be\n // called when the write is fully committed and propagated. You can\n // continue to add writes to the WriteFence up until it is triggered\n // (calls its callbacks because all writes have committed.)\n beginWrite: function () {\n var self = this;\n\n if (self.retired)\n return { committed: function () {} };\n\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to add writes\");\n\n self.outstanding_writes++;\n var committed = false;\n return {\n committed: function () {\n if (committed)\n throw new Error(\"committed called twice on the same write\");\n committed = true;\n self.outstanding_writes--;\n self._maybeFire();\n }\n };\n },\n\n // Arm the fence. Once the fence is armed, and there are no more\n // uncommitted writes, it will activate.\n arm: function () {\n var self = this;\n if (self === DDPServer._CurrentWriteFence.get())\n throw Error(\"Can't arm the current fence\");\n self.armed = true;\n self._maybeFire();\n },\n\n // Register a function to be called once before firing the fence.\n // Callback function can add new writes to the fence, in which case\n // it won't fire until those writes are done as well.\n onBeforeFire: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.before_fire_callbacks.push(func);\n },\n\n // Register a function to be called when the fence fires.\n onAllCommitted: function (func) {\n var self = this;\n if (self.fired)\n throw new Error(\"fence has already activated -- too late to \" +\n \"add a callback\");\n self.completion_callbacks.push(func);\n },\n\n // Convenience function. Arms the fence, then blocks until it fires.\n armAndWait: function () {\n var self = this;\n var future = new Future;\n self.onAllCommitted(function () {\n future['return']();\n });\n self.arm();\n future.wait();\n },\n\n _maybeFire: function () {\n var self = this;\n if (self.fired)\n throw new Error(\"write fence already activated?\");\n if (self.armed && !self.outstanding_writes) {\n function invokeCallback (func) {\n try {\n func(self);\n } catch (err) {\n Meteor._debug(\"exception in write fence callback\", err);\n }\n }\n\n self.outstanding_writes++;\n while (self.before_fire_callbacks.length > 0) {\n var callbacks = self.before_fire_callbacks;\n self.before_fire_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n self.outstanding_writes--;\n\n if (!self.outstanding_writes) {\n self.fired = true;\n var callbacks = self.completion_callbacks;\n self.completion_callbacks = [];\n _.each(callbacks, invokeCallback);\n }\n }\n },\n\n // Deactivate this fence so that adding more writes has no effect.\n // The fence must have already fired.\n retire: function () {\n var self = this;\n if (! self.fired)\n throw new Error(\"Can't retire a fence that hasn't fired.\");\n self.retired = true;\n }\n});\n","// A \"crossbar\" is a class that provides structured notification registration.\n// See _match for the definition of how a notification matches a trigger.\n// All notifications and triggers must have a string key named 'collection'.\n\nDDPServer._Crossbar = function (options) {\n var self = this;\n options = options || {};\n\n self.nextId = 1;\n // map from collection name (string) -> listener id -> object. each object has\n // keys 'trigger', 'callback'. As a hack, the empty string means \"no\n // collection\".\n self.listenersByCollection = {};\n self.listenersByCollectionCount = {};\n self.factPackage = options.factPackage || \"livedata\";\n self.factName = options.factName || null;\n};\n\n_.extend(DDPServer._Crossbar.prototype, {\n // msg is a trigger or a notification\n _collectionForMessage: function (msg) {\n var self = this;\n if (! _.has(msg, 'collection')) {\n return '';\n } else if (typeof(msg.collection) === 'string') {\n if (msg.collection === '')\n throw Error(\"Message has empty collection!\");\n return msg.collection;\n } else {\n throw Error(\"Message has non-string collection!\");\n }\n },\n\n // Listen for notification that match 'trigger'. A notification\n // matches if it has the key-value pairs in trigger as a\n // subset. When a notification matches, call 'callback', passing\n // the actual notification.\n //\n // Returns a listen handle, which is an object with a method\n // stop(). Call stop() to stop listening.\n //\n // XXX It should be legal to call fire() from inside a listen()\n // callback?\n listen: function (trigger, callback) {\n var self = this;\n var id = self.nextId++;\n\n var collection = self._collectionForMessage(trigger);\n var record = {trigger: EJSON.clone(trigger), callback: callback};\n if (! _.has(self.listenersByCollection, collection)) {\n self.listenersByCollection[collection] = {};\n self.listenersByCollectionCount[collection] = 0;\n }\n self.listenersByCollection[collection][id] = record;\n self.listenersByCollectionCount[collection]++;\n\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, 1);\n }\n\n return {\n stop: function () {\n if (self.factName && Package['facts-base']) {\n Package['facts-base'].Facts.incrementServerFact(\n self.factPackage, self.factName, -1);\n }\n delete self.listenersByCollection[collection][id];\n self.listenersByCollectionCount[collection]--;\n if (self.listenersByCollectionCount[collection] === 0) {\n delete self.listenersByCollection[collection];\n delete self.listenersByCollectionCount[collection];\n }\n }\n };\n },\n\n // Fire the provided 'notification' (an object whose attribute\n // values are all JSON-compatibile) -- inform all matching listeners\n // (registered with listen()).\n //\n // If fire() is called inside a write fence, then each of the\n // listener callbacks will be called inside the write fence as well.\n //\n // The listeners may be invoked in parallel, rather than serially.\n fire: function (notification) {\n var self = this;\n\n var collection = self._collectionForMessage(notification);\n\n if (! _.has(self.listenersByCollection, collection)) {\n return;\n }\n\n var listenersForCollection = self.listenersByCollection[collection];\n var callbackIds = [];\n _.each(listenersForCollection, function (l, id) {\n if (self._matches(notification, l.trigger)) {\n callbackIds.push(id);\n }\n });\n\n // Listener callbacks can yield, so we need to first find all the ones that\n // match in a single iteration over self.listenersByCollection (which can't\n // be mutated during this iteration), and then invoke the matching\n // callbacks, checking before each call to ensure they haven't stopped.\n // Note that we don't have to check that\n // self.listenersByCollection[collection] still === listenersForCollection,\n // because the only way that stops being true is if listenersForCollection\n // first gets reduced down to the empty object (and then never gets\n // increased again).\n _.each(callbackIds, function (id) {\n if (_.has(listenersForCollection, id)) {\n listenersForCollection[id].callback(notification);\n }\n });\n },\n\n // A notification matches a trigger if all keys that exist in both are equal.\n //\n // Examples:\n // N:{collection: \"C\"} matches T:{collection: \"C\"}\n // (a non-targeted write to a collection matches a\n // non-targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\"}\n // (a targeted write to a collection matches a non-targeted query)\n // N:{collection: \"C\"} matches T:{collection: \"C\", id: \"X\"}\n // (a non-targeted write to a collection matches a\n // targeted query)\n // N:{collection: \"C\", id: \"X\"} matches T:{collection: \"C\", id: \"X\"}\n // (a targeted write to a collection matches a targeted query targeted\n // at the same document)\n // N:{collection: \"C\", id: \"X\"} does not match T:{collection: \"C\", id: \"Y\"}\n // (a targeted write to a collection does not match a targeted query\n // targeted at a different document)\n _matches: function (notification, trigger) {\n // Most notifications that use the crossbar have a string `collection` and\n // maybe an `id` that is a string or ObjectID. We're already dividing up\n // triggers by collection, but let's fast-track \"nope, different ID\" (and\n // avoid the overly generic EJSON.equals). This makes a noticeable\n // performance difference; see https://github.com/meteor/meteor/pull/3697\n if (typeof(notification.id) === 'string' &&\n typeof(trigger.id) === 'string' &&\n notification.id !== trigger.id) {\n return false;\n }\n if (notification.id instanceof MongoID.ObjectID &&\n trigger.id instanceof MongoID.ObjectID &&\n ! notification.id.equals(trigger.id)) {\n return false;\n }\n\n return _.all(trigger, function (triggerValue, key) {\n return !_.has(notification, key) ||\n EJSON.equals(triggerValue, notification[key]);\n });\n }\n});\n\n// The \"invalidation crossbar\" is a specific instance used by the DDP server to\n// implement write fence notifications. Listener callbacks on this crossbar\n// should call beginWrite on the current write fence before they return, if they\n// want to delay the write fence from firing (ie, the DDP method-data-updated\n// message from being sent).\nDDPServer._InvalidationCrossbar = new DDPServer._Crossbar({\n factName: \"invalidation-crossbar-listeners\"\n});\n","if (process.env.DDP_DEFAULT_CONNECTION_URL) {\n __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL =\n process.env.DDP_DEFAULT_CONNECTION_URL;\n}\n\nMeteor.server = new Server;\n\nMeteor.refresh = function (notification) {\n DDPServer._InvalidationCrossbar.fire(notification);\n};\n\n// Proxy the public methods of Meteor.server so they can\n// be called directly on Meteor.\n_.each(['publish', 'methods', 'call', 'apply', 'onConnection', 'onMessage'],\n function (name) {\n Meteor[name] = _.bind(Meteor.server[name], Meteor.server);\n });\n\n// Meteor.server used to be called Meteor.default_server. Provide\n// backcompat as a courtesy even though it was never documented.\n// XXX COMPAT WITH 0.6.4\nMeteor.default_server = Meteor.server;\n"]} \ No newline at end of file diff --git a/server/bundle/star.json b/server/bundle/star.json index c70d086232..24a9f631df 100644 --- a/server/bundle/star.json +++ b/server/bundle/star.json @@ -36,5 +36,5 @@ "meteorRelease": "METEOR@1.9.3", "nodeVersion": "12.16.1", "npmVersion": "6.13.4", - "gitCommitHash": "ff3716b5435f36644aa77f696f878d48faf1f906" + "gitCommitHash": "957145ac948fb1c17342669b1451edf987f03952" } \ No newline at end of file From a86c7943ef0d0f34e0ed24e9c640a554e97e5043 Mon Sep 17 00:00:00 2001 From: chenzhipei <18605199364@163.com> Date: Fri, 19 Jul 2024 06:26:33 +0000 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=E5=AE=A1=E6=89=B9=E7=8E=8B=E4=B8=AD?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=B1=BB=E5=9E=8B=E5=90=8E=E7=BC=80=E5=90=8D?= =?UTF-8?q?=E5=A4=A7=E5=86=99=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/lib/instance_readonly_template.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee b/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee index 2c5d3084fb..cc6e62b6ed 100644 --- a/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee +++ b/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee @@ -396,7 +396,7 @@ InstanceReadOnlyTemplate.getValue = (value, field, locale, utcOffset) -> fileName = item.original.name; fileUrl = Steedos.absoluteUrl('/api/files/files/'+item._id); filePreviewHtml = ''; - if [".pdf", ".jpg", ".jpeg", ".png", ".gif"].indexOf(fileName.slice(-4)) > -1 + if [".pdf", ".jpg", ".jpeg", ".png", ".gif"].indexOf(fileName.toLowerCase().slice(-4)) > -1 filePreviewHtml = " 预览" return "
#{fileName} #{filePreviewHtml ? filePreviewHtml : ''}
" From b7de0dc518ff3a27e974b4522f7874d8da9b53ba Mon Sep 17 00:00:00 2001 From: chenzhipei <18605199364@163.com> Date: Fri, 19 Jul 2024 06:27:02 +0000 Subject: [PATCH 5/6] build creator --- .../server/packages/aldeed_autoform.js | 17 ++++++++++------- .../server/packages/steedos_workflow.js | 4 ++-- .../server/packages/steedos_workflow.js.map | 2 +- ...022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.js} | 2 +- ...6cb1bfa61d2bb99bcc85909c9bcae65.stats.json} | 8 ++++---- .../programs/web.browser.legacy/program.json | 18 +++++++++--------- ...022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.js} | 2 +- ...6cb1bfa61d2bb99bcc85909c9bcae65.stats.json} | 8 ++++---- .../bundle/programs/web.browser/program.json | 18 +++++++++--------- ...3bf48e7712221391c1ba5ef6911357ec9380d7e.js} | 2 +- ...12221391c1ba5ef6911357ec9380d7e.stats.json} | 8 ++++---- .../bundle/programs/web.cordova/program.json | 18 +++++++++--------- server/bundle/star.json | 2 +- 13 files changed, 56 insertions(+), 53 deletions(-) rename server/bundle/programs/web.browser.legacy/{7d27de16d6eab9175efa4d52871e8cc6588f4811.js => d022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.js} (88%) rename server/bundle/programs/web.browser.legacy/{7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json => d022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.stats.json} (99%) rename server/bundle/programs/web.browser/{7d27de16d6eab9175efa4d52871e8cc6588f4811.js => d022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.js} (88%) rename server/bundle/programs/web.browser/{7d27de16d6eab9175efa4d52871e8cc6588f4811.stats.json => d022e4ace6cb1bfa61d2bb99bcc85909c9bcae65.stats.json} (99%) rename server/bundle/programs/web.cordova/{717fd9820c5c4cf898af8b1c4a65e09c854f6d33.js => 93bf48e7712221391c1ba5ef6911357ec9380d7e.js} (88%) rename server/bundle/programs/web.cordova/{717fd9820c5c4cf898af8b1c4a65e09c854f6d33.stats.json => 93bf48e7712221391c1ba5ef6911357ec9380d7e.stats.json} (99%) diff --git a/server/bundle/programs/server/packages/aldeed_autoform.js b/server/bundle/programs/server/packages/aldeed_autoform.js index 8f60ab7750..439ea5b91e 100644 --- a/server/bundle/programs/server/packages/aldeed_autoform.js +++ b/server/bundle/programs/server/packages/aldeed_autoform.js @@ -9,21 +9,24 @@ var MongoObject = Package['aldeed:simple-schema'].MongoObject; var check = Package.check.check; var Match = Package.check.Match; +/* Package-scope variables */ +var AutoForm, globalDefaultTemplate, setDefaults, ArrayTracker, FormData, form_version, Hooks, getFlatDocOfFieldValues, getInputValue, getInputData, updateTrackedFieldValue, updateAllTrackedFieldValues, getAllFieldsInForm, validateField, arrayTracker, defaultTypeTemplates, deps, FormPreserve, res, Utility, year, month, date; + (function(){ -/////////////////////////////////////////////////////////////////////// -// // -// packages/aldeed_autoform/autoform-common.js // -// // -/////////////////////////////////////////////////////////////////////// - // +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// packages/aldeed_autoform/autoform-common.js // +// // +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // // This is the only file that is run on the server, too // Extend the schema options allowed by SimpleSchema SimpleSchema.extendOptions({ autoform: Match.Optional(Object) }); -/////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }).call(this); diff --git a/server/bundle/programs/server/packages/steedos_workflow.js b/server/bundle/programs/server/packages/steedos_workflow.js index 055600ee85..4457ae983f 100644 --- a/server/bundle/programs/server/packages/steedos_workflow.js +++ b/server/bundle/programs/server/packages/steedos_workflow.js @@ -3057,7 +3057,7 @@ InstanceReadOnlyTemplate.getValue = function (value, field, locale, utcOffset) { fileUrl = Steedos.absoluteUrl('/api/files/files/' + item._id); filePreviewHtml = ''; - if ([".pdf", ".jpg", ".jpeg", ".png", ".gif"].indexOf(fileName.slice(-4)) > -1) { + if ([".pdf", ".jpg", ".jpeg", ".png", ".gif"].indexOf(fileName.toLowerCase().slice(-4)) > -1) { filePreviewHtml = " 预览"; } @@ -12009,4 +12009,4 @@ Package._define("steedos:workflow", { })(); //# sourceURL=meteor://💻app/packages/steedos_workflow.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jaGVja05wbS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9saWIvVVJJLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvaW5zdGFuY2VfdGFza3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvYXV0aF90b2tlbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC9saWIvaW5zdGFuY2VfcmVhZG9ubHlfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL2luc3RhbmNlX3JlYWRvbmx5X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L2NsaWVudC9jb3JlZm9ybS9pbnB1dFR5cGVzL2NvcmVmb3JtLXRhYmxlL3N0ZWVkb3MtdGFibGUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oYW5kbGVyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL190cmFjZXNfaGFuZGxlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX2luc3RhbmNlX2F0dGFjaG1lbnRzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9faW5zdGFuY2Vfc2lnbl90ZXh0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9zaWduX3RleHQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9fdHJhY2VzX2hlbHAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oZWxwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX2luc3RhbmNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldFNwYWNlVXNlcnMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldEZvcm11bGFVc2VyT2JqZWN0cy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvaW5pdF9mb3JtdWxhX3ZhbHVlcy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvYXBpX3dvcmtmbG93X2ZvcndhcmQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvcm91dGVzL3Rlc3Rfd2ViaG9vay5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy90ZXN0X3dlYmhvb2suY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3NldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2dldF9pbnN0YW5jZV9kYXRhLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL3NhdmVfaW5zdGFuY2UuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvc2VydmVyL21ldGhvZHMvdHJhY2VfYXBwcm92ZV9jYy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mb3J3YXJkX2luc3RhbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2Nmc19pbnN0YW5jZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfYXBwcm92ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfcmV0dXJuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV9yZW1pbmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL25leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX251bWJlcl9ydWxlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvY2hlY2tfbWFpbl9hdHRhY2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9lZGl0X2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9zdGFydF9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV90cmFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX2JhdGNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9oaWRlX2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV92YWx1ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3JvdXRlcy9pbnN0YW5jZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvaW5zdGFuY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9yb3V0ZXMvc3RlZWRvc19jc3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL3N0ZWVkb3NfY3NzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9saWIvMV9mb3JtX2Zvcm11bGEuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19wb3NpdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9mbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZm9ybXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zvcm1zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RyYWZ0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV9kcmFmdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9mbG93LXRlbXBsYXRlL3dvcmtmbG93X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL2Zsb3ctdGVtcGxhdGUvd29ya2Zsb3dfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9zY2hlZHVsZS9hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc2NoZWR1bGUvYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvc2NoZWR1bGUvdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zY2hlZHVsZS90aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3RhYnVsYXIuY29mZmVlIl0sIm5hbWVzIjpbImNoZWNrTnBtVmVyc2lvbnMiLCJtb2R1bGUiLCJsaW5rIiwidiIsInJvb3QiLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiVVJJIiwicHVueWNvZGUiLCJJUHY2IiwiU2Vjb25kTGV2ZWxEb21haW5zIiwiU0xEIiwiX1VSSSIsInVybCIsImJhc2UiLCJfdXJsU3VwcGxpZWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJfYmFzZVN1cHBsaWVkIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwibG9jYXRpb24iLCJocmVmIiwiYWJzb2x1dGVUbyIsInZlcnNpb24iLCJwIiwicHJvdG90eXBlIiwiaGFzT3duIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJlc2NhcGVSZWdFeCIsInN0cmluZyIsInJlcGxhY2UiLCJnZXRUeXBlIiwidmFsdWUiLCJTdHJpbmciLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImlzQXJyYXkiLCJvYmoiLCJmaWx0ZXJBcnJheVZhbHVlcyIsImRhdGEiLCJsb29rdXAiLCJpIiwiX21hdGNoIiwidGVzdCIsInNwbGljZSIsImFycmF5Q29udGFpbnMiLCJsaXN0IiwiX3R5cGUiLCJtYXRjaCIsImFycmF5c0VxdWFsIiwib25lIiwidHdvIiwic29ydCIsImwiLCJ0cmltU2xhc2hlcyIsInRleHQiLCJ0cmltX2V4cHJlc3Npb24iLCJfcGFydHMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJob3N0bmFtZSIsInVybiIsInBvcnQiLCJwYXRoIiwicXVlcnkiLCJmcmFnbWVudCIsImR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyIsImVzY2FwZVF1ZXJ5U3BhY2UiLCJwcm90b2NvbF9leHByZXNzaW9uIiwiaWRuX2V4cHJlc3Npb24iLCJwdW55Y29kZV9leHByZXNzaW9uIiwiaXA0X2V4cHJlc3Npb24iLCJpcDZfZXhwcmVzc2lvbiIsImZpbmRfdXJpX2V4cHJlc3Npb24iLCJmaW5kVXJpIiwic3RhcnQiLCJlbmQiLCJ0cmltIiwiZGVmYXVsdFBvcnRzIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwid3MiLCJ3c3MiLCJpbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMiLCJkb21BdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlIiwibm9kZSIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJ0eXBlIiwiZXNjYXBlRm9yRHVtYkZpcmVmb3gzNiIsImVzY2FwZSIsInN0cmljdEVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZSIsImRlY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzbzg4NTkiLCJ1bmVzY2FwZSIsInVuaWNvZGUiLCJjaGFyYWN0ZXJzIiwicGF0aG5hbWUiLCJleHByZXNzaW9uIiwibWFwIiwicmVzZXJ2ZWQiLCJ1cm5wYXRoIiwiZW5jb2RlUXVlcnkiLCJlc2NhcGVkIiwiZGVjb2RlUXVlcnkiLCJlIiwiX3BhcnQiLCJnZW5lcmF0ZUFjY2Vzc29yIiwiX2dyb3VwIiwiYyIsImdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uIiwiX3NlcCIsIl9jb2RpbmdGdW5jTmFtZSIsIl9pbm5lckNvZGluZ0Z1bmNOYW1lIiwiYWN0dWFsQ29kaW5nRnVuYyIsInNlZ21lbnRzIiwic3BsaXQiLCJqb2luIiwiZGVjb2RlUGF0aCIsImRlY29kZVVyblBhdGgiLCJyZWNvZGVQYXRoIiwicmVjb2RlVXJuUGF0aCIsImVuY29kZVJlc2VydmVkIiwicGFyc2UiLCJwYXJ0cyIsInBvcyIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJwYXJzZUF1dGhvcml0eSIsInBhcnNlSG9zdCIsImJyYWNrZXRQb3MiLCJ0IiwiY2hhckF0IiwiZmlyc3RDb2xvbiIsImZpcnN0U2xhc2giLCJuZXh0Q29sb24iLCJwYXJzZVVzZXJpbmZvIiwibGFzdEluZGV4T2YiLCJzaGlmdCIsInBhcnNlUXVlcnkiLCJpdGVtcyIsInNwbGl0cyIsIm5hbWUiLCJwdXNoIiwiYnVpbGQiLCJidWlsZEF1dGhvcml0eSIsImJ1aWxkSG9zdCIsImJ1aWxkVXNlcmluZm8iLCJidWlsZFF1ZXJ5IiwidW5pcXVlIiwia2V5IiwiYnVpbGRRdWVyeVBhcmFtZXRlciIsImFkZFF1ZXJ5IiwiY29uY2F0IiwicmVtb3ZlUXVlcnkiLCJoYXNRdWVyeSIsIndpdGhpbkFycmF5IiwiX2Jvb2x5IiwiQm9vbGVhbiIsIm9wIiwiY29tbW9uUGF0aCIsIk1hdGgiLCJtaW4iLCJ3aXRoaW5TdHJpbmciLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJfc3RhcnQiLCJfZW5kIiwiX3RyaW0iLCJfYXR0cmlidXRlT3BlbiIsImxhc3RJbmRleCIsImV4ZWMiLCJpbmRleCIsImlnbm9yZUh0bWwiLCJhdHRyaWJ1dGVPcGVuIiwibWF4Iiwic2VhcmNoIiwiaWdub3JlIiwicmVzdWx0IiwiZW5zdXJlVmFsaWRIb3N0bmFtZSIsInRvQVNDSUkiLCJub0NvbmZsaWN0IiwicmVtb3ZlQWxsIiwidW5jb25mbGljdGVkIiwiVVJJVGVtcGxhdGUiLCJkZWZlckJ1aWxkIiwiX2RlZmVycmVkX2J1aWxkIiwiX3N0cmluZyIsImNsb25lIiwidmFsdWVPZiIsImdlbmVyYXRlU2ltcGxlQWNjZXNzb3IiLCJnZW5lcmF0ZVByZWZpeEFjY2Vzc29yIiwiX2tleSIsImhhc2giLCJyZXMiLCJfb2JqZWN0IiwiYXR0cmlidXRlIiwic3JjIiwiaXMiLCJ3aGF0IiwiaXAiLCJpcDQiLCJpcDYiLCJzbGQiLCJpZG4iLCJyZWxhdGl2ZSIsImhhcyIsIl9wcm90b2NvbCIsIl9wb3J0IiwiX2hvc3RuYW1lIiwic2NoZW1lIiwieCIsIm9yaWdpbiIsImF1dGhvcml0eSIsImhvc3QiLCJ1c2VyaW5mbyIsInJlc291cmNlIiwic3ViZG9tYWluIiwiZG9tYWluIiwic3ViIiwiUmVnRXhwIiwidGxkIiwiZ2V0IiwiUmVmZXJlbmNlRXJyb3IiLCJkaXJlY3RvcnkiLCJmaWxlbmFtZSIsImRlY29kZVBhdGhTZWdtZW50IiwibXV0YXRlZERpcmVjdG9yeSIsIm5vcm1hbGl6ZVBhdGgiLCJzdWZmaXgiLCJzIiwic2VnbWVudCIsInNlcGFyYXRvciIsImFic29sdXRlIiwiRXJyb3IiLCJwb3AiLCJ1bnNoaWZ0Iiwic2VnbWVudENvZGVkIiwicSIsInNldFF1ZXJ5Iiwic2V0U2VhcmNoIiwiYWRkU2VhcmNoIiwicmVtb3ZlU2VhcmNoIiwiaGFzU2VhcmNoIiwibm9ybWFsaXplIiwibm9ybWFsaXplUHJvdG9jb2wiLCJub3JtYWxpemVRdWVyeSIsIm5vcm1hbGl6ZUZyYWdtZW50Iiwibm9ybWFsaXplSG9zdG5hbWUiLCJub3JtYWxpemVQb3J0IiwiYmVzdCIsIl9wYXRoIiwiX3dhc19yZWxhdGl2ZSIsIl9sZWFkaW5nUGFyZW50cyIsIl9wYXJlbnQiLCJfcG9zIiwibm9ybWFsaXplUGF0aG5hbWUiLCJub3JtYWxpemVTZWFyY2giLCJub3JtYWxpemVIYXNoIiwiZCIsInJlYWRhYmxlIiwidXJpIiwidG9Vbmljb2RlIiwicXAiLCJrdiIsInJlc29sdmVkIiwicHJvcGVydGllcyIsImJhc2VkaXIiLCJyZWxhdGl2ZVRvIiwicmVsYXRpdmVQYXJ0cyIsImJhc2VQYXJ0cyIsImNvbW1vbiIsInJlbGF0aXZlUGF0aCIsImJhc2VQYXRoIiwicGFyZW50cyIsImVxdWFscyIsIm9uZV9tYXAiLCJ0d29fbWFwIiwiY2hlY2tlZCIsIm9uZV9xdWVyeSIsInR3b19xdWVyeSIsIldvcmtmbG93IiwiSW1hZ2VTaWduIiwiVHJhY2VzSGFuZGxlciIsIlRyYWNlc1RlbXBsYXRlIiwiSW5zdGFuY2Vmb3JtVGVtcGxhdGUiLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSIsIkluc3RhbmNlU2lnblRleHQiLCJSZWxhdGVkSW5zdGFuY2VzIiwiUmVsYXRlZFJlY29yZHMiLCJJbnN0YW5jZU1hY3JvIiwiY29udGV4dCIsIlRyYWNlc01hbmFnZXIiLCJpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyIsImZpZWxkX2Zvcm11bGEiLCJpbmNsdWRlc09waW5pb25GaWVsZCIsImZvcm0iLCJmb3JtX3ZlcnNpb24iLCJfZm9ybV92ZXJzaW9uIiwiZmllbGRfZm9ybXVsYXMiLCJmaWVsZHMiLCJBcnJheSIsIk1ldGVvciIsImlzU2VydmVyIiwidXVmbG93TWFuYWdlciIsImdldEZvcm1WZXJzaW9uIiwiZGIiLCJmb3JtcyIsImZpbmRPbmUiLCJfaWQiLCJmb3JtX3ZlcnNpb25zIiwiZm9yRWFjaCIsImYiLCJyZWYiLCJjb25zb2xlIiwibG9nIiwiZjEiLCJmb3JtdWxhIiwiXyIsInNvbWUiLCJoZWxwZXJzIiwiaW5zdGFuY2VfdGFza3MiLCJDb2xsZWN0aW9uIiwiX3NpbXBsZVNjaGVtYSIsIlNpbXBsZVNjaGVtYSIsImluc3RhbmNlIiwidHJhY2UiLCJpc19maW5pc2hlZCIsInVzZXIiLCJ1c2VyX25hbWUiLCJoYW5kbGVyIiwiaGFuZGxlcl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb24iLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJzdGFydF9kYXRlIiwiRGF0ZSIsImR1ZV9kYXRlIiwiaXNfcmVhZCIsImlzX2Vycm9yIiwidmFsdWVzIiwiZGVhZGxpbmUiLCJyZW1pbmRfZGF0ZSIsInJlbWluZGVkX2NvdW50IiwiTnVtYmVyIiwicmVhZF9kYXRlIiwiZGVzY3JpcHRpb24iLCJtb2RpZmllZCIsIm1vZGlmaWVkX2J5Iiwic2lnbl9zaG93IiwianVkZ2UiLCJuZXh0X3N0ZXBzIiwiZmluaXNoX2RhdGUiLCJjb3N0X3RpbWUiLCJzcGFjZSIsImluc3RhbmNlX25hbWUiLCJzdWJtaXR0ZXIiLCJzdWJtaXR0ZXJfbmFtZSIsImFwcGxpY2FudCIsImFwcGxpY2FudF9uYW1lIiwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lIiwic3VibWl0X2RhdGUiLCJmbG93IiwiZmxvd19uYW1lIiwic3RlcCIsInN0ZXBfbmFtZSIsImNhdGVnb3J5X25hbWUiLCJpbnN0YW5jZV9zdGF0ZSIsImRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSIsImZvcndhcmRfZnJvbV9pbnN0YW5jZSIsImtleXdvcmRzIiwiaXNfYXJjaGl2ZWQiLCJjYXRlZ29yeSIsImF1dGhfdG9rZW5zIiwiX2dldExvY2FsZSIsIl9nZXRSZXF1aXJlZEZpZWxkcyIsIl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsIl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyIsIl9nZXRUZW1wbGF0ZURhdGEiLCJfZ2V0Vmlld0h0bWwiLCJnZXRMaW5rVGV4dCIsIm1hcmtlZCIsInJlcXVpcmUiLCJJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUiLCJpbnN0YW5jZV9hdHRhY2htZW50IiwiYWZTZWxlY3RVc2VyUmVhZCIsImFmRm9ybUdyb3VwUmVhZCIsImFmRm9ybUdyb3VwIiwiY3JlYXRlIiwidGVtcGFsdGVOYW1lIiwic3RlZWRvc0RhdGEiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlQ29tcGlsZWQiLCJ0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uIiwiU3BhY2ViYXJzQ29tcGlsZXIiLCJjb21waWxlIiwiaXNCb2R5IiwiZXZhbCIsIlRlbXBsYXRlIiwiQmxhemUiLCJjcmVhdGVJbnN0YW5jZVNpZ25UZXh0IiwiaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkIiwiaW5zdGFuY2VTaWduVGV4dEh0bWwiLCJpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVNpZ25UZXh0IiwiY3JlYXRlSW1hZ2VTaWduIiwiaW1hZ2VTaWduQ29tcGlsZWQiLCJpbWFnZVNpZ25IdG1sIiwiaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24iLCJpbWFnZVNpZ24iLCJjcmVhdGVUcmFjZXNIYW5sZGVyIiwidHJhY2VzSGFubGRlckNvbXBpbGVkIiwidHJhY2VzSGFubGRlckh0bWwiLCJ0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZV90cmFjZXNfaGFuZGxlciIsImluaXQiLCJpdGVtIiwibGFiZWwiLCJkZXRhaWxfdXJsIiwiU3RlZWRvcyIsImFic29sdXRlVXJsIiwiZ2V0VmFsdWUiLCJmaWVsZCIsImxvY2FsZSIsInV0Y09mZnNldCIsImRhdGUiLCJmaWVsZE9wdGlvbnMiLCJob3VycyIsIm1vbnRoIiwibmFtZUZpZWxkIiwicmVjb3JkcyIsInNlY29uZHMiLCJzZWxlY3RlZE9wdGlvbiIsInNlbGVjdGVkT3B0aW9ucyIsInNwbGl0ZWRWYWx1ZXMiLCJ0MCIsInQxIiwidWlTY2hlbWEiLCJ5ZWFyIiwibiIsIml0ZW1TcGxpdHMiLCJlbmNvZGVVUkkiLCJlcnJvciIsImlzX211bHRpc2VsZWN0IiwiZ2V0UHJvcGVydHkiLCJmdWxsbmFtZSIsIlRBUGkxOG4iLCJfXyIsImZvcm1hdERhdGUiLCJmb3JtYXRUaW1lIiwiaXNfdGV4dGFyZWEiLCJmaW5kIiwiZmlsdGVyIiwiaXNfcGVyY2VudCIsIm51bWJlclRvUGVyY2VudFN0cmluZyIsImRpZ2l0cyIsIm51bWJlclRvU3RyaW5nIiwiaXNDbGllbnQiLCJhdXRoUmVxdWVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhc3luYyIsIm9iamVjdEZpbmQiLCJmaWx0ZXJzIiwiZmlsZU5hbWUiLCJmaWxlUHJldmlld0h0bWwiLCJmaWxlVXJsIiwib3JpZ2luYWwiLCJDcmVhdG9yIiwiZ2V0T2JqZWN0IiwicmVmZXJlbmNlX3RvIiwiTkFNRV9GSUVMRF9LRVkiLCJyZWZlcmVuY2VfdG9fZmllbGQiLCJnZXRPYmplY3ROYW1lRmllbGRLZXkiLCJnZXRMYWJlbCIsImNvZGUiLCJmaW5kUHJvcGVydHlCeVBLIiwiZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbiIsImZvcm1fZmllbGRzIiwiY3VycmVudCIsIndoZXJlIiwiaGlzdG9yeXMiLCJnZXRGbG93VmVyc2lvbiIsImZsb3dfdmVyc2lvbiIsImZsb3dzIiwidmlld0h0bWwiLCJBc3NldHMiLCJnZXRUZXh0IiwicmVmMSIsInRvTG9jYWxlTG93ZXJDYXNlIiwicmV2IiwiaXNfcmVxdWlyZWQiLCJzdGVwcyIsImVkaXRhYmxlQ29kZSIsInN0YXJ0U3RlcCIsImtleXMiLCJwZXJtaXNzaW9ucyIsInJlcXVpcmVkRmllbGRzIiwiaW50ZXJzZWN0aW9uIiwiV29ya2Zsb3dNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdCIsImdldEF1dG9mb3JtU2NoZW1hVmFsdWVzIiwiaW5zbmFtZSIsImluc19zdGF0ZSIsInN0YXRlIiwiaW5zX2ZpbmFsX2RlY2lzaW9uIiwiaW5zX2NvZGUiLCJpbnNfaXNfYXJjaGl2ZWQiLCJpbnNfaXNfZGVsZXRlZCIsImFwcGxpY2FudENvbnRleHQiLCJzZXNzaW9uVXNlcklkIiwiZWRpdGFibGUiLCJzdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsInBhc3NpbmciLCJtb21lbnQiLCJmb3JtYXQiLCJnZXRJbnN0YW5jZVZpZXciLCJib2R5IiwiaW5zdGFuY2VDb21waWxlZCIsImluc3RhbmNlUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVRlbXBsYXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZ2V0VGVtcGxhdGUiLCJ0ZW1wbGF0ZU5hbWUiLCJpbnN0YW5jZV9yZWFkb25seV92aWV3IiwidG9IVE1MV2l0aERhdGEiLCJnZXRUcmFjZXNWaWV3IiwidHJhY2VDb21waWxlZCIsInRyYWNlUmVuZGVyRnVuY3Rpb24iLCJ0cmFjZXNIdG1sIiwiaW5zdGFuY2Vfc3R5bGUiLCJ0cmFjZV9yZWFkb25seV92aWV3IiwidHJhY2VzIiwiZ2V0QXR0YWNobWVudFZpZXciLCJhdHRhY2htZW50Q29tcGlsZWQiLCJhdHRhY2htZW50SHRtbCIsImF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiIsImF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXciLCJnZXRSZWxhdGVkSW5zdGFuY2VzVmlldyIsInJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCIsInJlbGF0ZWRJbnN0YW5jZXNIdG1sIiwicmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9pbnN0YW5jZXNfdmlldyIsImdldFJlbGF0ZWRSZWNvcmRzVmlldyIsInJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQiLCJyZWxhdGVkUmVjb3Jkc0h0bWwiLCJyZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9yZWNvcmRzX3ZpZXciLCJnZXRPbkxvYWRTY3JpcHQiLCJmb3JtX3NjcmlwdCIsImdldEluc3RhbmNlSHRtbCIsImFsbENzc0xpbmsiLCJhdHRhY2htZW50IiwiY3JlYXRvclNlcnZpY2UiLCJjc3NIcmVmIiwiZm9ybURlc2NyaXB0aW9uIiwiZm9ybURlc2NyaXB0aW9uSHRtbCIsImh0bWwiLCJpbnNfcmVjb3JkX2lkcyIsImluc3RhbmNlQm94U3R5bGUiLCJqcUhyZWYiLCJvbkxvYWRTY3JpcHQiLCJvcGVuRmlsZVNjcmlwdCIsInJlbGF0ZWRfaW5zdGFuY2VzIiwicmVsYXRlZF9yZWNvcmRzIiwic2hvd1RyYWNlc0J0biIsInNob3dUcmFjZXNTY3JpcHQiLCJ0cmFjZUNoZWNrIiwid2lkdGgiLCJzZXR0aW5ncyIsIndlYnNlcnZpY2VzIiwiY3JlYXRvciIsInJlY29yZF9pZHMiLCJpc01vYmlsZSIsInNob3dUcmFjZSIsImZpbmFsX2RlY2lzaW9uIiwic2hvd0F0dGFjaG1lbnRzIiwiaXNFbXB0eSIsInRhZ2dlciIsInN0eWxlcyIsInBsdWdpbnMiLCJhZGRfc3R5bGVzIiwiZm9ybUlkIiwiaW5zdGFuY2VfdGl0bGUiLCJwYWdlVGl0bGUiLCJwYWdlVGl0bGVUckNsYXNzIiwidmFsIiwiQ29yZUZvcm0iLCJwYWdlVGl0bGVGaWVsZE5hbWUiLCJoYW5kbGVUYWJsZVRlbXBsYXRlIiwiX2V4cG9ydCIsInRhYmxlX2ZpZWxkcyIsInRhYmxlX2ZpZWxkIiwiZmllbGRfcGVybWlzc2lvbiIsInB1cmVDb2RlIiwicmVxdWlyZWQiLCJ0aXRsZV9wZXJtaXNzaW9uIiwicmVtb3ZlU3BlY2lhbENoYXJhY3RlciIsImlzT3BpbmlvbkZpZWxkIiwidHJfc3RhcnQiLCJ0ZF9jb2xzcGFuIiwidHJfZW5kIiwiaW5jbHVkZXMiLCJwZXJtaXNzaW9uIiwiX3RlbXBsYXRlIiwidGFibGUiLCJfdGVtcGxhdGVIZWxwcyIsInN0ZWVkb3NfaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsImF0dHMiLCJpZCIsInN0eWxlIiwiZGlzYWJsZWQiLCJpbnN0YW5jZUlkIiwiZm9ybV90eXBlcyIsIkFwcHJvdmVNYW5hZ2VyIiwiaXNSZWFkT25seSIsInN0ZWVkb3NfZm9ybSIsImlubmVyc3ViZm9ybUNvbnRleHQiLCJkb2NfdmFsdWVzIiwiU2Vzc2lvbiIsImEiLCJiIiwiZ2V0QXV0b2Zvcm1TY2hlbWEiLCJpbnN0YW5jZV9ib3hfc3R5bGUiLCJib3giLCJpbnMiLCJwcmludF90ZW1wbGF0ZSIsImluc3RhbmNlX3RlbXBsYXRlIiwiU3RlZWRvc1RhYmxlIiwiY2hlY2tJdGVtIiwiaXRlbV9pbmRleCIsImZpZWxkT2JqIiwiZ2V0RmllbGQiLCJmaWVsZFZhbCIsImdldEl0ZW1Nb2RhbFZhbHVlIiwic2ZfbmFtZSIsInNmaWVsZHMiLCJzZiIsIkluc3RhbmNlTWFuYWdlciIsImNoZWNrRm9ybUZpZWxkVmFsdWUiLCIkIiwic2V0VGFibGVJdGVtVmFsdWUiLCJpdGVtX3ZhbHVlIiwidGFibGVWYWx1ZSIsImdldFRhYmxlVmFsdWUiLCJnZXRUYWJsZUl0ZW1WYWx1ZSIsInJlbW92ZVRhYmxlSXRlbSIsInJlbW92ZWQiLCJzZXRUYWJsZVZhbHVlIiwiZ2V0VmFsaWRWYWx1ZSIsInZhbGlkVmFsdWUiLCJoYW5kbGVEYXRhIiwiaW5zdGFuY2VGaWVsZHMiLCJnZXRJbnN0YW5jZUZpZWxkcyIsImdldE1vZGFsRGF0YSIsIkZvcm1fZm9ybXVsYSIsImdldEZvcm11bGFGaWVsZFZhcmlhYmxlIiwiQXV0b0Zvcm0iLCJnZXRGb3JtVmFsdWVzIiwiaW5zZXJ0RG9jIiwiYWRkSXRlbSIsIl9pdGVtX3ZhbHVlIiwiZ2V0S2V5cyIsImFwcGVuZCIsImdldFRyIiwidXBkYXRlSXRlbSIsInRkcyIsImdldFJlbW92ZVRkIiwic2ZpZWxkIiwiZ2V0VGQiLCJlbXB0eSIsInJ1bkZvcm11bGEiLCJyZW1vdmVJdGVtIiwiaGlkZSIsInNob3dNb2RhbCIsIm1ldGhvZCIsIm1vZGFsRGF0YSIsInNldFRpbWVvdXQiLCJNb2RhbCIsInNob3ciLCJnZXRDdXJyZW50RGF0YUZvckZvcm0iLCJzcyIsImdldEZvcm1TY2hlbWEiLCJzY2hlbWEiLCJvYmplY3RLZXlzIiwiX21ha2VHZW5lcmljIiwiZ2V0VGhlYWQiLCJpc09iamVjdCIsInRoZWFkIiwidHJzIiwic2ZfbGVuZ3RoIiwid2lkZV9maWVsZHMiLCJmaWx0ZXJQcm9wZXJ0eSIsImlzX3dpZGUiLCJnZXRUYm9keSIsInNmaWVsZHNFZGl0YWJsZSIsInRib2R5IiwidHIiLCJ0ZCIsInRkX3ZhbHVlIiwiZ2V0VERWYWx1ZSIsInZpZXciLCJDRkRhdGFNYW5hZ2VyIiwiZ2V0Rm9ybXVsYVNwYWNlVXNlcnMiLCJ1IiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbnMiLCJvIiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbiIsInBsdWNrIiwiYWRkSW5wdXRUeXBlIiwidmFsdWVPdXQiLCJ2YWx1ZUNvbnZlcnRlcnMiLCJzdHJpbmdUb1N0cmluZ0FycmF5Iiwic3RyaW5nVG9OdW1iZXIiLCJzdHJpbmdUb051bWJlckFycmF5Iiwic3RyaW5nVG9Cb29sZWFuIiwic3RyaW5nVG9Cb29sZWFuQXJyYXkiLCJzdHJpbmdUb0RhdGUiLCJzdHJpbmdUb0RhdGVBcnJheSIsImNvbnRleHRBZGp1c3QiLCJtYXhsZW5ndGgiLCJhZlRhYmxlIiwiZXZlbnRzIiwiZXZlbnQiLCJuZXdfaXRlbV9pbmRleCIsImN1cnJlbnRUYXJnZXQiLCJkYXRhc2V0Iiwic2V0IiwicmVuZGVyZWQiLCJzdHIiLCJhZGRJdGVtVHIiLCJnZXRDdXJyZW50U3RlcCIsInN0ZXBfdHlwZSIsImNjSGFzRWRpdFBlcm1pc3Npb24iLCJhdXRvcnVuIiwiY3VycmVudERhdGEiLCJzcGFjZVVzZXJTaWduIiwidXNlcklkIiwic3BhY2VfdXNlcl9zaWducyIsImltYWdlVVJMIiwic2lnbiIsInNob3dTaWduSW1hZ2UiLCJ0cmFjZVNob3dTaWduSW1hZ2UiLCJvYmplY3RVcmwiLCJvYmplY3RfbmFtZSIsInJlY29yZF9pZCIsImFwcF9pZCIsImdldE9iamVjdFVybCIsInVuZW1wdHkiLCJ1bmVxdWFscyIsImluY2x1ZGUiLCJyZWYyIiwicmVmMyIsImdldEluc3RhbmNlRmxvd1ZlcnNpb24iLCJhcHByb3ZlcyIsInJlZjQiLCJhcHByb3ZlIiwianVkZ2VfbmFtZSIsIm9waW5pb25fZmllbGRzX2NvZGUiLCJzaWduX2ZpZWxkX2NvZGUiLCJhZnRlcl9maWVsZCIsImJlZm9yZV9maWVsZCIsInByZV9maWVsZHMiLCJwcmVfd2lkZV9maWVsZHMiLCJzb3J0X2FwcHJvdmUiLCJvcmRlciIsInAxIiwicDIiLCJfcDEiLCJfcDIiLCJnZXRUaW1lIiwiX3QiLCJpc1RleHRhcmVhIiwiZ2V0Q2ZDbGFzcyIsImdldFRhYmxlVGhlYWQiLCJnZXRUYWJsZUJvZHkiLCJzaG93TGFiZWwiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRPcGluaW9uRmllbGRTdGVwc05hbWUiLCJ0b3Bfa2V5d29yZHMiLCJmb28xIiwib3BpbmlvbkZpZWxkcyIsImZvbyIsImpzb25fZm9ybXVsYSIsInMxIiwiZXJyb3IxIiwieWlqaWFubGFuIiwic3RlcE5hbWUiLCJpbWFnZV9zaWduIiwib25seV9jY19vcGluaW9uIiwib25seV9jYyIsImRlZmF1bHRfZGVzY3JpcHRpb24iLCJvbmx5X2hhbmRsZXIiLCJzaG93Q0NPcGluaW9uIiwibWFya0Rvd25Ub0h0bWwiLCJtYXJrRG93blN0cmluZyIsIk5wbSIsIlNwYWNlYmFycyIsIlNhZmVTdHJpbmciLCJmX2xhYmVsIiwidGhhdCIsImlzU2VjdGlvbiIsInJlZ2lzdGVySGVscGVyIiwiaW5zX2F0dGFjaF9kb3dubG9hZF91cmwiLCJnZXRQZXJtaXNzaW9ucyIsImluc3RhbmNlZm9ybUNoYW5nZUV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvcGVuV2luZG93IiwidGFyZ2V0Iiwib25DcmVhdGVkIiwiY29tcGlsZWQiLCJpbnN0YW5jZUN1c3RvbVRlbXBsYXRlIiwiaW5zdGFuY2VWaWV3IiwicmVuZGVyRnVuY3Rpb24iLCJWaWV3IiwiaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlIiwib25SZW5kZXJlZCIsImN1cnJlbnRBcHByb3ZlIiwiY3VycmVudFN0ZXAiLCJmb3JtdWxhX2ZpZWxkcyIsImluc3RhbmNlTnVtYmVyRmllbGRzIiwic2V0SW5zdGFuY2VGb3JtQXBwbGljYW50IiwibmV4dFN0ZXBzIiwibmV4dFN0ZXBVc2VycyIsIkluc3RhbmNlRXZlbnQiLCJpbml0RXZlbnRzIiwiZ2V0Q3VycmVudEFwcHJvdmUiLCJlYWNoIiwiZWxlbWVudCIsInNjaGVtYUtleSIsInRvYXN0ciIsInJlYXNvbiIsImdldEZpZWxkVmFsdWUiLCJJbnN0YW5jZU51bWJlclJ1bGVzIiwiaW5zdGFuY2VOdW1iZXJCdWlsZGVyIiwidHJpZ2dlciIsInJ1biIsInNob3dNYWluVGl0bGUiLCJ3b3JrZmxvd01haW5BdHRhY2hUaXRsZSIsImVuYWJsZWRfYWRkX21haW5fYXR0YWNobWVudCIsImN1cnJlbnRfc3RlcCIsImN1cnJlbnRUcmFjZSIsImdldEN1cnJlbnRUcmFjZSIsIm1haW5fYXR0YWNoX2NvdW50IiwiY2ZzIiwiaW5zdGFuY2VzIiwiY291bnQiLCJkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50Iiwic3RhcnRfc3RlcCIsImdldFN0YXJ0U3RlcCIsImNhbl9lZGl0X21haW5fYXR0YWNoIiwiZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50IiwiZ2V0RmxvdyIsInVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZCIsImlzQ0MiLCJnZXRDQ1N0ZXAiLCJjYW5fZWRpdF9ub3JtYWxfYXR0YWNoIiwibWFpbl9hdHRhY2htZW50IiwibWFpbl9hdHRhY2giLCJub3JtYWxfYXR0YWNobWVudHMiLCJzZWxlY3RvciIsIiRuZSIsImRmaXMiLCJkaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIiwiJGluIiwiZGlzdHJpYnV0ZV9tYWluIiwiZmlyc3RWZXJzaW9uTWFpbiIsIm1ldGFkYXRhIiwicGFyZW50IiwiYXR0YWNobWVudFVwbG9hZGVkQXQiLCJ1cGxvYWRlZEF0IiwiZmlyc3RWZXJzaW9uIiwic29ydEJ5IiwiaW5zdGFuY2VJZHMiLCJhdHRhY2htZW50c19jb3VudCIsImZsb3dfZmlsZXMiLCJmaWxlcyIsImlzRHJhZnRBbmRGbG93ZmlsZXNFeGlzdCIsImNvbXBhY3QiLCJhdHRhY2htZW50cyIsIiRvciIsImZldGNoIiwibXlBcHByb3ZlIiwibXlUcmFjZSIsImlzSW5ib3giLCJkZWZhdWx0RGVzY3JpcHRpb24iLCJhcHByb3ZlX3NvcnQiLCJhcHByb3Zlc0dyb3VwIiwiYXBwcm92ZXNfc29ydGVkIiwiY29tcGxldGVkX2RhdGUiLCJoYXNOZXh0IiwiaGF2ZURlc2NyaXB0aW9uQXBwcm92ZSIsImlzX2NvbXBsZXRlZCIsImxhc3QiLCJ0b3BfYXBwcm92ZXMiLCJ1bmlvbiIsInRvcF9hcHByb3ZlIiwiZ3JvdXBCeSIsImhhbmRsZXJBcHByb3ZlcyIsImRlc2NyaXB0aW9uQXBwcm92ZXMiLCJ3b3JrZmxvdyIsInNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiIsIl9kaXNwbGF5IiwiaXNNeUFwcHJvdmUiLCJteUFwcHJvdmVEZXNjcmlwdGlvbiIsImFwcHJvdmVJZCIsIm5vdyIsImlzT3Bpbmlvbk9mRmllbGQiLCJpbWFnZVNpZ25EYXRhIiwiZ2V0TGFzdFNpZ25BcHByb3ZlIiwiZ2V0SGFuZGxlclNpZ25TaG93QXBwcm92ZXMiLCJsYXN0TXlBcHByb3ZlRGVzY3JpcHRpb24iLCJzaG93QXBwcm92ZSIsImp1ZGdlX2Rlc2NyaXB0aW9uIiwiaXNfYXBwcm92ZWQiLCJpc19yZWplY3RlZCIsImlzX3JlYWRlZCIsImFkZENsYXNzIiwiZGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiZ2V0U3RlcE5hbWUiLCJzdGVwSWQiLCJnZXRJbnN0YW5jZVN0ZXAiLCJzaG93RGVsZXRlQnV0dG9uIiwiYXBwcm92ZWQiLCJmcm9tX3VzZXIiLCJpc1Nob3dNb2RpZmljYXRpb25CdXR0b24iLCJhcHByb3ZlX2FkbWlucyIsImlzU2hvdyIsImNvbnRhaW5zIiwiaXNFZGl0aW5nIiwiaXNfZWRpdGluZyIsImlzU2hvd0Rlc2NyaXB0aW9uIiwiZ2V0QXBwcm92ZVN0YXR1c0ljb24iLCJhcHByb3ZlSnVkZ2UiLCJhdXRvU3VibWl0dGVkIiwiYXBwcm92ZVN0YXR1c0ljb24iLCJnZXRBcHByb3ZlU3RhdHVzVGV4dCIsImFwcHJvdmVTdGF0dXNUZXh0IiwiZ2V0QXBwcm92ZUp1ZGdlQ2xhc3MiLCJpc0ZvcndhcmQiLCJzaG93Rm9yd2FyZERlbGV0ZUJ1dHRvbiIsImZvcndhcmRfaW5zdGFuY2UiLCJpc0Rpc3RyaWJ1dGUiLCJzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbiIsImhhc0Zsb3dBZG1pblBlcm1pc3Npb24iLCJmaW5pc2hEYXRlU2NoZW1hIiwiaXNBbmRyb2lkT3JJT1MiLCJhdXRvZm9ybSIsIm9wdGlvbmFsIiwicmVhZG9ubHkiLCJkYXRlVGltZVBpY2tlck9wdGlvbnMiLCJpZ25vcmVSZWFkb25seSIsIndpZGdldFBvc2l0aW9uaW5nIiwiaG9yaXpvbnRhbCIsImZpbmlzaERhdGVWYWx1ZXMiLCJzaG93VHJhY2VzVmlldyIsInNob3dfbW9kYWxfdHJhY2VzX2xpc3QiLCJzcGFjZV9zZXR0aW5ncyIsImdldEluc3RhbmNlU3RhdGVUZXh0IiwiaW5zdGFuY2VfaWQiLCJnZXRJbnN0YW5jZVN0YXRlQ29sb3IiLCJjbGEiLCJmaXJzdFRyYWNlIiwibGFzdF9kaXN0cmlidXRlX2Zyb20iLCJkaXNfaW5mbyIsIiRleGlzdHMiLCJjcmVhdGVkIiwiY3JlYXRlZF9ieSIsIlVVZmxvd19hcGkiLCJnZXROYW1lRm9yVXNlciIsInVzZXJzIiwiZnJvbV91c2VyX25hbWUiLCJpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZCIsImp1ZGdlVGVybWluYXRlZCIsImluc3RhbmNlRXhpc3RzIiwiYWdlbnREZXNjcmlwdGlvbiIsInVzZXJOYW1lIiwidHJhY2VOYW1lIiwidHJhY2VJZCIsImhhbmRsZXJEb2MiLCJoYW5kbGVySWQiLCJ1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIiwiZ2V0Q29udGFjdEluZm9Gb3JVc2VyIiwic3RvcFByb3BhZ2F0aW9uIiwiY2FsbGluZyIsImVyciIsInJlbW92ZUNsYXNzIiwic3VjY2VzcyIsImFsbG93TXVsdGlwbGUiLCJjbG9zZXN0IiwidGFyZ2V0X3VzZXJfaWQiLCJvcGVuU2FmZU9iamVjdFVybCIsImZvcndhcmRfc3BhY2UiLCJmb3J3YXJkc3BhY2UiLCJmb3J3YXJkaW5zdGFuY2UiLCJUcmFja2VyIiwiYWZ0ZXJGbHVzaCIsIm9uIiwic2Nyb2xsVG9wIiwiZmluaXNoX2lucHV0Iiwib3Bpbmlvbl9pbnB1dCIsInNob3dSZWxhdGVkSW5zdGFjZXMiLCJyZWxhdGVkX2luc3RhY2VzIiwicmVsYXRlZF9pbnN0YWNlX3VybCIsImlzQ29yZG92YSIsInNob3dfZGVsZXRlIiwic2hvd1JlbGF0ZWRSZWNvcmRzIiwicmVsYXRlZFJlY29yZFVybCIsIm9iamNldE5hbWUiLCJpZHMiLCJwcm9jZXNzIiwiZW52IiwiQ1JFQVRPUl9OT0RFX0VOViIsIkpzb25Sb3V0ZXMiLCJhZGQiLCJyZXEiLCJuZXh0IiwiaGFzaERhdGEiLCJhY3Rpb24iLCJ0b191c2VycyIsInNlbmRSZXN1bHQiLCJzdGFjayIsImVycm9ycyIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJ3b3JrZmxvd01ldGhvZHMiLCJtZXRob2RzIiwic2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZSIsImluc19pZCIsInN0ZXBfYXBwcm92ZSIsInN0ZXBzQXBwcm92ZXNPcHRpb25zIiwiYXBwbHkiLCJzZXRfaW5zdGFuY2Vfc2tpcF9zdGVwcyIsImdldF9pbnN0YW5jZV9kYXRhIiwiZm9ybUNhY2hlZCIsImZsb3dDYWNoZWQiLCJkcmFmdF9zYXZlX2luc3RhbmNlIiwiaW5ib3hfc2F2ZV9pbnN0YW5jZSIsImNjX2RvIiwiY2NfdXNlcl9pZHMiLCJjY19yZWFkIiwiY2Nfc3VibWl0IiwiY2NfcmVtb3ZlIiwiYmF0Y2hfY2FuY2VsX2NjIiwiYXBwcm92ZV9pZHMiLCJjY19zYXZlIiwic3BhY2VfaWQiLCJmbG93X2lkIiwiaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50IiwiaXNGb3J3YXJkQXR0YWNobWVudHMiLCJzZWxlY3RlZFVzZXJzIiwiYWN0aW9uX3R5cGUiLCJyZWxhdGVkIiwiZnJvbV9hcHByb3ZlX2lkIiwiZm9yd2FyZF9yZW1vdmUiLCJ0cmFjZV9pZCIsImFwcHJvdmVfaWQiLCJjYW5jZWxEaXN0cmlidXRlIiwiY2ZzX2luc3RhbmNlc19yZW1vdmUiLCJmaWxlX2lkIiwiY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudCIsImNmc19pbnN0YW5jZXNfbG9jayIsInVzZXJfaWQiLCJjZnNfaW5zdGFuY2VzX3VubG9jayIsImRvd25sb2FkX3NwYWNlX2luc3RhbmNlX2F0dGFjaG1lbnRzX3RvX2Rpc2siLCJzcGFjZUlkIiwiY2ZzUmVjb3JkSWRzIiwic2V0X2FwcHJvdmVfaGF2ZV9yZWFkIiwiY2hhbmdlX2FwcHJvdmVfaW5mbyIsInVwZGF0ZV9hcHByb3ZlX3NpZ24iLCJzaWduX3R5cGUiLCJsYXN0U2lnbkFwcHJvdmUiLCJ1cGRhdGVfc2lnbl9zaG93Iiwib2JqcyIsIm15QXBwcm92ZV9pZCIsImluc3RhbmNlX3JldHVybiIsImluc3RhbmNlX3JlbWluZCIsInJlbWluZF91c2VycyIsInJlbWluZF9jb3VudCIsInJlbWluZF9kZWFkbGluZSIsImFjdGlvbl90eXBlcyIsIm5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQiLCJkZWFsX3R5cGUiLCJwYXJhbXMiLCJfZXZhbCIsImNoZWNrX21haW5fYXR0YWNoIiwicmVtb3ZlX3JlbGF0ZWQiLCJyZV9pbnNfaWQiLCJ1cGRhdGVfaW5zdGFuY2VfcmVsYXRlZCIsInVwZGF0ZUZsb3dQb3NpdGlvbiIsInVwZGF0ZUZsb3dSb2xlIiwic3RhcnRfZmxvdyIsImZsb3dJZCIsImdldF9pbnN0YW5jZV90cmFjZXMiLCJjYXRlZ29yeUlkIiwiZmxvd0lkcyIsImdldF9iYXRjaF9pbnN0YW5jZXMiLCJnZXRfYmF0Y2hfaW5zdGFuY2VzX2NvdW50IiwiZ2V0X215X2FwcHJvdmVzIiwiY2hhbmdlX2Zsb3dfc3RhdGUiLCJoaWRlX2luc3RhbmNlIiwiaW5zSWQiLCJpc19oaWRkZW4iLCJnZXRJbnN0YW5jZVZhbHVlcyIsIkNvb2tpZXMiLCJnZXRJbnN0YW5jZVJlYWRPbmx5IiwiX2hhc1Blcm1pc3Npb24iLCJfbG9jYWxlIiwiX3BhcmVudF9pbnN0YW5jZXMiLCJkYXRhQnVmIiwiaGlkZV90cmFjZXMiLCJzcGFjZVVzZXJDb3VudCIsImdldEFQSUxvZ2luVXNlciIsImFjY2Vzc190b2tlbiIsImdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiIsInNwYWNlcyIsInNwYWNlX3VzZXJzIiwiaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyIsIl9wYXJlbnRfaWQiLCJfcGFyZW50X2lucyIsImNoYXJzZXQiLCJCdWZmZXIiLCJzZXRIZWFkZXIiLCJzdGF0dXNDb2RlIiwicmV0X3N5bmNfdG9rZW4iLCJzcGFjZVVzZXIiLCJzcGFjZVVzZXJPcmdhbml6YXRpb25zIiwic3luY190b2tlbiIsIkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2siLCJoZWFkZXJzIiwiaXNTcGFjZUFkbWluIiwib3JnYW5pemF0aW9ucyIsImNhbk1vbml0b3IiLCJjYW5BZG1pbiIsIiRndCIsIiRuaW4iLCJpbmJveF91ZXJzIiwiY2NfdXNlcnMiLCJvdXRib3hfdXNlcnMiLCJza2lwIiwibGltaXQiLCJjb3BpZXMiLCJhbGxDc3MiLCJXZWJBcHAiLCJnZXRSZWZyZXNoYWJsZUFzc2V0cyIsImNzcyIsInJvb3RVcmwiLCJfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fIiwiUk9PVF9VUkxfUEFUSF9QUkVGSVgiLCJST09UX1VSTCIsImVuZHNXaXRoIiwiaCIsImciLCJtIiwiayIsImdldEVhY2giLCJ1bmlxIiwibWl4aW4iLCJkZXN0IiwiaGFuZGVyVXNlck9iamVjdCIsIm9yZ2FuaXphdGlvbiIsImhyIiwic29ydF9ubyIsIm1vYmlsZSIsIndvcmtfcGhvbmUiLCJwb3NpdGlvbiIsInVzZXJSb2xlcyIsInJvbGVzIiwiaGFuZGVyT3JnT2JqZWN0Iiwib3JnIiwiaW5pdF9mb3JtdWxhX3ZhbHVlcyIsImF1dG9Gb3JtRG9jIiwiYXBwcm92ZXIiLCJfX3ZhbHVlcyIsInRhYmxlRmllbGRzIiwidGFibGVWYWx1ZXMiLCJmb3JtdWxhVGFibGVWYWx1ZXMiLCJfX3RhYmxlVmFsdWVzIiwidGFibGVmaWVsZCIsImdldEZvcm11bGFVc2VyT2JqZWN0cyIsImdldEZvcm11bGFPcmdPYmplY3RzIiwiZ2V0Rm9ybXVsYVVzZXJPYmplY3QiLCJwdWJsaXNoIiwiY2hlY2siLCJyZWFkeSIsImNhdGVnb3JpZXMiLCJhcHAiLCJmbG93X3Bvc2l0aW9ucyIsInJvbGUiLCJwdWJsaXNoQ29tcG9zaXRlIiwidGFibGVOYW1lIiwiTWF0Y2giLCJPcHRpb25hbCIsInVuYmxvY2siLCJjaGlsZHJlbiIsImZsb3dfcm9sZXMiLCJjcmVhdGVUZW1wbGF0ZUZvcm1BbmRGbG93IiwicGVybXMiLCJjb21wYW55X2lkIiwiZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VycyIsImRpc3RyaWJ1dGVfdG9fc2VsZiIsImVuYWJsZV9hbWlzZm9ybSIsInZlcnNpb25JZCIsImhhbmRsZSIsInNlbGYiLCJsYXRlc3QiLCJvYnNlcnZlQ2hhbmdlcyIsImNoYW5nZWQiLCJhZGRlZCIsIm9uU3RvcCIsInN0b3AiLCJmbG93X2lkcyIsImRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbiIsImFsbG93X3NlbGVjdF9zdGVwIiwiYW1pc19zY2hlbWEiLCJnZXRNaW5pSW5zdGFuY2UiLCJnZXRNeWFwcHJvdmVNb2RpZmllZCIsImluc3RhbmNlX2ZpZWxkc18wIiwibWluaUFwcHJvdmVGaWVsZHMiLCJuZWVkQ2hhbmdlIiwidHJpZ2dlckNoYW5nZUZpZWxkcyIsInRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMiLCJteUFwcHJvdmVNb2RpZmllZHMiLCJfaW5zdGFuY2VJZCIsIl90cmFjZSIsImNoYW5nZUZpZWxkcyIsIl9jaGFuZ2UiLCJfcmV2IiwiX215X2FwcHJvdmVfbW9kaWZpZWRzIiwiaXNFcXVhbCIsImdldEluc3RhbmNlVHJhY2VzIiwiX2luc0lkIiwiaW5ib3hfdXNlcnMiLCJhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUiLCJsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlIiwiaW5zdGFuY2VpZCIsImRhdGFNYXAiLCJvcGVyYXRpb24iLCJyYXdDb2xsZWN0aW9uIiwiYWdncmVnYXRlIiwidG9BcnJheSIsImRvYyIsImlzRnVuY3Rpb24iLCJ3cmFwQXN5bmMiLCJnZXRNeUFwcHJvdmUiLCJnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUiLCJnZXRTdGVwQ3VycmVudE5hbWUiLCJub3RGaW5pc2hlZFRyYWNlcyIsImFnZW50Iiwic3RlcEN1cnJlbnROYW1lIiwiJHNsaWNlIiwibXlMYXN0RmluaXNoZWRBcHByb3ZlIiwiYWdlbnRfdXNlcl9uYW1lIiwibXlfZmluaXNoX2RhdGUiLCJpc19jYyIsImNjX2NvdW50IiwidGFidWxhck5hbWUiLCJpbnN0YW5jZV9pZHMiLCJyZWxhdGVkX2luc3RhbmNlX2lkcyIsIl9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlIiwiX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUiLCJfaXRlbXMiLCIkbWF0Y2giLCIkZ3JvdXAiLCIkc3VtIiwiX2NoYW5nZURhdGEiLCJfZmxvd3NEYXRhIiwiX2luaXQiLCJkYXRhSXRlbSIsImZsb3dfaW5zdGFuY2UiLCJvYnNlcnZlIiwiZ2V0Q29sbGVjdGlvbiIsIndvcmtmbG93VGVtcGxhdGUiLCJzdGFydHVwIiwiYWJzb2x1dGVfcGF0aF9jbiIsImFic29sdXRlX3BhdGhfdXMiLCJmaWxlc0xpc3RfY24iLCJmaWxlc0xpc3RfdXMiLCJmcyIsIm1pbWUiLCJwYXRoX2NuIiwicGF0aF91cyIsInJlYWRGaWxlTGlzdCIsInBhdGhEaXIiLCJmaWxlc0xpc3QiLCJyZWFkZGlyU3luYyIsInN0YXQiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5Iiwid29ya2Zsb3dUZW1wbGF0ZXMiLCJyZXNvbHZlIiwiZXhpc3RzU3luYyIsImZpbGUiLCJyZWFkRmlsZVN5bmMiLCJnb19uZXh0IiwicnVsZSIsInNjaGVkdWxlIiwiY3JvbiIsImF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbiIsInNjaGVkdWxlSm9iIiwiYmluZEVudmlyb25tZW50IiwidGltZSIsInByb2Nlc3NfZGVsZWdhdGlvbl9ydWxlcyIsInVwZGF0ZSIsImVuYWJsZWQiLCJlbmRfdGltZSIsIiRsdGUiLCIkc2V0IiwibXVsdGkiLCJ0aW1lRW5kIiwidGltZW91dF9hdXRvX3N1Ym1pdCIsInRpbWVvdXRBdXRvU3VibWl0IiwiVGFidWxhclRhYmxlcyIsInJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIiLCJUYWJ1bGFyIiwiVGFibGUiLCJjb2xsZWN0aW9uIiwiY29sdW1ucyIsInRpdGxlIiwib3JkZXJhYmxlIiwicmVuZGVyIiwiaW5wdXQiLCJzdGVwX2N1cnJlbnRfbmFtZSIsImN1cnJlbnRfc3RlcF9uYW1lIiwiZG9tIiwibGVuZ3RoQ2hhbmdlIiwiZXh0cmFGaWVsZHMiLCJwYWdlTGVuZ3RoIiwiaW5mbyIsInNlYXJjaGluZyIsInJlc3BvbnNpdmUiLCJkZXRhaWxzIiwiYXV0b1dpZHRoIiwiY2hhbmdlU2VsZWN0b3IiLCJjdXJTcGFjZVVzZXIiLCIkYW5kIiwiYWRtaW5zIiwiZmwiLCJleHRlbmQiLCJHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyIsIl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyIsIl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMiLCJfaGFuZGxlTGlzdEZpZWxkcyIsImluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyIiwiaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciIsIm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyIiwidXBkYXRlVGFidWxhclRpdGxlIiwic3VicyIsIlN1YnNNYW5hZ2VyIiwiaW5zX2ZpZWxkcyIsInB1YiIsIm9uVW5sb2FkIiwiaW5zdGFuY2VfbGlzdCIsIl90YWJsZUNvbHVtbnMiLCJkcmF3Q2FsbGJhY2siLCJlbGxpcHNpc0xpbmsiLCJlbXB0eVRkIiwiY29sU3BhbiIsImlzUGFkIiwicGVyZmVjdFNjcm9sbGJhciIsIm9JbnN0YW5jZSIsImF0dHIiLCJjbGljayIsImdvUGFnZSIsImhlaWdodCIsInBhZ2VzIiwiY2VpbCIsImZuUmVjb3Jkc0Rpc3BsYXkiLCJfaURpc3BsYXlMZW5ndGgiLCJEYXRhVGFibGUiLCJwYWdlIiwiZHJhdyIsImJsdXIiLCJjdXJyZW50UGFnZSIsImtleWRvd24iLCJrZXlDb2RlIiwiY3JlYXRlZFJvdyIsInJvdyIsImRhdGFJbmRleCIsIkZsb3dSb3V0ZXIiLCJzZXRBdHRyaWJ1dGUiLCJhZ2VudF92aWV3IiwiY2NfdmlldyIsImluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MiLCJtb2RpZmllZEZyb21Ob3ciLCJtb2RpZmllZFN0cmluZyIsInByaW9yaXR5SWNvbiIsInByaW9yaXR5SWNvbkNsYXNzIiwicHJpb3JpdHlWYWx1ZSIsInN0ZXBfY3VycmVudF9uYW1lX3ZpZXciLCJ1bnJlYWQiLCJtb21lbnRSZWFjdGl2ZUZyb21Ob3ciLCJwcmlvcml0eSIsInZpc2libGUiLCJjY190YWciLCJyZWNvcmRfbmVlZCIsImxlbmd0aE1lbnUiLCJzcGFjZV91c2VyIiwicGFnaW5nVHlwZSIsImlzX2xpc3RfZGlzcGxheSIsImluYm94X2luc3RhbmNlcyIsIm91dGJveF9pbnN0YW5jZXMiLCJnZXRTb3J0IiwiZmxvd0luc3RhbmNlcyIsIlJlYWN0aXZlVmFyIiwiX2NoYW5nZU9yZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsZ0JBQUo7QUFBcUJDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG9DQUFaLEVBQWlEO0FBQUNGLGtCQUFnQixDQUFDRyxDQUFELEVBQUc7QUFBQ0gsb0JBQWdCLEdBQUNHLENBQWpCO0FBQW1COztBQUF4QyxDQUFqRCxFQUEyRixDQUEzRjtBQUNyQkgsZ0JBQWdCLENBQUM7QUFDaEIsbUJBQWlCLFFBREQ7QUFFaEIsWUFBVTtBQUZNLENBQUQsRUFHYixrQkFIYSxDQUFoQixDOzs7Ozs7Ozs7Ozs7QUNEQTs7Ozs7Ozs7Ozs7OztBQWFDLGFBQVVJLElBQVYsRUFBZ0JDLE9BQWhCLEVBQXlCO0FBQ3pCLGlCQUR5QixDQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFFBQUksT0FBT0MsTUFBUCxLQUFrQixVQUFsQixJQUFnQ0EsTUFBTSxDQUFDQyxHQUEzQyxFQUFnRDtBQUMvQztBQUNBRCxZQUFNLENBQUMsQ0FBQyxZQUFELEVBQWUsUUFBZixFQUF5QixzQkFBekIsQ0FBRCxFQUFtREQsT0FBbkQsQ0FBTjtBQUNBLEtBSEQsTUFHTztBQUNOO0FBQ0FELFVBQUksQ0FBQ0ksR0FBTCxHQUFXSCxPQUFPLENBQUNELElBQUksQ0FBQ0ssUUFBTixFQUFnQkwsSUFBSSxDQUFDTSxJQUFyQixFQUEyQk4sSUFBSSxDQUFDTyxrQkFBaEMsRUFBb0RQLElBQXBELENBQWxC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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7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bnRlbnQiOlsiaW1wb3J0IHsgY2hlY2tOcG1WZXJzaW9ucyB9IGZyb20gJ21ldGVvci90bWVhc2RheTpjaGVjay1ucG0tdmVyc2lvbnMnO1xuY2hlY2tOcG1WZXJzaW9ucyh7XG5cdFwibm9kZS1zY2hlZHVsZVwiOiBcIl4xLjMuMVwiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcbn0sICdzdGVlZG9zOndvcmtmbG93Jyk7IiwiLyohXG4gKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzXG4gKlxuICogVmVyc2lvbjogMS4xNy4wXG4gKlxuICogQXV0aG9yOiBSb2RuZXkgUmVobVxuICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvXG4gKlxuICogTGljZW5zZWQgdW5kZXJcbiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICogICBHUEwgdjMgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0dQTC0zLjBcbiAqXG4gKi9cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHQndXNlIHN0cmljdCc7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvcmV0dXJuRXhwb3J0cy5qc1xuXHQvLyBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdC8vICAgLy8gTm9kZVxuXHQvLyAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuL3B1bnljb2RlJyksIHJlcXVpcmUoJy4vSVB2NicpLCByZXF1aXJlKCcuL1NlY29uZExldmVsRG9tYWlucycpKTtcblx0Ly8gfSBlbHNlXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnLi9wdW55Y29kZScsICcuL0lQdjYnLCAnLi9TZWNvbmRMZXZlbERvbWFpbnMnXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcblx0XHRyb290LlVSSSA9IGZhY3Rvcnkocm9vdC5wdW55Y29kZSwgcm9vdC5JUHY2LCByb290LlNlY29uZExldmVsRG9tYWlucywgcm9vdCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKHB1bnljb2RlLCBJUHY2LCBTTEQsIHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmdsb2JhbCBsb2NhdGlvbiwgZXNjYXBlLCB1bmVzY2FwZSAqL1xuXHQvLyBGSVhNRTogdjIuMC4wIHJlbmFtY2Ugbm9uLWNhbWVsQ2FzZSBwcm9wZXJ0aWVzIHRvIHVwcGVyY2FzZVxuXHQvKmpzaGludCBjYW1lbGNhc2U6IGZhbHNlICovXG5cblx0Ly8gc2F2ZSBjdXJyZW50IFVSSSB2YXJpYWJsZSwgaWYgYW55XG5cdHZhciBfVVJJID0gcm9vdCAmJiByb290LlVSSTtcblxuXHRmdW5jdGlvbiBVUkkodXJsLCBiYXNlKSB7XG5cdFx0dmFyIF91cmxTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMTtcblx0XHR2YXIgX2Jhc2VTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjtcblxuXHRcdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRcdGlmICghKHRoaXMgaW5zdGFuY2VvZiBVUkkpKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdGlmIChfYmFzZVN1cHBsaWVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBVUkkodXJsLCBiYXNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgVVJJKHVybCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVVJJKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHVybCA9IGxvY2F0aW9uLmhyZWYgKyAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHVybCA9ICcnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaHJlZih1cmwpO1xuXG5cdFx0Ly8gcmVzb2x2ZSB0byBiYXNlIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbnN0cnVjdG9yXG5cdFx0aWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWJzb2x1dGVUbyhiYXNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdFVSSS52ZXJzaW9uID0gJzEuMTcuMCc7XG5cblx0dmFyIHAgPSBVUkkucHJvdG90eXBlO1xuXHR2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBlc2NhcGVSZWdFeChzdHJpbmcpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9jb21taXQvODVhYzIxNzgzYzExZjhjY2FiMDYxMDZkYmE5NzM1YTMxYTg2OTI0ZCNjb21taXRjb21tZW50LTgyMTk2M1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZSkge1xuXHRcdC8vIElFOCBkb2Vzbid0IHJldHVybiBbT2JqZWN0IFVuZGVmaW5lZF0gYnV0IFtPYmplY3QgT2JqZWN0XSBmb3IgdW5kZWZpbmVkIHZhbHVlXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnVW5kZWZpbmVkJztcblx0XHR9XG5cblx0XHRyZXR1cm4gU3RyaW5nKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpLnNsaWNlKDgsIC0xKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG5cdFx0cmV0dXJuIGdldFR5cGUob2JqKSA9PT0gJ0FycmF5Jztcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbHRlckFycmF5VmFsdWVzKGRhdGEsIHZhbHVlKSB7XG5cdFx0dmFyIGxvb2t1cCA9IHt9O1xuXHRcdHZhciBpLCBsZW5ndGg7XG5cblx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRsb29rdXAgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGxvb2t1cFt2YWx1ZVtpXV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb29rdXBbdmFsdWVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogdHJ1ZSAqL1xuXHRcdFx0dmFyIF9tYXRjaCA9IGxvb2t1cCAmJiBsb29rdXBbZGF0YVtpXV0gIT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCAhbG9va3VwICYmIHZhbHVlLnRlc3QoZGF0YVtpXSk7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogZmFsc2UgKi9cblx0XHRcdGlmIChfbWF0Y2gpIHtcblx0XHRcdFx0ZGF0YS5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGxlbmd0aC0tO1xuXHRcdFx0XHRpLS07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheUNvbnRhaW5zKGxpc3QsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aDtcblxuXHRcdC8vIHZhbHVlIG1heSBiZSBzdHJpbmcsIG51bWJlciwgYXJyYXksIHJlZ2V4cFxuXHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Ly8gTm90ZTogdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRvIE8obikgKGluc3RlYWQgb2YgY3VycmVudCBPKG0gKiBuKSlcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICghYXJyYXlDb250YWlucyhsaXN0LCB2YWx1ZVtpXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIF90eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF90eXBlID09PSAnUmVnRXhwJykge1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RbaV0gPT09ICdzdHJpbmcnICYmIGxpc3RbaV0ubWF0Y2godmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobGlzdFtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJyYXlzRXF1YWwob25lLCB0d28pIHtcblx0XHRpZiAoIWlzQXJyYXkob25lKSB8fCAhaXNBcnJheSh0d28pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gYXJyYXlzIGNhbid0IGJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50IG9mIGNvbnRlbnRcblx0XHRpZiAob25lLmxlbmd0aCAhPT0gdHdvLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdG9uZS5zb3J0KCk7XG5cdFx0dHdvLnNvcnQoKTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gb25lLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0aWYgKG9uZVtpXSAhPT0gdHdvW2ldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRyaW1TbGFzaGVzKHRleHQpIHtcblx0XHR2YXIgdHJpbV9leHByZXNzaW9uID0gL15cXC8rfFxcLyskL2c7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSh0cmltX2V4cHJlc3Npb24sICcnKTtcblx0fVxuXG5cdFVSSS5fcGFydHMgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvdG9jb2w6IG51bGwsXG5cdFx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdFx0aG9zdG5hbWU6IG51bGwsXG5cdFx0XHR1cm46IG51bGwsXG5cdFx0XHRwb3J0OiBudWxsLFxuXHRcdFx0cGF0aDogbnVsbCxcblx0XHRcdHF1ZXJ5OiBudWxsLFxuXHRcdFx0ZnJhZ21lbnQ6IG51bGwsXG5cdFx0XHQvLyBzdGF0ZVxuXHRcdFx0ZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzOiBVUkkuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLFxuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZTogVVJJLmVzY2FwZVF1ZXJ5U3BhY2Vcblx0XHR9O1xuXHR9O1xuXHQvLyBzdGF0ZTogYWxsb3cgZHVwbGljYXRlIHF1ZXJ5IHBhcmFtZXRlcnMgKGE9MSZhPTEpXG5cdFVSSS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMgPSBmYWxzZTtcblx0Ly8gc3RhdGU6IHJlcGxhY2VzICsgd2l0aCAlMjAgKHNwYWNlIGluIHF1ZXJ5IHN0cmluZ3MpXG5cdFVSSS5lc2NhcGVRdWVyeVNwYWNlID0gdHJ1ZTtcblx0Ly8gc3RhdGljIHByb3BlcnRpZXNcblx0VVJJLnByb3RvY29sX2V4cHJlc3Npb24gPSAvXlthLXpdW2EtejAtOS4rLV0qJC9pO1xuXHRVUkkuaWRuX2V4cHJlc3Npb24gPSAvW15hLXowLTlcXC4tXS9pO1xuXHRVUkkucHVueWNvZGVfZXhwcmVzc2lvbiA9IC8oeG4tLSkvaTtcblx0Ly8gd2VsbCwgMzMzLjQ0NC41NTUuNjY2IG1hdGNoZXMsIGJ1dCBpdCBzdXJlIGFpbid0IG5vIElQdjQgLSBkbyB3ZSBjYXJlP1xuXHRVUkkuaXA0X2V4cHJlc3Npb24gPSAvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC87XG5cdC8vIGNyZWRpdHMgdG8gUmljaCBCcm93blxuXHQvLyBzb3VyY2U6IGh0dHA6Ly9mb3J1bXMuaW50ZXJtYXBwZXIuY29tL3ZpZXd0b3BpYy5waHA/cD0xMDk2IzEwOTZcblx0Ly8gc3BlY2lmaWNhdGlvbjogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDI5MS50eHRcblx0VVJJLmlwNl9leHByZXNzaW9uID0gL15cXHMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKCUuKyk/XFxzKiQvO1xuXHQvLyBleHByZXNzaW9uIHVzZWQgaXMgXCJncnViZXIgcmV2aXNlZFwiIChAZ3J1YmVyIHYyKSBkZXRlcm1pbmVkIHRvIGJlIHRoZVxuXHQvLyBiZXN0IHNvbHV0aW9uIGluIGEgcmVnZXgtZ29sZiB3ZSBkaWQgYSBjb3VwbGUgb2YgYWdlcyBhZ28gYXRcblx0Ly8gKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9kZW1vL3VybC1yZWdleFxuXHQvLyAqIGh0dHA6Ly9yb2RuZXlyZWhtLmRlL3QvdXJsLXJlZ2V4Lmh0bWxcblx0VVJJLmZpbmRfdXJpX2V4cHJlc3Npb24gPSAvXFxiKCg/OlthLXpdW1xcdy1dKzooPzpcXC97MSwzfXxbYS16MC05JV0pfHd3d1xcZHswLDN9Wy5dfFthLXowLTkuXFwtXStbLl1bYS16XXsyLDR9XFwvKSg/OlteXFxzKCk8Pl0rfFxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCkpKyg/OlxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCl8W15cXHNgISgpXFxbXFxde307OidcIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pZztcblx0VVJJLmZpbmRVcmkgPSB7XG5cdFx0Ly8gdmFsaWQgXCJzY2hlbWU6Ly9cIiBvciBcInd3dy5cIlxuXHRcdHN0YXJ0OiAvXFxiKD86KFthLXpdW2EtejAtOS4rLV0qOlxcL1xcLyl8d3d3XFwuKS9naSxcblx0XHQvLyBldmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IHdoaXRlc3BhY2Vcblx0XHRlbmQ6IC9bXFxzXFxyXFxuXXwkLyxcblx0XHQvLyB0cmltIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGNhcHR1cmVkIGJ5IGVuZCBSZWdFeHBcblx0XHR0cmltOiAvW2AhKClcXFtcXF17fTs6J1wiLiw8Pj/Cq8K74oCc4oCd4oCe4oCY4oCZXSskL1xuXHR9O1xuXHQvLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzLmh0bWxcblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1RDUF9hbmRfVURQX3BvcnRfbnVtYmVycyNXZWxsLWtub3duX3BvcnRzXG5cdFVSSS5kZWZhdWx0UG9ydHMgPSB7XG5cdFx0aHR0cDogJzgwJyxcblx0XHRodHRwczogJzQ0MycsXG5cdFx0ZnRwOiAnMjEnLFxuXHRcdGdvcGhlcjogJzcwJyxcblx0XHR3czogJzgwJyxcblx0XHR3c3M6ICc0NDMnXG5cdH07XG5cdC8vIGFsbG93ZWQgaG9zdG5hbWUgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0Ly8gQUxQSEEgRElHSVQgXCItXCIgXCIuXCIgXCJfXCIgXCJ+XCIgXCIhXCIgXCIkXCIgXCImXCIgXCInXCIgXCIoXCIgXCIpXCIgXCIqXCIgXCIrXCIgXCIsXCIgXCI7XCIgXCI9XCIgJWVuY29kZWRcblx0Ly8gSSd2ZSBuZXZlciBzZWVuIGEgKG5vbi1JRE4pIGhvc3RuYW1lIG90aGVyIHRoYW46IEFMUEhBIERJR0lUIC4gLVxuXHRVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzID0gL1teYS16QS1aMC05XFwuLV0vO1xuXHQvLyBtYXAgRE9NIEVsZW1lbnRzIHRvIHRoZWlyIFVSSSBhdHRyaWJ1dGVcblx0VVJJLmRvbUF0dHJpYnV0ZXMgPSB7XG5cdFx0J2EnOiAnaHJlZicsXG5cdFx0J2Jsb2NrcXVvdGUnOiAnY2l0ZScsXG5cdFx0J2xpbmsnOiAnaHJlZicsXG5cdFx0J2Jhc2UnOiAnaHJlZicsXG5cdFx0J3NjcmlwdCc6ICdzcmMnLFxuXHRcdCdmb3JtJzogJ2FjdGlvbicsXG5cdFx0J2ltZyc6ICdzcmMnLFxuXHRcdCdhcmVhJzogJ2hyZWYnLFxuXHRcdCdpZnJhbWUnOiAnc3JjJyxcblx0XHQnZW1iZWQnOiAnc3JjJyxcblx0XHQnc291cmNlJzogJ3NyYycsXG5cdFx0J3RyYWNrJzogJ3NyYycsXG5cdFx0J2lucHV0JzogJ3NyYycsIC8vIGJ1dCBvbmx5IGlmIHR5cGU9XCJpbWFnZVwiXG5cdFx0J2F1ZGlvJzogJ3NyYycsXG5cdFx0J3ZpZGVvJzogJ3NyYydcblx0fTtcblx0VVJJLmdldERvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRpZiAoIW5vZGUgfHwgIW5vZGUubm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdC8vIDxpbnB1dD4gc2hvdWxkIG9ubHkgZXhwb3NlIHNyYyBmb3IgdHlwZT1cImltYWdlXCJcblx0XHRpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgbm9kZS50eXBlICE9PSAnaW1hZ2UnKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBVUkkuZG9tQXR0cmlidXRlc1tub2RlTmFtZV07XG5cdH07XG5cblx0ZnVuY3Rpb24gZXNjYXBlRm9yRHVtYkZpcmVmb3gzNih2YWx1ZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy85MVxuXHRcdHJldHVybiBlc2NhcGUodmFsdWUpO1xuXHR9XG5cblx0Ly8gZW5jb2RpbmcgLyBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUkZDMzk4NlxuXHRmdW5jdGlvbiBzdHJpY3RFbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSB7XG5cdFx0Ly8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZW5jb2RlVVJJQ29tcG9uZW50XG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpXG5cdFx0XHQucmVwbGFjZSgvWyEnKCkqXS9nLCBlc2NhcGVGb3JEdW1iRmlyZWZveDM2KVxuXHRcdFx0LnJlcGxhY2UoL1xcKi9nLCAnJTJBJyk7XG5cdH1cblx0VVJJLmVuY29kZSA9IHN0cmljdEVuY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmlzbzg4NTkgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0fTtcblx0VVJJLnVuaWNvZGUgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdH07XG5cdFVSSS5jaGFyYWN0ZXJzID0ge1xuXHRcdHBhdGhuYW1lOiB7XG5cdFx0XHRlbmNvZGU6IHtcblx0XHRcdFx0Ly8gUkZDMzk4NiAyLjE6IEZvciBjb25zaXN0ZW5jeSwgVVJJIHByb2R1Y2VycyBhbmQgbm9ybWFsaXplcnMgc2hvdWxkXG5cdFx0XHRcdC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuXG5cdFx0XHRcdGV4cHJlc3Npb246IC8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Ly8gLS5ffiEnKCkqXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI2JzogJyYnLFxuXHRcdFx0XHRcdCclMkInOiAnKycsXG5cdFx0XHRcdFx0JyUyQyc6ICcsJyxcblx0XHRcdFx0XHQnJTNCJzogJzsnLFxuXHRcdFx0XHRcdCclM0QnOiAnPScsXG5cdFx0XHRcdFx0JyUzQSc6ICc6Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jXS9nLFxuXHRcdFx0XHRtYXA6IHtcblx0XHRcdFx0XHQnLyc6ICclMkYnLFxuXHRcdFx0XHRcdCc/JzogJyUzRicsXG5cdFx0XHRcdFx0JyMnOiAnJTIzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZXNlcnZlZDoge1xuXHRcdFx0ZW5jb2RlOiB7XG5cdFx0XHRcdC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZFxuXHRcdFx0XHQvLyB1c2UgdXBwZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cyBmb3IgYWxsIHBlcmNlbnQtZW5jb2RpbmdzLlxuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyM3wyNHwyNnwyN3wyOHwyOXwyQXwyQnwyQ3wyRnwzQXwzQnwzRHwzRnw0MHw1Qnw1RCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdC8vIGdlbi1kZWxpbXNcblx0XHRcdFx0XHQnJTNBJzogJzonLFxuXHRcdFx0XHRcdCclMkYnOiAnLycsXG5cdFx0XHRcdFx0JyUzRic6ICc/Jyxcblx0XHRcdFx0XHQnJTIzJzogJyMnLFxuXHRcdFx0XHRcdCclNUInOiAnWycsXG5cdFx0XHRcdFx0JyU1RCc6ICddJyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnLFxuXHRcdFx0XHRcdC8vIHN1Yi1kZWxpbXNcblx0XHRcdFx0XHQnJTIxJzogJyEnLFxuXHRcdFx0XHRcdCclMjQnOiAnJCcsXG5cdFx0XHRcdFx0JyUyNic6ICcmJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR1cm5wYXRoOiB7XG5cdFx0XHQvLyBUaGUgY2hhcmFjdGVycyB1bmRlciBgZW5jb2RlYCBhcmUgdGhlIGNoYXJhY3RlcnMgY2FsbGVkIG91dCBieSBSRkMgMjE0MSBhcyBiZWluZyBhY2NlcHRhYmxlXG5cdFx0XHQvLyBmb3IgdXNhZ2UgaW4gYSBVUk4uIFJGQzIxNDEgYWxzbyBjYWxscyBvdXQgXCItXCIsIFwiLlwiLCBhbmQgXCJfXCIgYXMgYWNjZXB0YWJsZSBjaGFyYWN0ZXJzLCBidXRcblx0XHRcdC8vIHRoZXNlIGFyZW4ndCBlbmNvZGVkIGJ5IGVuY29kZVVSSUNvbXBvbmVudCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRoZW0gb3V0IGhlcmUuIEFsc29cblx0XHRcdC8vIG5vdGUgdGhhdCB0aGUgY29sb24gY2hhcmFjdGVyIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGUgZW5jb2RpbmcgbWFwOyB0aGlzIGlzIGJlY2F1c2UgVVJJLmpzXG5cdFx0XHQvLyBnaXZlcyB0aGUgY29sb25zIGluIFVSTnMgc2VtYW50aWMgbWVhbmluZyBhcyB0aGUgZGVsaW1pdGVycyBvZiBwYXRoIHNlZ2VtZW50cywgYW5kIHNvIGl0XG5cdFx0XHQvLyBzaG91bGQgbm90IGFwcGVhciB1bmVuY29kZWQgaW4gYSBzZWdtZW50IGl0c2VsZi5cblx0XHRcdC8vIFNlZSBhbHNvIHRoZSBub3RlIGFib3ZlIGFib3V0IFJGQzM5ODYgYW5kIGNhcGl0YWxhbGl6ZWQgaGV4IGRpZ2l0cy5cblx0XHRcdGVuY29kZToge1xuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyNHwyN3wyOHwyOXwyQXwyQnwyQ3wzQnwzRHw0MCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdCclMjEnOiAnIScsXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBUaGVzZSBjaGFyYWN0ZXJzIGFyZSB0aGUgY2hhcmFjdGVycyBjYWxsZWQgb3V0IGJ5IFJGQzIxNDEgYXMgXCJyZXNlcnZlZFwiIGNoYXJhY3RlcnMgdGhhdFxuXHRcdFx0Ly8gc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBhIFVSTiwgcGx1cyB0aGUgY29sb24gY2hhcmFjdGVyIChzZWUgbm90ZSBhYm92ZSkuXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jOl0vZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Jy8nOiAnJTJGJyxcblx0XHRcdFx0XHQnPyc6ICclM0YnLFxuXHRcdFx0XHRcdCcjJzogJyUyMycsXG5cdFx0XHRcdFx0JzonOiAnJTNBJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRVUkkuZW5jb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHR2YXIgZXNjYXBlZCA9IFVSSS5lbmNvZGUoc3RyaW5nICsgJycpO1xuXHRcdGlmIChlc2NhcGVRdWVyeVNwYWNlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVzY2FwZVF1ZXJ5U3BhY2UgPSBVUkkuZXNjYXBlUXVlcnlTcGFjZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXNjYXBlUXVlcnlTcGFjZSA/IGVzY2FwZWQucmVwbGFjZSgvJTIwL2csICcrJykgOiBlc2NhcGVkO1xuXHR9O1xuXHRVUkkuZGVjb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRzdHJpbmcgKz0gJyc7XG5cdFx0aWYgKGVzY2FwZVF1ZXJ5U3BhY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZSA9IFVSSS5lc2NhcGVRdWVyeVNwYWNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gVVJJLmRlY29kZShlc2NhcGVRdWVyeVNwYWNlID8gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTIwJykgOiBzdHJpbmcpO1xuXHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0Ly8gd2UncmUgbm90IGdvaW5nIHRvIG1lc3Mgd2l0aCB3ZWlyZCBlbmNvZGluZ3MsXG5cdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvODdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvOTJcblx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXHQvLyBnZW5lcmF0ZSBlbmNvZGUvZGVjb2RlIHBhdGggZnVuY3Rpb25zXG5cdHZhciBfcGFydHMgPSB7J2VuY29kZSc6J2VuY29kZScsICdkZWNvZGUnOidkZWNvZGUnfTtcblx0dmFyIF9wYXJ0O1xuXHR2YXIgZ2VuZXJhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uKF9ncm91cCwgX3BhcnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gVVJJW19wYXJ0XShzdHJpbmcgKyAnJykucmVwbGFjZShVUkkuY2hhcmFjdGVyc1tfZ3JvdXBdW19wYXJ0XS5leHByZXNzaW9uLCBmdW5jdGlvbihjKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFVSSS5jaGFyYWN0ZXJzW19ncm91cF1bX3BhcnRdLm1hcFtjXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIHdlJ3JlIG5vdCBnb2luZyB0byBtZXNzIHdpdGggd2VpcmQgZW5jb2RpbmdzLFxuXHRcdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy84N1xuXHRcdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvaXNzdWVzLzkyXG5cdFx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRmb3IgKF9wYXJ0IGluIF9wYXJ0cykge1xuXHRcdFVSSVtfcGFydCArICdQYXRoU2VnbWVudCddID0gZ2VuZXJhdGVBY2Nlc3NvcigncGF0aG5hbWUnLCBfcGFydHNbX3BhcnRdKTtcblx0XHRVUklbX3BhcnQgKyAnVXJuUGF0aFNlZ21lbnQnXSA9IGdlbmVyYXRlQWNjZXNzb3IoJ3VybnBhdGgnLCBfcGFydHNbX3BhcnRdKTtcblx0fVxuXG5cdHZhciBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbiA9IGZ1bmN0aW9uKF9zZXAsIF9jb2RpbmdGdW5jTmFtZSwgX2lubmVyQ29kaW5nRnVuY05hbWUpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHQvLyBXaHkgcGFzcyBpbiBuYW1lcyBvZiBmdW5jdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXM/IFRoZVxuXHRcdFx0Ly8gZGVmaW5pdGlvbnMgb2Ygc29tZSBmdW5jdGlvbnMgKGJ1dCBpbiBwYXJ0aWN1bGFyLCBVUkkuZGVjb2RlKSB3aWxsIG9jY2FzaW9uYWxseSBjaGFuZ2UgZHVlXG5cdFx0XHQvLyB0byBVUkkuanMgaGF2aW5nIElTTzg4NTkgYW5kIFVuaWNvZGUgbW9kZXMuIFBhc3NpbmcgaW4gdGhlIG5hbWUgYW5kIGdldHRpbmcgaXQgd2lsbCBlbnN1cmVcblx0XHRcdC8vIHRoYXQgdGhlIGZ1bmN0aW9ucyB3ZSB1c2UgaGVyZSBhcmUgXCJmcmVzaFwiLlxuXHRcdFx0dmFyIGFjdHVhbENvZGluZ0Z1bmM7XG5cdFx0XHRpZiAoIV9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBVUklbX2NvZGluZ0Z1bmNOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gVVJJW19jb2RpbmdGdW5jTmFtZV0oVVJJW19pbm5lckNvZGluZ0Z1bmNOYW1lXShzdHJpbmcpKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHNlZ21lbnRzID0gKHN0cmluZyArICcnKS5zcGxpdChfc2VwKTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNlZ21lbnRzW2ldID0gYWN0dWFsQ29kaW5nRnVuYyhzZWdtZW50c1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWdtZW50cy5qb2luKF9zZXApO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVGhpcyB0YWtlcyBwbGFjZSBvdXRzaWRlIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCwgZS5nLiwgZW5jb2RlVXJuUGF0aCBmdW5jdGlvbnMuXG5cdFVSSS5kZWNvZGVQYXRoID0gZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24oJy8nLCAnZGVjb2RlUGF0aFNlZ21lbnQnKTtcblx0VVJJLmRlY29kZVVyblBhdGggPSBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbignOicsICdkZWNvZGVVcm5QYXRoU2VnbWVudCcpO1xuXHRVUkkucmVjb2RlUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCcvJywgJ2VuY29kZVBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXHRVUkkucmVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCc6JywgJ2VuY29kZVVyblBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXG5cdFVSSS5lbmNvZGVSZXNlcnZlZCA9IGdlbmVyYXRlQWNjZXNzb3IoJ3Jlc2VydmVkJywgJ2VuY29kZScpO1xuXG5cdFVSSS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHR2YXIgcG9zO1xuXHRcdGlmICghcGFydHMpIHtcblx0XHRcdHBhcnRzID0ge307XG5cdFx0fVxuXHRcdC8vIFtwcm90b2NvbFwiOi8vXCJbdXNlcm5hbWVbXCI6XCJwYXNzd29yZF1cIkBcIl1ob3N0bmFtZVtcIjpcInBvcnRdXCIvXCI/XVtwYXRoXVtcIj9cInF1ZXJ5c3RyaW5nXVtcIiNcImZyYWdtZW50XVxuXG5cdFx0Ly8gZXh0cmFjdCBmcmFnbWVudFxuXHRcdHBvcyA9IHN0cmluZy5pbmRleE9mKCcjJyk7XG5cdFx0aWYgKHBvcyA+IC0xKSB7XG5cdFx0XHQvLyBlc2NhcGluZz9cblx0XHRcdHBhcnRzLmZyYWdtZW50ID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxKSB8fCBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuXHRcdH1cblxuXHRcdC8vIGV4dHJhY3QgcXVlcnlcblx0XHRwb3MgPSBzdHJpbmcuaW5kZXhPZignPycpO1xuXHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0Ly8gZXNjYXBpbmc/XG5cdFx0XHRwYXJ0cy5xdWVyeSA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTtcblx0XHR9XG5cblx0XHQvLyBleHRyYWN0IHByb3RvY29sXG5cdFx0aWYgKHN0cmluZy5zdWJzdHJpbmcoMCwgMikgPT09ICcvLycpIHtcblx0XHRcdC8vIHJlbGF0aXZlLXNjaGVtZVxuXHRcdFx0cGFydHMucHJvdG9jb2wgPSBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygyKTtcblx0XHRcdC8vIGV4dHJhY3QgXCJ1c2VyOnBhc3NAaG9zdDpwb3J0XCJcblx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zID0gc3RyaW5nLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0XHRwYXJ0cy5wcm90b2NvbCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAocGFydHMucHJvdG9jb2wgJiYgIXBhcnRzLnByb3RvY29sLm1hdGNoKFVSSS5wcm90b2NvbF9leHByZXNzaW9uKSkge1xuXHRcdFx0XHRcdC8vIDogbWF5IGJlIHdpdGhpbiB0aGUgcGF0aFxuXHRcdFx0XHRcdHBhcnRzLnByb3RvY29sID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykgPT09ICcvLycpIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDMpO1xuXG5cdFx0XHRcdFx0Ly8gZXh0cmFjdCBcInVzZXI6cGFzc0Bob3N0OnBvcnRcIlxuXHRcdFx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdFx0XHRcdHBhcnRzLnVybiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB3aGF0J3MgbGVmdCBtdXN0IGJlIHRoZSBwYXRoXG5cdFx0cGFydHMucGF0aCA9IHN0cmluZztcblxuXHRcdC8vIGFuZCB3ZSdyZSBkb25lXG5cdFx0cmV0dXJuIHBhcnRzO1xuXHR9O1xuXHRVUkkucGFyc2VIb3N0ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuXHRcdC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuXHRcdC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2Jsb2IvMzg2ZmQyNGY0OWIwZTlkMWE4YTA3NjU5MmE0MDQxNjhmYWVlY2MzNC9saWIvdXJsLmpzI0wxMTUtTDEyNFxuXHRcdC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvcHVsbC8yMzNcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5cdFx0Ly8gZXh0cmFjdCBob3N0OnBvcnRcblx0XHR2YXIgcG9zID0gc3RyaW5nLmluZGV4T2YoJy8nKTtcblx0XHR2YXIgYnJhY2tldFBvcztcblx0XHR2YXIgdDtcblxuXHRcdGlmIChwb3MgPT09IC0xKSB7XG5cdFx0XHRwb3MgPSBzdHJpbmcubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChzdHJpbmcuY2hhckF0KDApID09PSAnWycpIHtcblx0XHRcdC8vIElQdjYgaG9zdCAtIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtNm1hbi10ZXh0LWFkZHItcmVwcmVzZW50YXRpb24tMDQjc2VjdGlvbi02XG5cdFx0XHQvLyBJIGNsYWltIG1vc3QgY2xpZW50IHNvZnR3YXJlIGJyZWFrcyBvbiBJUHY2IGFueXdheXMuIFRvIHNpbXBsaWZ5IHRoaW5ncywgVVJJIG9ubHkgYWNjZXB0c1xuXHRcdFx0Ly8gSVB2Nitwb3J0IGluIHRoZSBmb3JtYXQgWzIwMDE6ZGI4OjoxXTo4MCAoZm9yIHRoZSB0aW1lIGJlaW5nKVxuXHRcdFx0YnJhY2tldFBvcyA9IHN0cmluZy5pbmRleE9mKCddJyk7XG5cdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHN0cmluZy5zdWJzdHJpbmcoMSwgYnJhY2tldFBvcykgfHwgbnVsbDtcblx0XHRcdHBhcnRzLnBvcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGJyYWNrZXRQb3MgKyAyLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRpZiAocGFydHMucG9ydCA9PT0gJy8nKSB7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZmlyc3RDb2xvbiA9IHN0cmluZy5pbmRleE9mKCc6Jyk7XG5cdFx0XHR2YXIgZmlyc3RTbGFzaCA9IHN0cmluZy5pbmRleE9mKCcvJyk7XG5cdFx0XHR2YXIgbmV4dENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBmaXJzdENvbG9uICsgMSk7XG5cdFx0XHRpZiAobmV4dENvbG9uICE9PSAtMSAmJiAoZmlyc3RTbGFzaCA9PT0gLTEgfHwgbmV4dENvbG9uIDwgZmlyc3RTbGFzaCkpIHtcblx0XHRcdFx0Ly8gSVB2NiBob3N0IGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ucyAtIGJ1dCBubyBwb3J0XG5cdFx0XHRcdC8vIHRoaXMgbm90YXRpb24gaXMgYWN0dWFsbHkgbm90IGFsbG93ZWQgYnkgUkZDIDM5ODYsIGJ1dCB3ZSdyZSBhIGxpYmVyYWwgcGFyc2VyXG5cdFx0XHRcdHBhcnRzLmhvc3RuYW1lID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHRbMF0gfHwgbnVsbDtcblx0XHRcdFx0cGFydHMucG9ydCA9IHRbMV0gfHwgbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocGFydHMuaG9zdG5hbWUgJiYgc3RyaW5nLnN1YnN0cmluZyhwb3MpLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRwb3MrKztcblx0XHRcdHN0cmluZyA9ICcvJyArIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwb3MpIHx8ICcvJztcblx0fTtcblx0VVJJLnBhcnNlQXV0aG9yaXR5ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdHN0cmluZyA9IFVSSS5wYXJzZVVzZXJpbmZvKHN0cmluZywgcGFydHMpO1xuXHRcdHJldHVybiBVUkkucGFyc2VIb3N0KHN0cmluZywgcGFydHMpO1xuXHR9O1xuXHRVUkkucGFyc2VVc2VyaW5mbyA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHQvLyBleHRyYWN0IHVzZXJuYW1lOnBhc3N3b3JkXG5cdFx0dmFyIGZpcnN0U2xhc2ggPSBzdHJpbmcuaW5kZXhPZignLycpO1xuXHRcdHZhciBwb3MgPSBzdHJpbmcubGFzdEluZGV4T2YoJ0AnLCBmaXJzdFNsYXNoID4gLTEgPyBmaXJzdFNsYXNoIDogc3RyaW5nLmxlbmd0aCAtIDEpO1xuXHRcdHZhciB0O1xuXG5cdFx0Ly8gYXV0aG9yaXR5QCBtdXN0IGNvbWUgYmVmb3JlIC9wYXRoXG5cdFx0aWYgKHBvcyA+IC0xICYmIChmaXJzdFNsYXNoID09PSAtMSB8fCBwb3MgPCBmaXJzdFNsYXNoKSkge1xuXHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0cGFydHMudXNlcm5hbWUgPSB0WzBdID8gVVJJLmRlY29kZSh0WzBdKSA6IG51bGw7XG5cdFx0XHR0LnNoaWZ0KCk7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IHRbMF0gPyBVUkkuZGVjb2RlKHQuam9pbignOicpKSA6IG51bGw7XG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJ0cy51c2VybmFtZSA9IG51bGw7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblx0VVJJLnBhcnNlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdC8vIHRocm93IG91dCB0aGUgZnVua3kgYnVzaW5lc3MgLSBcIj9cIltuYW1lXCI9XCJ2YWx1ZVwiJlwiXStcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJisvZywgJyYnKS5yZXBsYWNlKC9eXFw/KiYqfCYrJC9nLCAnJyk7XG5cblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdHZhciBpdGVtcyA9IHt9O1xuXHRcdHZhciBzcGxpdHMgPSBzdHJpbmcuc3BsaXQoJyYnKTtcblx0XHR2YXIgbGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcblx0XHR2YXIgdiwgbmFtZSwgdmFsdWU7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2ID0gc3BsaXRzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRuYW1lID0gVVJJLmRlY29kZVF1ZXJ5KHYuc2hpZnQoKSwgZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHQvLyBubyBcIj1cIiBpcyBudWxsIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHRcdHZhbHVlID0gdi5sZW5ndGggPyBVUkkuZGVjb2RlUXVlcnkodi5qb2luKCc9JyksIGVzY2FwZVF1ZXJ5U3BhY2UpIDogbnVsbDtcblxuXHRcdFx0aWYgKGhhc093bi5jYWxsKGl0ZW1zLCBuYW1lKSkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW1zW25hbWVdID09PSAnc3RyaW5nJyB8fCBpdGVtc1tuYW1lXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGl0ZW1zW25hbWVdID0gW2l0ZW1zW25hbWVdXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1zW25hbWVdLnB1c2godmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXRlbXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbXM7XG5cdH07XG5cblx0VVJJLmJ1aWxkID0gZnVuY3Rpb24ocGFydHMpIHtcblx0XHR2YXIgdCA9ICcnO1xuXG5cdFx0aWYgKHBhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHBhcnRzLnByb3RvY29sICsgJzonO1xuXHRcdH1cblxuXHRcdGlmICghcGFydHMudXJuICYmICh0IHx8IHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnLy8nO1xuXHRcdH1cblxuXHRcdHQgKz0gKFVSSS5idWlsZEF1dGhvcml0eShwYXJ0cykgfHwgJycpO1xuXG5cdFx0aWYgKHR5cGVvZiBwYXJ0cy5wYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHBhcnRzLnBhdGguY2hhckF0KDApICE9PSAnLycgJiYgdHlwZW9mIHBhcnRzLmhvc3RuYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHR0ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0dCArPSBwYXJ0cy5wYXRoO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMucXVlcnkgPT09ICdzdHJpbmcnICYmIHBhcnRzLnF1ZXJ5KSB7XG5cdFx0XHR0ICs9ICc/JyArIHBhcnRzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMuZnJhZ21lbnQgPT09ICdzdHJpbmcnICYmIHBhcnRzLmZyYWdtZW50KSB7XG5cdFx0XHR0ICs9ICcjJyArIHBhcnRzLmZyYWdtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkSG9zdCA9IGZ1bmN0aW9uKHBhcnRzKSB7XG5cdFx0dmFyIHQgPSAnJztcblxuXHRcdGlmICghcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IGVsc2UgaWYgKFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnWycgKyBwYXJ0cy5ob3N0bmFtZSArICddJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCArPSBwYXJ0cy5ob3N0bmFtZTtcblx0XHR9XG5cblx0XHRpZiAocGFydHMucG9ydCkge1xuXHRcdFx0dCArPSAnOicgKyBwYXJ0cy5wb3J0O1xuXHRcdH1cblxuXHRcdHJldHVybiB0O1xuXHR9O1xuXHRVUkkuYnVpbGRBdXRob3JpdHkgPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHJldHVybiBVUkkuYnVpbGRVc2VyaW5mbyhwYXJ0cykgKyBVUkkuYnVpbGRIb3N0KHBhcnRzKTtcblx0fTtcblx0VVJJLmJ1aWxkVXNlcmluZm8gPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHZhciB0ID0gJyc7XG5cblx0XHRpZiAocGFydHMudXNlcm5hbWUpIHtcblx0XHRcdHQgKz0gVVJJLmVuY29kZShwYXJ0cy51c2VybmFtZSk7XG5cblx0XHRcdGlmIChwYXJ0cy5wYXNzd29yZCkge1xuXHRcdFx0XHR0ICs9ICc6JyArIFVSSS5lbmNvZGUocGFydHMucGFzc3dvcmQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0ICs9ICdAJztcblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBkdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHQvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiBvciBodHRwOi8vbGFicy5hcGFjaGUub3JnL3dlYmFyY2gvdXJpL3JmYy9yZmMzOTg2Lmh0bWxcblx0XHQvLyBiZWluZyDCuy0uX34hJCYnKCkqKyw7PTpALz/CqyAlSEVYIGFuZCBhbG51bSBhcmUgYWxsb3dlZFxuXHRcdC8vIHRoZSBSRkMgZXhwbGljaXRseSBzdGF0ZXMgPy9mb28gYmVpbmcgYSB2YWxpZCB1c2UgY2FzZSwgbm8gbWVudGlvbiBvZiBwYXJhbWV0ZXIgc3ludGF4IVxuXHRcdC8vIFVSSS5qcyB0cmVhdHMgdGhlIHF1ZXJ5IHN0cmluZyBhcyBiZWluZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2Zvcm0tY29udGVudC10eXBlXG5cblx0XHR2YXIgdCA9ICcnO1xuXHRcdHZhciB1bmlxdWUsIGtleSwgaSwgbGVuZ3RoO1xuXHRcdGZvciAoa2V5IGluIGRhdGEpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChkYXRhLCBrZXkpICYmIGtleSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheShkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0dW5pcXVlID0ge307XG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gZGF0YVtrZXldLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldW2ldICE9PSB1bmRlZmluZWQgJiYgdW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHQgKz0gJyYnICsgVVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIoa2V5LCBkYXRhW2tleV1baV0sIGVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0ICs9ICcmJyArIFVSSS5idWlsZFF1ZXJ5UGFyYW1ldGVyKGtleSwgZGF0YVtrZXldLCBlc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0LnN1YnN0cmluZygxKTtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXNjYXBlUXVlcnlTcGFjZSkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNmb3JtLWNvbnRlbnQtdHlwZSAtLSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBkb24ndCBhcHBlbmQgXCI9XCIgZm9yIG51bGwgdmFsdWVzLCBhY2NvcmRpbmcgdG8gaHR0cDovL2R2Y3MudzMub3JnL2hnL3VybC9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCN1cmwtcGFyYW1ldGVyLXNlcmlhbGl6YXRpb25cblx0XHRyZXR1cm4gVVJJLmVuY29kZVF1ZXJ5KG5hbWUsIGVzY2FwZVF1ZXJ5U3BhY2UpICsgKHZhbHVlICE9PSBudWxsID8gJz0nICsgVVJJLmVuY29kZVF1ZXJ5KHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSA6ICcnKTtcblx0fTtcblxuXHRVUkkuYWRkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBuYW1lLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRhdGFbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGF0YVtuYW1lXSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IFtkYXRhW25hbWVdXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV07XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbbmFtZV0gPSAoZGF0YVtuYW1lXSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aCwga2V5O1xuXG5cdFx0aWYgKGlzQXJyYXkobmFtZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGF0YVtuYW1lW2ldXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGdldFR5cGUobmFtZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBkYXRhKSB7XG5cdFx0XHRcdGlmIChuYW1lLnRlc3Qoa2V5KSkge1xuXHRcdFx0XHRcdGRhdGFba2V5XSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLnJlbW92ZVF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pICYmIHZhbHVlLnRlc3QoZGF0YVtuYW1lXSkpIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSBmaWx0ZXJBcnJheVZhbHVlcyhkYXRhW25hbWVdLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFbbmFtZV0gPT09IFN0cmluZyh2YWx1ZSkgJiYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDEpKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5oYXNRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlLCB3aXRoaW5BcnJheSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0aWYgKCFVUkkuaGFzUXVlcnkoZGF0YSwga2V5LCBuYW1lW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlcicpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoZ2V0VHlwZSh2YWx1ZSkpIHtcblx0XHRcdGNhc2UgJ1VuZGVmaW5lZCc6XG5cdFx0XHRcdC8vIHRydWUgaWYgZXhpc3RzIChidXQgbWF5IGJlIGVtcHR5KVxuXHRcdFx0XHRyZXR1cm4gbmFtZSBpbiBkYXRhOyAvLyBkYXRhW25hbWVdICE9PSB1bmRlZmluZWQ7XG5cblx0XHRcdGNhc2UgJ0Jvb2xlYW4nOlxuXHRcdFx0XHQvLyB0cnVlIGlmIGV4aXN0cyBhbmQgbm9uLWVtcHR5XG5cdFx0XHRcdHZhciBfYm9vbHkgPSBCb29sZWFuKGlzQXJyYXkoZGF0YVtuYW1lXSkgPyBkYXRhW25hbWVdLmxlbmd0aCA6IGRhdGFbbmFtZV0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IF9ib29seTtcblxuXHRcdFx0Y2FzZSAnRnVuY3Rpb24nOlxuXHRcdFx0XHQvLyBhbGxvdyBjb21wbGV4IGNvbXBhcmlzb25cblx0XHRcdFx0cmV0dXJuICEhdmFsdWUoZGF0YVtuYW1lXSwgbmFtZSwgZGF0YSk7XG5cblx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9wID0gd2l0aGluQXJyYXkgPyBhcnJheUNvbnRhaW5zIDogYXJyYXlzRXF1YWw7XG5cdFx0XHRcdHJldHVybiBvcChkYXRhW25hbWVdLCB2YWx1ZSk7XG5cblx0XHRcdGNhc2UgJ1JlZ0V4cCc6XG5cdFx0XHRcdGlmICghaXNBcnJheShkYXRhW25hbWVdKSkge1xuXHRcdFx0XHRcdHJldHVybiBCb29sZWFuKGRhdGFbbmFtZV0gJiYgZGF0YVtuYW1lXS5tYXRjaCh2YWx1ZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0dmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnU3RyaW5nJzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGFbbmFtZV0gPT09IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyB1bmRlZmluZWQsIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBSZWdFeHAsIEZ1bmN0aW9uIGFzIHRoZSB2YWx1ZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cblxuXHRVUkkuY29tbW9uUGF0aCA9IGZ1bmN0aW9uKG9uZSwgdHdvKSB7XG5cdFx0dmFyIGxlbmd0aCA9IE1hdGgubWluKG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpO1xuXHRcdHZhciBwb3M7XG5cblx0XHQvLyBmaW5kIGZpcnN0IG5vbi1tYXRjaGluZyBjaGFyYWN0ZXJcblx0XHRmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbmd0aDsgcG9zKyspIHtcblx0XHRcdGlmIChvbmUuY2hhckF0KHBvcykgIT09IHR3by5jaGFyQXQocG9zKSkge1xuXHRcdFx0XHRwb3MtLTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBvcyA8IDEpIHtcblx0XHRcdHJldHVybiBvbmUuY2hhckF0KDApID09PSB0d28uY2hhckF0KDApICYmIG9uZS5jaGFyQXQoMCkgPT09ICcvJyA/ICcvJyA6ICcnO1xuXHRcdH1cblxuXHRcdC8vIHJldmVydCB0byBsYXN0IC9cblx0XHRpZiAob25lLmNoYXJBdChwb3MpICE9PSAnLycgfHwgdHdvLmNoYXJBdChwb3MpICE9PSAnLycpIHtcblx0XHRcdHBvcyA9IG9uZS5zdWJzdHJpbmcoMCwgcG9zKS5sYXN0SW5kZXhPZignLycpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpO1xuXHR9O1xuXG5cdFVSSS53aXRoaW5TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblx0XHR2YXIgX3N0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCBVUkkuZmluZFVyaS5zdGFydDtcblx0XHR2YXIgX2VuZCA9IG9wdGlvbnMuZW5kIHx8IFVSSS5maW5kVXJpLmVuZDtcblx0XHR2YXIgX3RyaW0gPSBvcHRpb25zLnRyaW0gfHwgVVJJLmZpbmRVcmkudHJpbTtcblx0XHR2YXIgX2F0dHJpYnV0ZU9wZW4gPSAvW2EtejAtOS1dPVtcIiddPyQvaTtcblxuXHRcdF9zdGFydC5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHR2YXIgbWF0Y2ggPSBfc3RhcnQuZXhlYyhzdHJpbmcpO1xuXHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRpZiAob3B0aW9ucy5pZ25vcmVIdG1sKSB7XG5cdFx0XHRcdC8vIGF0dHJpYnV0KGU9W1wiJ10/JClcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZU9wZW4gPSBzdHJpbmcuc2xpY2UoTWF0aC5tYXgoc3RhcnQgLSAzLCAwKSwgc3RhcnQpO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlT3BlbiAmJiBfYXR0cmlidXRlT3Blbi50ZXN0KGF0dHJpYnV0ZU9wZW4pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGVuZCA9IHN0YXJ0ICsgc3RyaW5nLnNsaWNlKHN0YXJ0KS5zZWFyY2goX2VuZCk7XG5cdFx0XHR2YXIgc2xpY2UgPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZShfdHJpbSwgJycpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaWdub3JlICYmIG9wdGlvbnMuaWdub3JlLnRlc3Qoc2xpY2UpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRlbmQgPSBzdGFydCArIHNsaWNlLmxlbmd0aDtcblx0XHRcdHZhciByZXN1bHQgPSBjYWxsYmFjayhzbGljZSwgc3RhcnQsIGVuZCwgc3RyaW5nKTtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zbGljZSgwLCBzdGFydCkgKyByZXN1bHQgKyBzdHJpbmcuc2xpY2UoZW5kKTtcblx0XHRcdF9zdGFydC5sYXN0SW5kZXggPSBzdGFydCArIHJlc3VsdC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0X3N0YXJ0Lmxhc3RJbmRleCA9IDA7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSA9IGZ1bmN0aW9uKHYpIHtcblx0XHQvLyBUaGVvcmV0aWNhbGx5IFVSSXMgYWxsb3cgcGVyY2VudC1lbmNvZGluZyBpbiBIb3N0bmFtZXMgKGFjY29yZGluZyB0byBSRkMgMzk4Nilcblx0XHQvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBETlMgYW5kIHRoZXJlZm9yZSBpZ25vcmVkIGJ5IFVSSS5qc1xuXG5cdFx0aWYgKHYubWF0Y2goVVJJLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpIHtcblx0XHRcdC8vIHRlc3QgcHVueWNvZGVcblx0XHRcdGlmICghcHVueWNvZGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHVueWNvZGUudG9BU0NJSSh2KS5tYXRjaChVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIG5vQ29uZmxpY3Rcblx0VVJJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbihyZW1vdmVBbGwpIHtcblx0XHRpZiAocmVtb3ZlQWxsKSB7XG5cdFx0XHR2YXIgdW5jb25mbGljdGVkID0ge1xuXHRcdFx0XHRVUkk6IHRoaXMubm9Db25mbGljdCgpXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocm9vdC5VUklUZW1wbGF0ZSAmJiB0eXBlb2Ygcm9vdC5VUklUZW1wbGF0ZS5ub0NvbmZsaWN0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHVuY29uZmxpY3RlZC5VUklUZW1wbGF0ZSA9IHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdC5JUHY2ICYmIHR5cGVvZiByb290LklQdjYubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuSVB2NiA9IHJvb3QuSVB2Ni5ub0NvbmZsaWN0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290LlNlY29uZExldmVsRG9tYWlucyAmJiB0eXBlb2Ygcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuU2Vjb25kTGV2ZWxEb21haW5zID0gcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5jb25mbGljdGVkO1xuXHRcdH0gZWxzZSBpZiAocm9vdC5VUkkgPT09IHRoaXMpIHtcblx0XHRcdHJvb3QuVVJJID0gX1VSSTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmJ1aWxkID0gZnVuY3Rpb24oZGVmZXJCdWlsZCkge1xuXHRcdGlmIChkZWZlckJ1aWxkID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChkZWZlckJ1aWxkID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZGVmZXJyZWRfYnVpbGQpIHtcblx0XHRcdHRoaXMuX3N0cmluZyA9IFVSSS5idWlsZCh0aGlzLl9wYXJ0cyk7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAuY2xvbmUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFVSSSh0aGlzKTtcblx0fTtcblxuXHRwLnZhbHVlT2YgPSBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnVpbGQoZmFsc2UpLl9zdHJpbmc7XG5cdH07XG5cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKF9wYXJ0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzW19wYXJ0XSB8fCAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzW19wYXJ0XSA9IHYgfHwgbnVsbDtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVQcmVmaXhBY2Nlc3NvcihfcGFydCwgX2tleSl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0c1tfcGFydF0gfHwgJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHYgPSB2ICsgJyc7XG5cdFx0XHRcdFx0aWYgKHYuY2hhckF0KDApID09PSBfa2V5KSB7XG5cdFx0XHRcdFx0XHR2ID0gdi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fcGFydHNbX3BhcnRdID0gdjtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cC5wcm90b2NvbCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3Byb3RvY29sJyk7XG5cdHAudXNlcm5hbWUgPSBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKCd1c2VybmFtZScpO1xuXHRwLnBhc3N3b3JkID0gZ2VuZXJhdGVTaW1wbGVBY2Nlc3NvcigncGFzc3dvcmQnKTtcblx0cC5ob3N0bmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ2hvc3RuYW1lJyk7XG5cdHAucG9ydCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3BvcnQnKTtcblx0cC5xdWVyeSA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ3F1ZXJ5JywgJz8nKTtcblx0cC5mcmFnbWVudCA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ2ZyYWdtZW50JywgJyMnKTtcblxuXHRwLnNlYXJjaCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0dmFyIHQgPSB0aGlzLnF1ZXJ5KHYsIGJ1aWxkKTtcblx0XHRyZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID8gKCc/JyArIHQpIDogdDtcblx0fTtcblx0cC5oYXNoID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgdCA9IHRoaXMuZnJhZ21lbnQodiwgYnVpbGQpO1xuXHRcdHJldHVybiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgdC5sZW5ndGggPyAoJyMnICsgdCkgOiB0O1xuXHR9O1xuXG5cdHAucGF0aG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGggfHwgKHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gJy8nIDogJycpO1xuXHRcdFx0cmV0dXJuIHYgPyAodGhpcy5fcGFydHMudXJuID8gVVJJLmRlY29kZVVyblBhdGggOiBVUkkuZGVjb2RlUGF0aCkocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVVcm5QYXRoKHYpIDogJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVQYXRoKHYpIDogJy8nO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnBhdGggPSBwLnBhdGhuYW1lO1xuXHRwLmhyZWYgPSBmdW5jdGlvbihocmVmLCBidWlsZCkge1xuXHRcdHZhciBrZXk7XG5cblx0XHRpZiAoaHJlZiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0cmluZyA9ICcnO1xuXHRcdHRoaXMuX3BhcnRzID0gVVJJLl9wYXJ0cygpO1xuXG5cdFx0dmFyIF9VUkkgPSBocmVmIGluc3RhbmNlb2YgVVJJO1xuXHRcdHZhciBfb2JqZWN0ID0gdHlwZW9mIGhyZWYgPT09ICdvYmplY3QnICYmIChocmVmLmhvc3RuYW1lIHx8IGhyZWYucGF0aCB8fCBocmVmLnBhdGhuYW1lKTtcblx0XHRpZiAoaHJlZi5ub2RlTmFtZSkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IFVSSS5nZXREb21BdHRyaWJ1dGUoaHJlZik7XG5cdFx0XHRocmVmID0gaHJlZlthdHRyaWJ1dGVdIHx8ICcnO1xuXHRcdFx0X29iamVjdCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHdpbmRvdy5sb2NhdGlvbiBpcyByZXBvcnRlZCB0byBiZSBhbiBvYmplY3QsIGJ1dCBpdCdzIG5vdCB0aGUgc29ydFxuXHRcdC8vIG9mIG9iamVjdCB3ZSdyZSBsb29raW5nIGZvcjpcblx0XHQvLyAqIGxvY2F0aW9uLnByb3RvY29sIGVuZHMgd2l0aCBhIGNvbG9uXG5cdFx0Ly8gKiBsb2NhdGlvbi5xdWVyeSAhPSBvYmplY3Quc2VhcmNoXG5cdFx0Ly8gKiBsb2NhdGlvbi5oYXNoICE9IG9iamVjdC5mcmFnbWVudFxuXHRcdC8vIHNpbXBseSBzZXJpYWxpemluZyB0aGUgdW5rbm93biBvYmplY3Qgc2hvdWxkIGRvIHRoZSB0cmlja1xuXHRcdC8vIChmb3IgbG9jYXRpb24sIG5vdCBmb3IgZXZlcnl0aGluZy4uLilcblx0XHRpZiAoIV9VUkkgJiYgX29iamVjdCAmJiBocmVmLnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGhyZWYgPSBocmVmLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBocmVmID09PSAnc3RyaW5nJyB8fCBocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cyA9IFVSSS5wYXJzZShTdHJpbmcoaHJlZiksIHRoaXMuX3BhcnRzKTtcblx0XHR9IGVsc2UgaWYgKF9VUkkgfHwgX29iamVjdCkge1xuXHRcdFx0dmFyIHNyYyA9IF9VUkkgPyBocmVmLl9wYXJ0cyA6IGhyZWY7XG5cdFx0XHRmb3IgKGtleSBpbiBzcmMpIHtcblx0XHRcdFx0aWYgKGhhc093bi5jYWxsKHRoaXMuX3BhcnRzLCBrZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGFydHNba2V5XSA9IHNyY1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5wdXQnKTtcblx0XHR9XG5cblx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Ly8gaWRlbnRpZmljYXRpb24gYWNjZXNzb3JzXG5cdHAuaXMgPSBmdW5jdGlvbih3aGF0KSB7XG5cdFx0dmFyIGlwID0gZmFsc2U7XG5cdFx0dmFyIGlwNCA9IGZhbHNlO1xuXHRcdHZhciBpcDYgPSBmYWxzZTtcblx0XHR2YXIgbmFtZSA9IGZhbHNlO1xuXHRcdHZhciBzbGQgPSBmYWxzZTtcblx0XHR2YXIgaWRuID0gZmFsc2U7XG5cdFx0dmFyIHB1bnljb2RlID0gZmFsc2U7XG5cdFx0dmFyIHJlbGF0aXZlID0gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0cmVsYXRpdmUgPSBmYWxzZTtcblx0XHRcdGlwNCA9IFVSSS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwNiA9IFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwID0gaXA0IHx8IGlwNjtcblx0XHRcdG5hbWUgPSAhaXA7XG5cdFx0XHRzbGQgPSBuYW1lICYmIFNMRCAmJiBTTEQuaGFzKHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlkbiA9IG5hbWUgJiYgVVJJLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdFx0cHVueWNvZGUgPSBuYW1lICYmIFVSSS5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAod2hhdC50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlICdyZWxhdGl2ZSc6XG5cdFx0XHRcdHJldHVybiByZWxhdGl2ZTtcblxuXHRcdFx0Y2FzZSAnYWJzb2x1dGUnOlxuXHRcdFx0XHRyZXR1cm4gIXJlbGF0aXZlO1xuXG5cdFx0XHQvLyBob3N0bmFtZSBpZGVudGlmaWNhdGlvblxuXHRcdFx0Y2FzZSAnZG9tYWluJzpcblx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRyZXR1cm4gbmFtZTtcblxuXHRcdFx0Y2FzZSAnc2xkJzpcblx0XHRcdFx0cmV0dXJuIHNsZDtcblxuXHRcdFx0Y2FzZSAnaXAnOlxuXHRcdFx0XHRyZXR1cm4gaXA7XG5cblx0XHRcdGNhc2UgJ2lwNCc6XG5cdFx0XHRjYXNlICdpcHY0Jzpcblx0XHRcdGNhc2UgJ2luZXQ0Jzpcblx0XHRcdFx0cmV0dXJuIGlwNDtcblxuXHRcdFx0Y2FzZSAnaXA2Jzpcblx0XHRcdGNhc2UgJ2lwdjYnOlxuXHRcdFx0Y2FzZSAnaW5ldDYnOlxuXHRcdFx0XHRyZXR1cm4gaXA2O1xuXG5cdFx0XHRjYXNlICdpZG4nOlxuXHRcdFx0XHRyZXR1cm4gaWRuO1xuXG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0XHRyZXR1cm4gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdFx0Y2FzZSAndXJuJzpcblx0XHRcdFx0cmV0dXJuICEhdGhpcy5fcGFydHMudXJuO1xuXG5cdFx0XHRjYXNlICdwdW55Y29kZSc6XG5cdFx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHQvLyBjb21wb25lbnQgc3BlY2lmaWMgaW5wdXQgdmFsaWRhdGlvblxuXHR2YXIgX3Byb3RvY29sID0gcC5wcm90b2NvbDtcblx0dmFyIF9wb3J0ID0gcC5wb3J0O1xuXHR2YXIgX2hvc3RuYW1lID0gcC5ob3N0bmFtZTtcblxuXHRwLnByb3RvY29sID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHQvLyBhY2NlcHQgdHJhaWxpbmcgOi8vXG5cdFx0XHRcdHYgPSB2LnJlcGxhY2UoLzooXFwvXFwvKT8kLywgJycpO1xuXG5cdFx0XHRcdGlmICghdi5tYXRjaChVUkkucHJvdG9jb2xfZXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm90b2NvbCBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2VzblxcJ3Qgc3RhcnQgd2l0aCBbQS1aXScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfcHJvdG9jb2wuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuc2NoZW1lID0gcC5wcm90b2NvbDtcblx0cC5wb3J0ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh2ID09PSAwKSB7XG5cdFx0XHRcdHYgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHR2ICs9ICcnO1xuXHRcdFx0XHRpZiAodi5jaGFyQXQoMCkgPT09ICc6Jykge1xuXHRcdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2Lm1hdGNoKC9bXjAtOV0vKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BvcnQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gWzAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX3BvcnQuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuaG9zdG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIHggPSB7fTtcblx0XHRcdHZhciByZXMgPSBVUkkucGFyc2VIb3N0KHYsIHgpO1xuXHRcdFx0aWYgKHJlcyAhPT0gJy8nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lIFwiJyArIHYgKyAnXCIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTtcblx0XHRcdH1cblxuXHRcdFx0diA9IHguaG9zdG5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBfaG9zdG5hbWUuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cblx0Ly8gY29tcG91bmQgYWNjZXNzb3JzXG5cdHAub3JpZ2luID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2woKTtcblx0XHRcdHZhciBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSgpO1xuXHRcdFx0aWYgKCFhdXRob3JpdHkpIHJldHVybiAnJztcblx0XHRcdHJldHVybiAocHJvdG9jb2wgPyBwcm90b2NvbCArICc6Ly8nIDogJycpICsgdGhpcy5hdXRob3JpdHkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG9yaWdpbiA9IFVSSSh2KTtcblx0XHRcdHRoaXNcblx0XHRcdFx0LnByb3RvY29sKG9yaWdpbi5wcm90b2NvbCgpKVxuXHRcdFx0XHQuYXV0aG9yaXR5KG9yaWdpbi5hdXRob3JpdHkoKSlcblx0XHRcdFx0LmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuaG9zdCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUgPyBVUkkuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKSA6ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgcmVzID0gVVJJLnBhcnNlSG9zdCh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuYXV0aG9yaXR5ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/IFVSSS5idWlsZEF1dGhvcml0eSh0aGlzLl9wYXJ0cykgOiAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlcyA9IFVSSS5wYXJzZUF1dGhvcml0eSh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAudXNlcmluZm8gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy51c2VybmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gVVJJLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpO1xuXHRcdFx0cmV0dXJuIHQuc3Vic3RyaW5nKDAsIHQubGVuZ3RoIC0xKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZbdi5sZW5ndGgtMV0gIT09ICdAJykge1xuXHRcdFx0XHR2ICs9ICdAJztcblx0XHRcdH1cblxuXHRcdFx0VVJJLnBhcnNlVXNlcmluZm8odiwgdGhpcy5fcGFydHMpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnJlc291cmNlID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXRoKCkgKyB0aGlzLnNlYXJjaCgpICsgdGhpcy5oYXNoKCk7XG5cdFx0fVxuXG5cdFx0cGFydHMgPSBVUkkucGFyc2Uodik7XG5cdFx0dGhpcy5fcGFydHMucGF0aCA9IHBhcnRzLnBhdGg7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBwYXJ0cy5xdWVyeTtcblx0XHR0aGlzLl9wYXJ0cy5mcmFnbWVudCA9IHBhcnRzLmZyYWdtZW50O1xuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvLyBmcmFjdGlvbiBhY2Nlc3NvcnNcblx0cC5zdWJkb21haW4gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVuaWVuY2UsIHJldHVybiBcInd3d1wiIGZyb20gXCJ3d3cuZXhhbXBsZS5vcmdcIlxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGdyYWIgZG9tYWluIGFuZCBhZGQgYW5vdGhlciBzZWdtZW50XG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoIC0gdGhpcy5kb21haW4oKS5sZW5ndGggLSAxO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlbmQpIHx8ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aCAtIHRoaXMuZG9tYWluKCkubGVuZ3RoO1xuXHRcdFx0dmFyIHN1YiA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlKTtcblx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cCgnXicgKyBlc2NhcGVSZWdFeChzdWIpKTtcblxuXHRcdFx0aWYgKHYgJiYgdi5jaGFyQXQodi5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG5cdFx0XHRcdHYgKz0gJy4nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLmRvbWFpbiA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBjb252ZW5pZW5jZSwgcmV0dXJuIFwiZXhhbXBsZS5vcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiBob3N0bmFtZSBjb25zaXN0cyBvZiAxIG9yIDIgc2VnbWVudHMsIGl0IG11c3QgYmUgdGhlIGRvbWFpblxuXHRcdFx0dmFyIHQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5tYXRjaCgvXFwuL2cpO1xuXHRcdFx0aWYgKHQgJiYgdC5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZ3JhYiB0bGQgYW5kIGFkZCBhbm90aGVyIHNlZ21lbnRcblx0XHRcdHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLnRsZChidWlsZCkubGVuZ3RoIC0gMTtcblx0XHRcdGVuZCA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKCcuJywgZW5kIC0xKSArIDE7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKGVuZCkgfHwgJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdikge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eScpO1xuXHRcdFx0fVxuXG5cdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCdJUCcpKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLmRvbWFpbigpKSArICckJyk7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnRsZCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyByZXR1cm4gXCJvcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoJy4nKTtcblx0XHRcdHZhciB0bGQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcocG9zICsgMSk7XG5cblx0XHRcdGlmIChidWlsZCAhPT0gdHJ1ZSAmJiBTTEQgJiYgU0xELmxpc3RbdGxkLnRvTG93ZXJDYXNlKCldKSB7XG5cdFx0XHRcdHJldHVybiBTTEQuZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB8fCB0bGQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0bGQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByZXBsYWNlO1xuXG5cdFx0XHRpZiAoIXYpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBUTEQgZW1wdHknKTtcblx0XHRcdH0gZWxzZSBpZiAodi5tYXRjaCgvW15hLXpBLVowLTktXS8pKSB7XG5cdFx0XHRcdGlmIChTTEQgJiYgU0xELmlzKHYpKSB7XG5cdFx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2Nhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5kaXJlY3RvcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLnBhdGggJiYgIXRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJy8nO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoIC0gMTtcblx0XHRcdHZhciByZXMgPSB0aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLCBlbmQpIHx8ICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/ICcvJyA6ICcnKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aChyZXMpIDogcmVzO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBlID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoO1xuXHRcdFx0dmFyIGRpcmVjdG9yeSA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsIGUpO1xuXHRcdFx0dmFyIHJlcGxhY2UgPSBuZXcgUmVnRXhwKCdeJyArIGVzY2FwZVJlZ0V4KGRpcmVjdG9yeSkpO1xuXG5cdFx0XHQvLyBmdWxseSBxdWFsaWZpZXIgZGlyZWN0b3JpZXMgYmVnaW4gd2l0aCBhIHNsYXNoXG5cdFx0XHRpZiAoIXRoaXMuaXMoJ3JlbGF0aXZlJykpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0diA9ICcvJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2LmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0diA9ICcvJyArIHY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGlyZWN0b3JpZXMgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcblx0XHRcdGlmICh2ICYmIHYuY2hhckF0KHYubGVuZ3RoIC0gMSkgIT09ICcvJykge1xuXHRcdFx0XHR2ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0diA9IFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0dGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5maWxlbmFtZSA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IHRydWUpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMucGF0aCB8fCB0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMucGF0aC5sYXN0SW5kZXhPZignLycpO1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKHBvcysxKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aFNlZ21lbnQocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG11dGF0ZWREaXJlY3RvcnkgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHYuY2hhckF0KDApID09PSAnLycpIHtcblx0XHRcdFx0diA9IHYuc3Vic3RyaW5nKDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodi5tYXRjaCgvXFwuP1xcLy8pKSB7XG5cdFx0XHRcdG11dGF0ZWREaXJlY3RvcnkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy5maWxlbmFtZSgpKSArICckJyk7XG5cdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXG5cdFx0XHRpZiAobXV0YXRlZERpcmVjdG9yeSkge1xuXHRcdFx0XHR0aGlzLm5vcm1hbGl6ZVBhdGgoYnVpbGQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuc3VmZml4ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5wYXRoIHx8IHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmaWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTtcblx0XHRcdHZhciBwb3MgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuXHRcdFx0dmFyIHMsIHJlcztcblxuXHRcdFx0aWYgKHBvcyA9PT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdWZmaXggbWF5IG9ubHkgY29udGFpbiBhbG51bSBjaGFyYWN0ZXJzICh5dXAsIEkgbWFkZSB0aGlzIHVwLilcblx0XHRcdHMgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKzEpO1xuXHRcdFx0cmVzID0gKC9eW2EtejAtOSVdKyQvaSkudGVzdChzKSA/IHMgOiAnJztcblx0XHRcdHJldHVybiB2ID8gVVJJLmRlY29kZVBhdGhTZWdtZW50KHJlcykgOiByZXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG5cdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN1ZmZpeCA9IHRoaXMuc3VmZml4KCk7XG5cdFx0XHR2YXIgcmVwbGFjZTtcblxuXHRcdFx0aWYgKCFzdWZmaXgpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoICs9ICcuJyArIFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0fSBlbHNlIGlmICghdikge1xuXHRcdFx0XHRyZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCgnLicgKyBzdWZmaXgpICsgJyQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHN1ZmZpeCkgKyAnJCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSB0aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5zZWdtZW50ID0gZnVuY3Rpb24oc2VnbWVudCwgdiwgYnVpbGQpIHtcblx0XHR2YXIgc2VwYXJhdG9yID0gdGhpcy5fcGFydHMudXJuID8gJzonIDogJy8nO1xuXHRcdHZhciBwYXRoID0gdGhpcy5wYXRoKCk7XG5cdFx0dmFyIGFic29sdXRlID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJztcblx0XHR2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcGFyYXRvcik7XG5cblx0XHRpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzZWdtZW50ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHNlZ21lbnQ7XG5cdFx0XHRzZWdtZW50ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICdudW1iZXInKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzZWdtZW50IFwiJyArIHNlZ21lbnQgKyAnXCIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFic29sdXRlKSB7XG5cdFx0XHRzZWdtZW50cy5zaGlmdCgpO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50IDwgMCkge1xuXHRcdFx0Ly8gYWxsb3cgbmVnYXRpdmUgaW5kZXhlcyB0byBhZGRyZXNzIGZyb20gdGhlIGVuZFxuXHRcdFx0c2VnbWVudCA9IE1hdGgubWF4KHNlZ21lbnRzLmxlbmd0aCArIHNlZ21lbnQsIDApO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiB0cnVlICovXG5cdFx0XHRyZXR1cm4gc2VnbWVudCA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gc2VnbWVudHNcblx0XHRcdFx0OiBzZWdtZW50c1tzZWdtZW50XTtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiBmYWxzZSAqL1xuXHRcdH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gbnVsbCB8fCBzZWdtZW50c1tzZWdtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNBcnJheSh2KSkge1xuXHRcdFx0XHRzZWdtZW50cyA9IFtdO1xuXHRcdFx0XHQvLyBjb2xsYXBzZSBlbXB0eSBlbGVtZW50cyB3aXRoaW4gYXJyYXlcblx0XHRcdFx0Zm9yICh2YXIgaT0wLCBsPXYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKCF2W2ldLmxlbmd0aCAmJiAoIXNlZ21lbnRzLmxlbmd0aCB8fCAhc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoc2VnbWVudHMubGVuZ3RoICYmICFzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLTFdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VnbWVudHMucG9wKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh0cmltU2xhc2hlcyh2W2ldKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodiB8fCB0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0diA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9PT0gJycpIHtcblx0XHRcdFx0XHQvLyBlbXB0eSB0cmFpbGluZyBlbGVtZW50cyBoYXZlIHRvIGJlIG92ZXJ3cml0dGVuXG5cdFx0XHRcdFx0Ly8gdG8gcHJldmVudCByZXN1bHRzIHN1Y2ggYXMgL2Zvby8vYmFyXG5cdFx0XHRcdFx0c2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh2KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRzZWdtZW50c1tzZWdtZW50XSA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VnbWVudHMuc3BsaWNlKHNlZ21lbnQsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhYnNvbHV0ZSkge1xuXHRcdFx0c2VnbWVudHMudW5zaGlmdCgnJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGF0aChzZWdtZW50cy5qb2luKHNlcGFyYXRvciksIGJ1aWxkKTtcblx0fTtcblx0cC5zZWdtZW50Q29kZWQgPSBmdW5jdGlvbihzZWdtZW50LCB2LCBidWlsZCkge1xuXHRcdHZhciBzZWdtZW50cywgaSwgbDtcblxuXHRcdGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ251bWJlcicpIHtcblx0XHRcdGJ1aWxkID0gdjtcblx0XHRcdHYgPSBzZWdtZW50O1xuXHRcdFx0c2VnbWVudCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWdtZW50cyA9IHRoaXMuc2VnbWVudChzZWdtZW50LCB2LCBidWlsZCk7XG5cdFx0XHRpZiAoIWlzQXJyYXkoc2VnbWVudHMpKSB7XG5cdFx0XHRcdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IFVSSS5kZWNvZGUoc2VnbWVudHMpIDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHNlZ21lbnRzW2ldID0gVVJJLmRlY29kZShzZWdtZW50c1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlZ21lbnRzO1xuXHRcdH1cblxuXHRcdGlmICghaXNBcnJheSh2KSkge1xuXHRcdFx0diA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdiBpbnN0YW5jZW9mIFN0cmluZykgPyBVUkkuZW5jb2RlKHYpIDogdjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChpID0gMCwgbCA9IHYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZbaV0gPSBVUkkuZW5jb2RlKHZbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNlZ21lbnQoc2VnbWVudCwgdiwgYnVpbGQpO1xuXHR9O1xuXG5cdC8vIG11dGF0aW5nIHF1ZXJ5IHN0cmluZ1xuXHR2YXIgcSA9IHAucXVlcnk7XG5cdHAucXVlcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0dmFyIHJlc3VsdCA9IHYuY2FsbCh0aGlzLCBkYXRhKTtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkocmVzdWx0IHx8IGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9IGVsc2UgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkodiwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcS5jYWxsKHRoaXMsIHYsIGJ1aWxkKTtcblx0XHR9XG5cdH07XG5cdHAuc2V0UXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYnVpbGQpIHtcblx0XHR2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHwgbmFtZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0ZGF0YVtuYW1lXSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YVtrZXldID0gbmFtZVtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1VSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmFkZFF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIG5hbWUsIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUpO1xuXHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkoZGF0YSwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRidWlsZCA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBidWlsZCkge1xuXHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFVSSS5yZW1vdmVRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSk7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmhhc1F1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHdpdGhpbkFycmF5KSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0cmV0dXJuIFVSSS5oYXNRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpO1xuXHR9O1xuXHRwLnNldFNlYXJjaCA9IHAuc2V0UXVlcnk7XG5cdHAuYWRkU2VhcmNoID0gcC5hZGRRdWVyeTtcblx0cC5yZW1vdmVTZWFyY2ggPSBwLnJlbW92ZVF1ZXJ5O1xuXHRwLmhhc1NlYXJjaCA9IHAuaGFzUXVlcnk7XG5cblx0Ly8gc2FuaXRpemluZyBVUkxzXG5cdHAubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHRcdFx0Lm5vcm1hbGl6ZVByb3RvY29sKGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplUGF0aChmYWxzZSlcblx0XHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplRnJhZ21lbnQoZmFsc2UpXG5cdFx0XHRcdC5idWlsZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQubm9ybWFsaXplUHJvdG9jb2woZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplSG9zdG5hbWUoZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplUG9ydChmYWxzZSlcblx0XHRcdC5ub3JtYWxpemVQYXRoKGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZUZyYWdtZW50KGZhbHNlKVxuXHRcdFx0LmJ1aWxkKCk7XG5cdH07XG5cdHAubm9ybWFsaXplUHJvdG9jb2wgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wcm90b2NvbCA9IHRoaXMuX3BhcnRzLnByb3RvY29sLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplSG9zdG5hbWUgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuaXMoJ0lETicpICYmIHB1bnljb2RlKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXMoJ0lQdjYnKSAmJiBJUHY2KSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gSVB2Ni5iZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBvcnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdC8vIHJlbW92ZSBwb3J0IG9mIGl0J3MgdGhlIHByb3RvY29sJ3MgZGVmYXVsdFxuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnICYmIHRoaXMuX3BhcnRzLnBvcnQgPT09IFVSSS5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wb3J0ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVQYXRoID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHR2YXIgX3BhdGggPSB0aGlzLl9wYXJ0cy5wYXRoO1xuXHRcdGlmICghX3BhdGgpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSBVUkkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhciBfd2FzX3JlbGF0aXZlO1xuXHRcdHZhciBfbGVhZGluZ1BhcmVudHMgPSAnJztcblx0XHR2YXIgX3BhcmVudCwgX3BvcztcblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRoc1xuXHRcdGlmIChfcGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0X3dhc19yZWxhdGl2ZSA9IHRydWU7XG5cdFx0XHRfcGF0aCA9ICcvJyArIF9wYXRoO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBmaWxlcyAoYXMgb3Bwb3NlZCB0byBkaXJlY3Rvcmllcylcblx0XHRpZiAoX3BhdGguc2xpY2UoLTMpID09PSAnLy4uJyB8fCBfcGF0aC5zbGljZSgtMikgPT09ICcvLicpIHtcblx0XHRcdF9wYXRoICs9ICcvJztcblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHNpbXBsZXNcblx0XHRfcGF0aCA9IF9wYXRoXG5cdFx0XHQucmVwbGFjZSgvKFxcLyhcXC5cXC8pKyl8KFxcL1xcLiQpL2csICcvJylcblx0XHRcdC5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG5cblx0XHQvLyByZW1lbWJlciBsZWFkaW5nIHBhcmVudHNcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSkge1xuXHRcdFx0X2xlYWRpbmdQYXJlbnRzID0gX3BhdGguc3Vic3RyaW5nKDEpLm1hdGNoKC9eKFxcLlxcLlxcLykrLykgfHwgJyc7XG5cdFx0XHRpZiAoX2xlYWRpbmdQYXJlbnRzKSB7XG5cdFx0XHRcdF9sZWFkaW5nUGFyZW50cyA9IF9sZWFkaW5nUGFyZW50c1swXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHBhcmVudHNcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0X3BhcmVudCA9IF9wYXRoLmluZGV4T2YoJy8uLicpO1xuXHRcdFx0aWYgKF9wYXJlbnQgPT09IC0xKSB7XG5cdFx0XHRcdC8vIG5vIG1vcmUgLi4vIHRvIHJlc29sdmVcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2UgaWYgKF9wYXJlbnQgPT09IDApIHtcblx0XHRcdFx0Ly8gdG9wIGxldmVsIGNhbm5vdCBiZSByZWxhdGl2ZSwgc2tpcCBpdFxuXHRcdFx0XHRfcGF0aCA9IF9wYXRoLnN1YnN0cmluZygzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdF9wb3MgPSBfcGF0aC5zdWJzdHJpbmcoMCwgX3BhcmVudCkubGFzdEluZGV4T2YoJy8nKTtcblx0XHRcdGlmIChfcG9zID09PSAtMSkge1xuXHRcdFx0XHRfcG9zID0gX3BhcmVudDtcblx0XHRcdH1cblx0XHRcdF9wYXRoID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wb3MpICsgX3BhdGguc3Vic3RyaW5nKF9wYXJlbnQgKyAzKTtcblx0XHR9XG5cblx0XHQvLyByZXZlcnQgdG8gcmVsYXRpdmVcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSAmJiB0aGlzLmlzKCdyZWxhdGl2ZScpKSB7XG5cdFx0XHRfcGF0aCA9IF9sZWFkaW5nUGFyZW50cyArIF9wYXRoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cblx0XHRfcGF0aCA9IFVSSS5yZWNvZGVQYXRoKF9wYXRoKTtcblx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gX3BhdGg7XG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBhdGhuYW1lID0gcC5ub3JtYWxpemVQYXRoO1xuXHRwLm5vcm1hbGl6ZVF1ZXJ5ID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHRpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnF1ZXJ5ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5xdWVyeS5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5fcGFydHMucXVlcnkgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5xdWVyeShVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplRnJhZ21lbnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICghdGhpcy5fcGFydHMuZnJhZ21lbnQpIHtcblx0XHRcdHRoaXMuX3BhcnRzLmZyYWdtZW50ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVTZWFyY2ggPSBwLm5vcm1hbGl6ZVF1ZXJ5O1xuXHRwLm5vcm1hbGl6ZUhhc2ggPSBwLm5vcm1hbGl6ZUZyYWdtZW50O1xuXG5cdHAuaXNvODg1OSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCB1bmljb2RlIGlucHV0LCBpc284ODU5IG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdFVSSS5lbmNvZGUgPSBlO1xuXHRcdFx0VVJJLmRlY29kZSA9IGQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAudW5pY29kZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCBpc284ODU5IGlucHV0LCB1bmljb2RlIG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0VVJJLmVuY29kZSA9IGU7XG5cdFx0XHRVUkkuZGVjb2RlID0gZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0cC5yZWFkYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmkgPSB0aGlzLmNsb25lKCk7XG5cdFx0Ly8gcmVtb3ZpbmcgdXNlcm5hbWUsIHBhc3N3b3JkLCBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IGJlIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0XHR1cmkudXNlcm5hbWUoJycpLnBhc3N3b3JkKCcnKS5ub3JtYWxpemUoKTtcblx0XHR2YXIgdCA9ICcnO1xuXHRcdGlmICh1cmkuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHVyaS5fcGFydHMucHJvdG9jb2wgKyAnOi8vJztcblx0XHR9XG5cblx0XHRpZiAodXJpLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHVyaS5pcygncHVueWNvZGUnKSAmJiBwdW55Y29kZSkge1xuXHRcdFx0XHR0ICs9IHB1bnljb2RlLnRvVW5pY29kZSh1cmkuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdFx0aWYgKHVyaS5fcGFydHMucG9ydCkge1xuXHRcdFx0XHRcdHQgKz0gJzonICsgdXJpLl9wYXJ0cy5wb3J0O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0ICs9IHVyaS5ob3N0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHVyaS5fcGFydHMuaG9zdG5hbWUgJiYgdXJpLl9wYXJ0cy5wYXRoICYmIHVyaS5fcGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dCArPSAnLyc7XG5cdFx0fVxuXG5cdFx0dCArPSB1cmkucGF0aCh0cnVlKTtcblx0XHRpZiAodXJpLl9wYXJ0cy5xdWVyeSkge1xuXHRcdFx0dmFyIHEgPSAnJztcblx0XHRcdGZvciAodmFyIGkgPSAwLCBxcCA9IHVyaS5fcGFydHMucXVlcnkuc3BsaXQoJyYnKSwgbCA9IHFwLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIga3YgPSAocXBbaV0gfHwgJycpLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHEgKz0gJyYnICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzBdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mL2csICclMjYnKTtcblxuXHRcdFx0XHRpZiAoa3ZbMV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHEgKz0gJz0nICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzFdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyYvZywgJyUyNicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0ICs9ICc/JyArIHEuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHQgKz0gVVJJLmRlY29kZVF1ZXJ5KHVyaS5oYXNoKCksIHRydWUpO1xuXHRcdHJldHVybiB0O1xuXHR9O1xuXG5cdC8vIHJlc29sdmluZyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMc1xuXHRwLmFic29sdXRlVG8gPSBmdW5jdGlvbihiYXNlKSB7XG5cdFx0dmFyIHJlc29sdmVkID0gdGhpcy5jbG9uZSgpO1xuXHRcdHZhciBwcm9wZXJ0aWVzID0gWydwcm90b2NvbCcsICd1c2VybmFtZScsICdwYXNzd29yZCcsICdob3N0bmFtZScsICdwb3J0J107XG5cdFx0dmFyIGJhc2VkaXIsIGksIHA7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoYmFzZSBpbnN0YW5jZW9mIFVSSSkpIHtcblx0XHRcdGJhc2UgPSBuZXcgVVJJKGJhc2UpO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucHJvdG9jb2wgPSBiYXNlLl9wYXJ0cy5wcm90b2NvbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiByZXNvbHZlZDtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyAocCA9IHByb3BlcnRpZXNbaV0pOyBpKyspIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0c1twXSA9IGJhc2UuX3BhcnRzW3BdO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnBhdGgpIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0cy5wYXRoID0gYmFzZS5fcGFydHMucGF0aDtcblx0XHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5KSB7XG5cdFx0XHRcdHJlc29sdmVkLl9wYXJ0cy5xdWVyeSA9IGJhc2UuX3BhcnRzLnF1ZXJ5O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocmVzb2x2ZWQuX3BhcnRzLnBhdGguc3Vic3RyaW5nKC0yKSA9PT0gJy4uJykge1xuXHRcdFx0cmVzb2x2ZWQuX3BhcnRzLnBhdGggKz0gJy8nO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvbHZlZC5wYXRoKCkuY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRcdGJhc2VkaXIgPSBiYXNlLmRpcmVjdG9yeSgpO1xuXHRcdFx0YmFzZWRpciA9IGJhc2VkaXIgPyBiYXNlZGlyIDogYmFzZS5wYXRoKCkuaW5kZXhPZignLycpID09PSAwID8gJy8nIDogJyc7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucGF0aCA9IChiYXNlZGlyID8gKGJhc2VkaXIgKyAnLycpIDogJycpICsgcmVzb2x2ZWQuX3BhcnRzLnBhdGg7XG5cdFx0XHRyZXNvbHZlZC5ub3JtYWxpemVQYXRoKCk7XG5cdFx0fVxuXG5cdFx0cmVzb2x2ZWQuYnVpbGQoKTtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH07XG5cdHAucmVsYXRpdmVUbyA9IGZ1bmN0aW9uKGJhc2UpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSB0aGlzLmNsb25lKCkubm9ybWFsaXplKCk7XG5cdFx0dmFyIHJlbGF0aXZlUGFydHMsIGJhc2VQYXJ0cywgY29tbW9uLCByZWxhdGl2ZVBhdGgsIGJhc2VQYXRoO1xuXG5cdFx0aWYgKHJlbGF0aXZlLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMnKTtcblx0XHR9XG5cblx0XHRiYXNlID0gbmV3IFVSSShiYXNlKS5ub3JtYWxpemUoKTtcblx0XHRyZWxhdGl2ZVBhcnRzID0gcmVsYXRpdmUuX3BhcnRzO1xuXHRcdGJhc2VQYXJ0cyA9IGJhc2UuX3BhcnRzO1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlLnBhdGgoKTtcblx0XHRiYXNlUGF0aCA9IGJhc2UucGF0aCgpO1xuXG5cdFx0aWYgKHJlbGF0aXZlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVUkkgaXMgYWxyZWFkeSByZWxhdGl2ZScpO1xuXHRcdH1cblxuXHRcdGlmIChiYXNlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsY3VsYXRlIGEgVVJJIHJlbGF0aXZlIHRvIGFub3RoZXIgcmVsYXRpdmUgVVJJJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgPT09IGJhc2VQYXJ0cy5wcm90b2NvbCkge1xuXHRcdFx0cmVsYXRpdmVQYXJ0cy5wcm90b2NvbCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IGJhc2VQYXJ0cy51c2VybmFtZSB8fCByZWxhdGl2ZVBhcnRzLnBhc3N3b3JkICE9PSBiYXNlUGFydHMucGFzc3dvcmQpIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhcnRzLnByb3RvY29sICE9PSBudWxsIHx8IHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IG51bGwgfHwgcmVsYXRpdmVQYXJ0cy5wYXNzd29yZCAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPT09IGJhc2VQYXJ0cy5ob3N0bmFtZSAmJiByZWxhdGl2ZVBhcnRzLnBvcnQgPT09IGJhc2VQYXJ0cy5wb3J0KSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLmhvc3RuYW1lID0gbnVsbDtcblx0XHRcdHJlbGF0aXZlUGFydHMucG9ydCA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhdGggPT09IGJhc2VQYXRoKSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLnBhdGggPSAnJztcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBjb21tb24gc3ViIHBhdGhcblx0XHRjb21tb24gPSBVUkkuY29tbW9uUGF0aChyZWxhdGl2ZVBhdGgsIGJhc2VQYXRoKTtcblxuXHRcdC8vIElmIHRoZSBwYXRocyBoYXZlIG5vdGhpbmcgaW4gY29tbW9uLCByZXR1cm4gYSByZWxhdGl2ZSBVUkwgd2l0aCB0aGUgYWJzb2x1dGUgcGF0aC5cblx0XHRpZiAoIWNvbW1vbikge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0dmFyIHBhcmVudHMgPSBiYXNlUGFydHMucGF0aFxuXHRcdFx0LnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKVxuXHRcdFx0LnJlcGxhY2UoL1teXFwvXSokLywgJycpXG5cdFx0XHQucmVwbGFjZSgvLio/XFwvL2csICcuLi8nKTtcblxuXHRcdHJlbGF0aXZlUGFydHMucGF0aCA9IChwYXJlbnRzICsgcmVsYXRpdmVQYXJ0cy5wYXRoLnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKSkgfHwgJy4vJztcblxuXHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHR9O1xuXG5cdC8vIGNvbXBhcmluZyBVUklzXG5cdHAuZXF1YWxzID0gZnVuY3Rpb24odXJpKSB7XG5cdFx0dmFyIG9uZSA9IHRoaXMuY2xvbmUoKTtcblx0XHR2YXIgdHdvID0gbmV3IFVSSSh1cmkpO1xuXHRcdHZhciBvbmVfbWFwID0ge307XG5cdFx0dmFyIHR3b19tYXAgPSB7fTtcblx0XHR2YXIgY2hlY2tlZCA9IHt9O1xuXHRcdHZhciBvbmVfcXVlcnksIHR3b19xdWVyeSwga2V5O1xuXG5cdFx0b25lLm5vcm1hbGl6ZSgpO1xuXHRcdHR3by5ub3JtYWxpemUoKTtcblxuXHRcdC8vIGV4YWN0IG1hdGNoXG5cdFx0aWYgKG9uZS50b1N0cmluZygpID09PSB0d28udG9TdHJpbmcoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gZXh0cmFjdCBxdWVyeSBzdHJpbmdcblx0XHRvbmVfcXVlcnkgPSBvbmUucXVlcnkoKTtcblx0XHR0d29fcXVlcnkgPSB0d28ucXVlcnkoKTtcblx0XHRvbmUucXVlcnkoJycpO1xuXHRcdHR3by5xdWVyeSgnJyk7XG5cblx0XHQvLyBkZWZpbml0ZWx5IG5vdCBlcXVhbCBpZiBub3QgZXZlbiBub24tcXVlcnkgcGFydHMgbWF0Y2hcblx0XHRpZiAob25lLnRvU3RyaW5nKCkgIT09IHR3by50b1N0cmluZygpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gcXVlcnkgcGFyYW1ldGVycyBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgZXZlbiBpZiB0aGV5J3JlIHBlcm11dGVkXG5cdFx0aWYgKG9uZV9xdWVyeS5sZW5ndGggIT09IHR3b19xdWVyeS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvbmVfbWFwID0gVVJJLnBhcnNlUXVlcnkob25lX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHR0d29fbWFwID0gVVJJLnBhcnNlUXVlcnkodHdvX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGZvciAoa2V5IGluIG9uZV9tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChvbmVfbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghaXNBcnJheShvbmVfbWFwW2tleV0pKSB7XG5cdFx0XHRcdFx0aWYgKG9uZV9tYXBba2V5XSAhPT0gdHdvX21hcFtrZXldKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhcnJheXNFcXVhbChvbmVfbWFwW2tleV0sIHR3b19tYXBba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjaGVja2VkW2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoa2V5IGluIHR3b19tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbCh0d29fbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghY2hlY2tlZFtrZXldKSB7XG5cdFx0XHRcdFx0Ly8gdHdvIGNvbnRhaW5zIGEgcGFyYW1ldGVyIG5vdCBwcmVzZW50IGluIG9uZVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdC8vIHN0YXRlXG5cdHAuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24odikge1xuXHRcdHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmVzY2FwZVF1ZXJ5U3BhY2UgPSBmdW5jdGlvbih2KSB7XG5cdFx0dGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRyZXR1cm4gVVJJO1xufSkpOyIsIldvcmtmbG93ID0ge31cblxuQEltYWdlU2lnbiA9IHt9O1xuXG5AVHJhY2VzSGFuZGxlciA9IHt9O1xuXG5AVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxuQEluc3RhbmNlZm9ybVRlbXBsYXRlID0ge307XG5cbkBJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSA9IHt9O1xuXG5ASW5zdGFuY2VTaWduVGV4dCA9IHt9XG5cbkBSZWxhdGVkSW5zdGFuY2VzID0ge31cblxuQFJlbGF0ZWRSZWNvcmRzID0ge31cblxuQEluc3RhbmNlTWFjcm8gPSB7Y29udGV4dDoge319XG5cbkBUcmFjZXNNYW5hZ2VyID0ge307XG5cbkluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcgPSAoZmllbGRfZm9ybXVsYSktPlxuXHRyZXR1cm4gKGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3lpamlhbmxhbjpcIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7J3lpamlhbmxhbic6XCIpID4gLTEpXG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG5cdGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG5cblx0X2Zvcm1fdmVyc2lvbiA9IHt9XG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0X2Zvcm1fdmVyc2lvbiA9IHV1Zmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oZGIuZm9ybXMuZmluZE9uZSh7X2lkOiBmb3JtfSksIGZvcm1fdmVyc2lvbilcblx0ZWxzZVxuXHRcdF9mb3JtX3ZlcnNpb24gPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe19pZDogZm9ybV92ZXJzaW9uLCBmb3JtOiBmb3JtfSlcblxuXHRmaWVsZHMgPSBfZm9ybV92ZXJzaW9uPy5maWVsZHMgfHwgW11cblxuXHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZjEuZm9ybXVsYVxuXHRcdGVsc2Vcblx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZi5mb3JtdWxhXG5cblx0Xy5zb21lIGZpZWxkX2Zvcm11bGFzLCAoZmllbGRfZm9ybXVsYSktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cbiIsIiAgICAgICAgICAgICBcblxuV29ya2Zsb3cgPSB7fTtcblxudGhpcy5JbWFnZVNpZ24gPSB7fTtcblxudGhpcy5UcmFjZXNIYW5kbGVyID0ge307XG5cbnRoaXMuVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxudGhpcy5JbnN0YW5jZWZvcm1UZW1wbGF0ZSA9IHt9O1xuXG50aGlzLkluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlID0ge307XG5cbnRoaXMuSW5zdGFuY2VTaWduVGV4dCA9IHt9O1xuXG50aGlzLlJlbGF0ZWRJbnN0YW5jZXMgPSB7fTtcblxudGhpcy5SZWxhdGVkUmVjb3JkcyA9IHt9O1xuXG50aGlzLkluc3RhbmNlTWFjcm8gPSB7XG4gIGNvbnRleHQ6IHt9XG59O1xuXG50aGlzLlRyYWNlc01hbmFnZXIgPSB7fTtcblxuSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyA9IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgcmV0dXJuIChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8IChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7eWlqaWFubGFuOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwieyd5aWppYW5sYW4nOlwiKSA6IHZvaWQgMCkgPiAtMTtcbn07XG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgdmFyIF9mb3JtX3ZlcnNpb24sIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHM7XG4gIGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG4gIF9mb3JtX3ZlcnNpb24gPSB7fTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIF9mb3JtX3ZlcnNpb24gPSB1dWZsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmb3JtXG4gICAgfSksIGZvcm1fdmVyc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgX2Zvcm1fdmVyc2lvbiA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZvcm1fdmVyc2lvbixcbiAgICAgIGZvcm06IGZvcm1cbiAgICB9KTtcbiAgfVxuICBmaWVsZHMgPSAoX2Zvcm1fdmVyc2lvbiAhPSBudWxsID8gX2Zvcm1fdmVyc2lvbi5maWVsZHMgOiB2b2lkIDApIHx8IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYxLmZvcm11bGEpO1xuICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYuZm9ybXVsYSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF8uc29tZShmaWVsZF9mb3JtdWxhcywgZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9KTtcbn07XG4iLCJkYi5pbnN0YW5jZV90YXNrcyA9IG5ldyBNZXRlb3IuQ29sbGVjdGlvbignaW5zdGFuY2VfdGFza3MnKVxuXG5kYi5pbnN0YW5jZV90YXNrcy5fc2ltcGxlU2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYVxuICAgIGluc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICB0cmFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaXNfZmluaXNoZWQ6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXI6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBoYW5kbGVyX29yZ2FuaXphdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHN0YXJ0X2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkdWVfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGlzX3JlYWQ6XG4gICAgICAgIHR5cGU6IEJvb2xlYW5cbiAgICBpc19lcnJvcjpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIHZhbHVlczpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgZGVhZGxpbmU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICByZW1pbmRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIHJlbWluZGVkX2NvdW50OlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICByZWFkX2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgbW9kaWZpZWQ6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBtb2RpZmllZF9ieTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc2lnbl9zaG93OlxuICAgICAgICB0eXBlOiBCb29sZWFuXG4gICAganVkZ2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIG5leHRfc3RlcHM6XG4gICAgICAgIHR5cGU6IEFycmF5XG4gICAgXCJuZXh0X3N0ZXBzLiRcIjpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgXCJuZXh0X3N0ZXBzLiQuc3RlcFwiOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBcIm5leHRfc3RlcHMuJC51c2Vyc1wiOlxuICAgICAgICB0eXBlOiBbU3RyaW5nXVxuICAgIGZpbmlzaF9kYXRlOlxuICAgICAgICB0eXBlOiBEYXRlXG4gICAgY29zdF90aW1lOlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICBzcGFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaW5zdGFuY2VfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3VibWl0dGVyOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXR0ZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBhcHBsaWNhbnRfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGZsb3c6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGZsb3dfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZm9ybTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcDpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcF9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBjYXRlZ29yeV9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpbnN0YW5jZV9zdGF0ZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBmb3J3YXJkX2Zyb21faW5zdGFuY2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGtleXdvcmRzOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpc19hcmNoaXZlZDpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIGNhdGVnb3J5OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiIsImRiLmF1dGhfdG9rZW5zID0gbmV3IE1ldGVvci5Db2xsZWN0aW9uKCdhdXRoX3Rva2VucycpIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5zdGFuY2VfYXR0YWNobWVudCA9IFwiXCJcIlxuXHQ8dHI+XG5cdFx0PHRkIGNsYXNzPVwiaW5zLWF0dGFjaC12aWV3XCI+XG5cdFx0XHQ8YSBocmVmPVwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVwiIGNsYXNzPVwiaW5zX2F0dGFjaF9ocmVmXCIgdGFyZ2V0PVwiX3BhcmVudFwiIGRhdGEtbmFtZT1cInt7dGhpcy5uYW1lfX1cIiBkYXRhLXR5cGU9XCJ7e3RoaXMub3JpZ2luYWwudHlwZX19XCIgZGF0YS1pZD1cInt7X2lkfX1cIj57e3RoaXMubmFtZX19PC9hPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0nc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCc+e3t2YWx1ZX19PC9kaXY+XG5cIlwiXCJcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCJcIlwiXG5cdDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAnPlxuXHRcdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjBweDtcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiA+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJlYWRvbmx5LXRhYmxlXCIgc3R5bGU9XCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cInt7dGhpcy5jb2RlfX1UYWJsZVwiIG5hbWU9XCJ7e3RoaXMuY29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3t0aGlzLm5hbWV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XCJ7e3RoaXMubmFtZX19VGhlYWRcIiBuYW1lPVwie3t0aGlzLm5hbWV9fVRoZWFkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cInt7dGhpcy5uYW1lfX1UYm9keVwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBzaG93TGFiZWx9fVxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdFx0e3sjaWYgaXNUZXh0YXJlYSB0aGlzfX1cblx0XHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2lmfX1cblx0XHR7ey93aXRofX1cblx0PC9kaXY+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcIlwiXG5cblx0e3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cblx0XHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxuXHRcdFx0XHRcdDwvZGl2PlxuICBcdFx0XHRcdDwvZGl2PlxuXHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MHB4O1wiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiID5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVhZG9ubHktdGFibGVcIiBzdHlsZT1cInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVwie3t0aGlzLmNvZGV9fVRhYmxlXCIgbmFtZT1cInt7dGhpcy5jb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e3RoaXMubmFtZX19XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cInt7dGhpcy5uYW1lfX1UaGVhZFwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGhlYWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVwie3t0aGlzLm5hbWV9fVRib2R5XCIgbmFtZT1cInt7dGhpcy5uYW1lfX1UYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdpbnB1dCd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLXJlcXVpcmVkPVwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XCI+XG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0e3sjaWYgaXNfdGV4dGFyZWF9fVxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG5cdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJudW1iZXJcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlJ319XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXR5cGU9XCJkYXRlXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlVGltZSd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS10eXBlPSdkYXRldGltZScgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdwYXNzd29yZCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgdGl0bGU9XCJ7e2dldExhYmVsIGNvZGV9fVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGRhdGEtc2NoZW1hLWtleT1cInt7Z2V0TGFiZWwgY29kZX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInt7dmFsdWV9fVwiPnt7bGFiZWx9fTwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWYtcmFkaW8tZ3JvdXBcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cbiAgICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7e3ZhbHVlfX1cIiBuYW1lPVwie3suLi9jb2RlfX1cIiBjbGFzcz1cInJhZGlvLWlubGluZSBmaXgtaW5kZW50XCI+IHt7bGFiZWx9fTwvbGFiZWw+XG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFmLWNoZWNrYm94LWdyb3VwXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3t2YWx1ZX19XCIgbmFtZT1cInt7Li4vY29kZX19XCIgY2xhc3M9XCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFwiPiB7e2xhYmVsfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInVybFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2VtYWlsJ319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwiZW1haWxcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdjaGVja2JveCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwidHJ1ZVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGNsYXNzPVwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcIj48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svaWZ9fVxuXHRcdHt7L3dpdGh9fVxuXCJcIlwiXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUgPSAodGVtcGFsdGVOYW1lLCBzdGVlZG9zRGF0YSkgLT5cblx0dGVtcGxhdGUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGVbdGVtcGFsdGVOYW1lXVxuXG5cdHRlbXBsYXRlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0dGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG5cblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZSh0ZW1wYWx0ZU5hbWUsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSAoc3RlZWRvc0RhdGEpLT5cblx0aW5zdGFuY2VTaWduVGV4dEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9zaWduX3RleHQuaHRtbCcpXG5cblx0aW5zdGFuY2VTaWduVGV4dENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVNpZ25UZXh0SHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VTaWduVGV4dFwiLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzIEluc3RhbmNlU2lnblRleHQuaGVscGVyc1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gKHN0ZWVkb3NEYXRhKSAtPlxuXHRpbWFnZVNpZ25IdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW1hZ2Vfc2lnbi5odG1sJylcblx0aW1hZ2VTaWduQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGltYWdlU2lnbkh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0aW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW1hZ2VTaWduLmhlbHBlcnMgSW1hZ2VTaWduLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIgPSAoc3RlZWRvc0RhdGEpIC0+XG5cdHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpXG5cdHRyYWNlc0hhbmxkZXJDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSGFubGRlckh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0dHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZXNIYW5sZGVyQ29tcGlsZWQpO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlciA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3RyYWNlc19oYW5kbGVyXCIsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbik7XG5cdFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuaGVscGVycyBUcmFjZXNIYW5kbGVyLmhlbHBlcnNcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdCA9IChzdGVlZG9zRGF0YSkgLT5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuXG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFwiLCBzdGVlZG9zRGF0YSk7XG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHthYnNvbHV0ZTogc3RlZWRvc0RhdGEuYWJzb2x1dGV9KTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduKHN0ZWVkb3NEYXRhKVxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dChzdGVlZG9zRGF0YSlcblxuZ2V0TGlua1RleHQgPSAoaXRlbSwgbGFiZWwsIGRldGFpbF91cmwpLT5cblx0aWYgZGV0YWlsX3VybFxuXHRcdGRldGFpbF91cmwgPSBkZXRhaWxfdXJsLnJlcGxhY2UoXCJ7X2lkfVwiLCBpdGVtLl9pZClcblx0XHRpZiAhL15odHRwKHM/KTpcXC9cXC8vLnRlc3QoZGV0YWlsX3VybClcblx0XHRcdGRldGFpbF91cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKGRldGFpbF91cmwpXG5cdFx0cmV0dXJuICc8YSBocmVmPVwiJytkZXRhaWxfdXJsKydcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nK2xhYmVsKyc8L2E+Jztcblx0ZWxzZVxuXHRcdHJldHVybiBsYWJlbFxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgPSAodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkgLT5cblx0aWYgIXZhbHVlICYmIHZhbHVlICE9IGZhbHNlXG5cdFx0cmV0dXJuICcnXG5cdGlmIFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xXG5cdFx0ZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAgKG4pLT5cblx0XHRcdGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG5cdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cblx0XHRcdH1cblx0c3dpdGNoIGZpZWxkLnR5cGVcblx0XHR3aGVuICdlbWFpbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgZWxzZSAnJ1xuXHRcdHdoZW4gJ3VybCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmIHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDBcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcblx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9ICcnXG5cdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdHdoZW4gJ3Bhc3N3b3JkJ1xuXHRcdFx0dmFsdWUgPSAnKioqKioqJ1xuXHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0aWYgdmFsdWUgJiYgdmFsdWUgIT0gJ2ZhbHNlJ1xuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpXG5cdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKHZhbHVlLCB1dGNPZmZzZXQpO1xuXHRcdHdoZW4gJ3RpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lKHZhbHVlKTtcblx0XHR3aGVuICdpbnB1dCdcblx0XHRcdGlmIGZpZWxkLmlzX3RleHRhcmVhXG5cdFx0XHRcdHZhbHVlID0gdmFsdWVcblx0XHR3aGVuICdzZWxlY3QnXG5cdFx0XHRzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKChpdGVtKSAtPiByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZSlcblx0XHRcdGlmIHNlbGVjdGVkT3B0aW9uXG5cdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcblx0XHR3aGVuICdyYWRpbydcblx0XHRcdHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoKGl0ZW0pIC0+IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25cblx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuXHRcdHdoZW4gJ211bHRpU2VsZWN0J1xuXHRcdFx0c3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKVxuXHRcdFx0c2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcigoaXRlbSkgLT4gcmV0dXJuIHNwbGl0ZWRWYWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+IC0xKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFxuXHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkT3B0aW9ucy5tYXAoKGl0ZW0pIC0+IHJldHVybiBpdGVtLmxhYmVsKS5qb2luKFwiLFwiKVxuXHRcdHdoZW4gJ251bWJlcidcblx0XHRcdGlmIHZhbHVlIG9yIHZhbHVlID09IDBcblx0XHRcdFx0aWYgZmllbGQuaXNfcGVyY2VudFxuXHRcdFx0XHRcdHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcgdmFsdWUsIGZpZWxkLmRpZ2l0c1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nIHZhbHVlLCBmaWVsZC5kaWdpdHNcblx0XHR3aGVuICdvZGF0YSdcblx0XHRcdGRldGFpbF91cmwgPSBmaWVsZC5kZXRhaWxfdXJsXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IF8ubWFwIHZhbHVlLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiBnZXRMaW5rVGV4dChpdGVtLCBpdGVtWydAbGFiZWwnXSwgZGV0YWlsX3VybClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSBnZXRMaW5rVGV4dCh2YWx1ZSwgdmFsdWVbJ0BsYWJlbCddLCBkZXRhaWxfdXJsKVxuXHRcdHdoZW4gJ2ltYWdlJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSBfLm1hcCB2YWx1ZSwgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZSBhbnRkLUltYWdlLS10aHVtYiBhbnRkLUltYWdlQ29udHJvbC1pbWFnZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYldyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJytpdGVtKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nK3ZhbHVlKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0d2hlbiAnZmlsZSdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmICFmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHZhbHVlID0gW3ZhbHVlXVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRyZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJytKU09OLnN0cmluZ2lmeSh2YWx1ZSkrJ11dJmZpZWxkcz1bXCJfaWRcIixcIm9yaWdpbmFsXCJdJywge2FzeW5jOmZhbHNlfSlcblx0XHRcdFx0XHRyZWNvcmRzID0gcmVzLmRhdGEuaXRlbXNcblx0XHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRyZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwgeyBmaWx0ZXJzOiBbW1wiX2lkXCIsICdpbicsIHZhbHVlXV0sIGZpZWxkczogW1wiX2lkXCIsIFwib3JpZ2luYWxcIl0gfSk7XG5cblx0XHRcdFx0dmFsdWUgPSBfLm1hcCByZWNvcmRzLCAoaXRlbSktPlxuXHRcdFx0XHRcdGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuXHRcdFx0XHRcdGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycraXRlbS5faWQpO1xuXHRcdFx0XHRcdGZpbGVQcmV2aWV3SHRtbCA9ICcnO1xuXHRcdFx0XHRcdGlmIFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnNsaWNlKC00KSkgPiAtMVxuXHRcdFx0XHRcdFx0ZmlsZVByZXZpZXdIdG1sID0gXCImZW5zcDs8YSBocmVmPScje2ZpbGVVcmx9JyB0YXJnZXQ9J19ibGFuaycgY2xhc3M9J2FudGQtTGluayc+PHNwYW4gY2xhc3M9J2FudGQtVHBsRmllbGQnPjxzcGFuPumihOiniDwvc3Bhbj48L3NwYW4+PC9hPlwiXG5cdFx0XHRcdFx0cmV0dXJuIFwiPGRpdj48YSBocmVmPScje2ZpbGVVcmwrJz9kb3dubG9hZD10cnVlJ30nIHRhcmdldD0nX2JsYW5rJz4je2ZpbGVOYW1lfTwvYT4gI3tmaWxlUHJldmlld0h0bWwgPyBmaWxlUHJldmlld0h0bWwgOiAnJ308L2Rpdj5cIlxuXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcblx0XHR3aGVuICdsb29rdXAnXG5cdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRpZiAhZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV1cblx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0dWlTY2hlbWEgPSBDcmVhdG9yLmdldE9iamVjdChmaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0bmFtZUZpZWxkID0gdWlTY2hlbWE/Lk5BTUVfRklFTERfS0VZIHx8ICduYW1lJ1xuXHRcdFx0XHRcdHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvJytmaWVsZC5yZWZlcmVuY2VfdG8rJz9maWx0ZXJzPVtbXCInKyhmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcpKydcIixcImluXCIsICcrSlNPTi5zdHJpbmdpZnkodmFsdWUpKyddXSZmaWVsZHM9W1wiX2lkXCIsXCInK25hbWVGaWVsZCsnXCJdJywge2FzeW5jOmZhbHNlfSlcblx0XHRcdFx0XHRyZWNvcmRzID0gcmVzLmRhdGEuaXRlbXNcblx0XHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRuYW1lRmllbGQgPSBTdGVlZG9zLmdldE9iamVjdE5hbWVGaWVsZEtleShmaWVsZC5yZWZlcmVuY2VfdG8pO1xuXHRcdFx0XHRcdHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoZmllbGQucmVmZXJlbmNlX3RvLCB7IGZpbHRlcnM6IFtbKGZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJyksICdpbicsIHZhbHVlXV0sIGZpZWxkczogW1wiX2lkXCIsIG5hbWVGaWVsZF0gfSk7XG5cdFx0XHRcdHZhbHVlID0gXy5tYXAgcmVjb3JkcywgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZXR1cm4gXCI8YSBocmVmPScje1N0ZWVkb3MuYWJzb2x1dGVVcmwoJy9hcHAvLS8nK2ZpZWxkLnJlZmVyZW5jZV90bysnL3ZpZXcvJytpdGVtLl9pZCl9JyB0YXJnZXQ9J19ibGFuayc+I3tpdGVtW25hbWVGaWVsZF19PC9hPlwiXG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiICwgXCIpO1x0XG5cdFx0d2hlbiAnaHRtbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiBcIjxkaXYgY2xhc3M9XFxcInN0ZWVkb3MtaHRtbFxcXCI+I3t2YWx1ZX08L2Rpdj5cIiBlbHNlICcnXG5cblx0cmV0dXJuIHZhbHVlO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgPSAoZmllbGRzLCBjb2RlKSAtPlxuXHRmaWVsZCA9IGZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKVxuXHRpZiBmaWVsZFxuXHRcdGlmIGZpZWxkLm5hbWVcblx0XHRcdHJldHVybiBmaWVsZC5uYW1lXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZpZWxkLmNvZGVcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbiA9IChpbnN0YW5jZSktPlxuXHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcblxuXHRmb3JtX3ZlcnNpb24gPSB7fVxuXG5cdGZvcm1fZmllbGRzID0gW107XG5cblx0aWYgZm9ybS5jdXJyZW50Ll9pZCA9PSBpbnN0YW5jZS5mb3JtX3ZlcnNpb25cblx0XHRmb3JtX3ZlcnNpb24gPSBmb3JtLmN1cnJlbnRcblx0ZWxzZVxuXHRcdGZvcm1fdmVyc2lvbiA9IF8ud2hlcmUoZm9ybS5oaXN0b3J5cywge19pZDogaW5zdGFuY2UuZm9ybV92ZXJzaW9ufSlbMF1cblxuXHRmb3JtX3ZlcnNpb24uZmllbGRzLmZvckVhY2ggKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXHRcdFx0aWYgZmllbGQuZmllbGRzXG5cdFx0XHRcdGZpZWxkLmZpZWxkcy5mb3JFYWNoIChmKSAtPlxuXHRcdFx0XHRcdGZvcm1fZmllbGRzLnB1c2goZik7XG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdGZpZWxkWydzZmllbGRzJ10gPSBmaWVsZFsnZmllbGRzJ11cblx0XHRcdGRlbGV0ZSBmaWVsZFsnZmllbGRzJ11cblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXHRcdGVsc2Vcblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXG5cdGZvcm1fdmVyc2lvbi5maWVsZHMgPSBmb3JtX2ZpZWxkcztcblxuXHRyZXR1cm4gZm9ybV92ZXJzaW9uO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24gPSAoaW5zdGFuY2UpLT5cblx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoaW5zdGFuY2UuZmxvdyk7XG5cdGZsb3dfdmVyc2lvbiA9IHt9XG5cdGlmIGZsb3cuY3VycmVudC5faWQgPT0gaW5zdGFuY2UuZmxvd192ZXJzaW9uXG5cdFx0Zmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50XG5cdGVsc2Vcblx0XHRmbG93X3ZlcnNpb24gPSBfLndoZXJlKGZsb3cuaGlzdG9yeXMsIHtfaWQ6IGluc3RhbmNlLmZsb3dfdmVyc2lvbn0pWzBdXG5cblx0cmV0dXJuIGZsb3dfdmVyc2lvbjtcblxuXG5fZ2V0Vmlld0h0bWwgPSAocGF0aCkgLT5cblx0dmlld0h0bWwgPSBBc3NldHMuZ2V0VGV4dChwYXRoKVxuXG5cdGlmIHZpZXdIdG1sXG5cdFx0dmlld0h0bWwgPSB2aWV3SHRtbC5yZXBsYWNlKC88dGVtcGxhdGVbXFx3XFxzXFxcIlxcPSddKz4vaSxcIlwiKS5yZXBsYWNlKC88XFwvdGVtcGxhdGU+L2ksXCJcIilcblxuXHRyZXR1cm4gdmlld0h0bWw7XG5cbl9nZXRMb2NhbGUgPSAodXNlciktPlxuXHRpZiB1c2VyPy5sb2NhbGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRlbHNlIGlmIHVzZXI/LmxvY2FsZT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnZW4tdXMnXG5cdFx0bG9jYWxlID0gXCJlblwiXG5cdGVsc2Vcblx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0cmV0dXJuIGxvY2FsZVxuXG5cbl9nZXRSZXF1aXJlZEZpZWxkcyA9IChmaWVsZHMsIHJldiktPlxuXHRpZiAhcmV2XG5cdFx0cmV2ID0gW107XG5cblx0ZmllbGRzLmZvckVhY2ggKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdF9nZXRSZXF1aXJlZEZpZWxkcyhmaWVsZC5maWVsZHMsIHJldilcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXG5cdFx0ZWxzZVxuXHRcdFx0aWYgZmllbGQuaXNfcmVxdWlyZWRcblx0XHRcdFx0cmV2LnB1c2ggZmllbGQuY29kZVxuXHRyZXR1cm4gcmV2O1xuXG5fZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMgPSAoZmllbGRzLCBzdGVwcyktPlxuXHRzdGFydFN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcF90eXBlXCIsXCJzdGFydFwiKVxuXG5cdGVkaXRhYmxlQ29kZSA9IFtdXG5cblx0Xy5rZXlzKHN0YXJ0U3RlcC5wZXJtaXNzaW9ucykuZm9yRWFjaCAoa2V5KS0+XG5cdFx0aWYgc3RhcnRTdGVwLnBlcm1pc3Npb25zW2tleV0gPT0gJ2VkaXRhYmxlJ1xuXHRcdFx0ZWRpdGFibGVDb2RlLnB1c2gga2V5XG5cblx0cmV0dXJuIGVkaXRhYmxlQ29kZVxuXG5fZ2V0U3RhcnRTdGVwUmVxdWlyZWRGaWVsZHMgPSAoZmllbGRzLCBzdGVwcyktPlxuXHRyZXF1aXJlZEZpZWxkcyA9IF9nZXRSZXF1aXJlZEZpZWxkcyhmaWVsZHMpXG5cblx0ZWRpdGFibGVDb2RlID0gX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKGZpZWxkcywgc3RlcHMpXG5cblx0cmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVpcmVkRmllbGRzLCBlZGl0YWJsZUNvZGUpXG5cbl9nZXRUZW1wbGF0ZURhdGEgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdGZvcm1fdmVyc2lvbiA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKVxuXHRlbHNlXG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpXG5cblx0bG9jYWxlID0gX2dldExvY2FsZSh1c2VyKVxuXG5cdHN0ZWVkb3NEYXRhID0ge31cblxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRzdGVlZG9zRGF0YSA9IF8uY2xvbmUoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpKVxuXHRcdHN0ZWVkb3NEYXRhLmluc25hbWUgPSBpbnN0YW5jZS5uYW1lXG5cdFx0c3RlZWRvc0RhdGEuaW5zX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGVcblx0XHRzdGVlZG9zRGF0YS5pbnNfZmluYWxfZGVjaXNpb24gPSBpbnN0YW5jZS5pbnNfZmluYWxfZGVjaXNpb25cblx0XHRzdGVlZG9zRGF0YS5pbnNfY29kZSA9IGluc3RhbmNlLmNvZGVcblx0XHRzdGVlZG9zRGF0YS5pbnNfaXNfYXJjaGl2ZWQgPSBpbnN0YW5jZS5pc19hcmNoaXZlZFxuXHRcdHN0ZWVkb3NEYXRhLmluc19pc19kZWxldGVkID0gaW5zdGFuY2UuaW5zX2lzX2RlbGV0ZWRcblx0XHRzdGVlZG9zRGF0YS5hcHBsaWNhbnRfbmFtZSA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cdFx0c3RlZWRvc0RhdGEuYXBwbGljYW50Q29udGV4dCA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cblx0c3RlZWRvc0RhdGEuaW5zdGFuY2UgPSBpbnN0YW5jZVxuXHRzdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb24gPSBmb3JtX3ZlcnNpb25cblx0c3RlZWRvc0RhdGEubG9jYWxlID0gbG9jYWxlXG5cdHN0ZWVkb3NEYXRhLnV0Y09mZnNldCA9IHVzZXIudXRjT2Zmc2V0XG5cdHN0ZWVkb3NEYXRhLnNwYWNlID0gaW5zdGFuY2Uuc3BhY2Vcblx0c3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCA9IHVzZXIuX2lkXG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0aWYgb3B0aW9ucz8uZWRpdGFibGVcblx0XHRcdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlLmZvcm19KVxuXG5cdFx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkOiBpbnN0YW5jZS5mbG93fSlcblxuXHRcdFx0c3RlZWRvc0RhdGEuc3RhcnRTdGVwRWRpdGFibGVGaWVsZHMgPSBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMoZm9ybS5jdXJyZW50LmZpZWxkcywgZmxvdy5jdXJyZW50LnN0ZXBzKTtcblxuXHRyZXR1cm4gc3RlZWRvc0RhdGE7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlID0gKGRhdGUsIHV0Y09mZnNldCktPlxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRwYXNzaW5nID0gZmFsc2U7XG5cdGVsc2Vcblx0XHRwYXNzaW5nID0gdHJ1ZTtcblxuXHRpZiAhdXRjT2Zmc2V0ICYmIHV0Y09mZnNldCAhPTBcblx0XHR1dGNPZmZzZXQgPSA4XG5cblx0cmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0LCBwYXNzaW5nKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tXCIpO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0VGltZSA9IChkYXRlKS0+XG5cdHV0Y09mZnNldCA9IDBcblx0cmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0KS5mb3JtYXQoXCJISDptbVwiKTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXG5cdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG5cblx0aWYgb3B0aW9ucz8uYWJzb2x1dGVcblx0XHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG5cblx0aW5zdGFuY2VUZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShpbnN0YW5jZSwgb3B0aW9ucz8udGVtcGxhdGVOYW1lKTtcblxuXHRpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZlNlbGVjdFVzZXIvZyxcImFmU2VsZWN0VXNlclJlYWRcIilcblxuXHRpZiAhb3B0aW9ucz8uZWRpdGFibGVcblx0XHRpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZkZvcm1Hcm91cC9nLFwiYWZGb3JtR3JvdXBSZWFkXCIpXG5cblx0aW5zdGFuY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VUZW1wbGF0ZSwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKGluc3RhbmNlQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZV9yZWFkb25seV92aWV3XCIsIGluc3RhbmNlUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzXG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluaXQoc3RlZWRvc0RhdGEpO1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LCBzdGVlZG9zRGF0YSlcblxuXHRyZXR1cm4gXCJcIlwiXG5cdFx0PGRpdiBpZD0naW5zdGFuY2Vmb3JtJyA+XG5cdFx0XHQje2JvZHl9XG5cdFx0PC9kaXY+XG5cdFwiXCJcIlxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXHRpZiBmb3JtLmluc3RhbmNlX3N0eWxlID09IFwidGFibGVcIiB8fCBvcHRpb25zPy50ZW1wbGF0ZU5hbWUgPT0gXCJ0YWJsZVwiXG5cdFx0dHJhY2VzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3RyYWNlc190YWJsZS5odG1sJylcblx0ZWxzZVxuXHRcdHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXMuaHRtbCcpXG5cblx0dHJhY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdHRyYWNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJ0cmFjZV9yZWFkb25seV92aWV3XCIsIHRyYWNlUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzXG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcsIGluc3RhbmNlLnRyYWNlcylcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSktPlxuXG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cblx0YXR0YWNobWVudEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9hdHRhY2htZW50cy5odG1sJylcblxuXHRhdHRhY2htZW50Q29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGF0dGFjaG1lbnRIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0YXR0YWNobWVudFJlbmRlckZ1bmN0aW9uID0gZXZhbChhdHRhY2htZW50Q29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJhdHRhY2htZW50c19yZWFkb25seV92aWV3XCIsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5oZWxwZXJzIEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldylcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG5cblx0aWYgb3B0aW9ucz8uYWJzb2x1dGVcblx0XHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG5cblx0cmVsYXRlZEluc3RhbmNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9yZWxhdGVkX2luc3RhbmNlcy5odG1sJylcblxuXHRyZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0cmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX2luc3RhbmNlc192aWV3XCIsIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5oZWxwZXJzIFJlbGF0ZWRJbnN0YW5jZXMuaGVscGVyc1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LCBzdGVlZG9zRGF0YSlcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblxuXHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuXG5cdGlmIG9wdGlvbnM/LmFic29sdXRlXG5cdFx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuXG5cdHJlbGF0ZWRSZWNvcmRzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3JlbGF0ZWRfcmVjb3Jkcy5odG1sJylcblxuXHRyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShyZWxhdGVkUmVjb3Jkc0h0bWwsIHtpc0JvZHk6IHRydWV9KTtcblxuXHRyZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInJlbGF0ZWRfcmVjb3Jkc192aWV3XCIsIHJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldy5oZWxwZXJzIFJlbGF0ZWRSZWNvcmRzLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcsIHN0ZWVkb3NEYXRhKVxuXG5cdHJldHVybiBib2R5O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0ID0gKGluc3RhbmNlKS0+XG5cdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtVmVyc2lvbihpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pXG5cblx0Zm9ybV9zY3JpcHQgPSBmb3JtX3ZlcnNpb24uZm9ybV9zY3JpcHQ7XG5cblx0aWYgZm9ybV9zY3JpcHQgJiYgZm9ybV9zY3JpcHQucmVwbGFjZSgvXFxuL2csXCJcIikucmVwbGFjZSgvXFxzL2csXCJcIikubGVuZ3RoID4gMFxuXHRcdGZvcm1fc2NyaXB0ID0gXCJDb3JlRm9ybSA9IHt9O0NvcmVGb3JtLmluc3RhbmNlZm9ybSA9IHt9O1wiICsgZm9ybV9zY3JpcHRcblx0XHRmb3JtX3NjcmlwdCArPSBcIjtpZihDb3JlRm9ybS5mb3JtX09uTG9hZCl7d2luZG93Lm9ubG9hZCA9IENvcmVGb3JtLmZvcm1fT25Mb2FkKCk7fVwiXG5cdGVsc2Vcblx0XHRmb3JtX3NjcmlwdCA9IFwiXCJcblxuXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cblx0Ym9keSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZVZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcblxuXHRvbkxvYWRTY3JpcHQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0KGluc3RhbmNlKTtcblxuXHRjcmVhdG9yU2VydmljZSA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXM/LmNyZWF0b3I/LnVybFxuXHRpbnNfcmVjb3JkX2lkcyA9IGluc3RhbmNlLnJlY29yZF9pZHNcblx0bG9jYWxlID0gX2dldExvY2FsZSh1c2VyKTtcblx0b3BlbkZpbGVTY3JpcHQgPSBcIlwiXCJcblx0XHRcdGlmKHdpbmRvdy5pc05vZGUgJiYgaXNOb2RlKCkpe1xuXHRcdFx0XHRhdHRhY2hzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImluc19hdHRhY2hfaHJlZlwiKTtcblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IGF0dGFjaHMubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGF0dGFjaCA9IGF0dGFjaHNbaV07XG5cdFx0XHRcdFx0YXR0YWNoLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRcdGlmKGlzSW1hZ2UodGhpcy5kYXRhc2V0LnR5cGUpIHx8IGlzSHRtbCh0aGlzLmRhdGFzZXQudHlwZSkpe1xuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdG9wZW5XaW5kb3coXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cIiArIHRoaXMuZGF0YXNldC5pZCk7XG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihud19jb3JlLmNhbk9wZW5GaWxlKHRoaXMuZGF0YXNldC5uYW1lKSl7XG5cdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0bndfY29yZS5vcGVuRmlsZSh0aGlzLmhyZWYsIHRoaXMuZGF0YXNldC5uYW1lKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmbG93ID0gXCIje2luc3RhbmNlLmZsb3d9XCI7XG5cdFx0XHR2YXIgc3BhY2UgPSBcIiN7aW5zdGFuY2Uuc3BhY2V9XCI7XG5cblx0XHRcdGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKXtcblx0XHRcdFx0bGV0IHBhdHRlcm4gPSBSZWdFeHAobmFtZSArIFwiPS5bXjtdKlwiKVxuXHRcdFx0XHRsZXQgbWF0Y2hlZCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChwYXR0ZXJuKVxuXHRcdFx0XHRpZihtYXRjaGVkKXtcblx0XHRcdFx0XHRsZXQgY29va2llID0gbWF0Y2hlZFswXS5zcGxpdCgnPScpXG5cdFx0XHRcdFx0cmV0dXJuIGNvb2tpZVsxXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAnJ1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVjb3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJpbnMtcmVsYXRlZC1yZWNvcmRzXCIpO1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdHZhciByZWNvcmQgPSByZWNvcmRzW2ldO1xuXHRcdFx0XHRcdHJlY29yZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdFx0XHR2YXIgY3JlYXRvclNlcnZpY2UgPSBcIiN7Y3JlYXRvclNlcnZpY2V9XCJcblx0XHRcdFx0XHRcdHZhciBpbnNfcmVjb3JkX2lkcyA9ICN7SlNPTi5zdHJpbmdpZnkoaW5zX3JlY29yZF9pZHMpfVxuXHRcdFx0XHRcdFx0aWYoY3JlYXRvclNlcnZpY2UgJiYgaW5zX3JlY29yZF9pZHMgJiYgaW5zX3JlY29yZF9pZHMubGVuZ3RoID4gMCl7XG5cdFx0XHRcdFx0XHRcdHZhciBvYmpjZXROYW1lID0gaW5zX3JlY29yZF9pZHNbMF0ub1xuXHRcdFx0XHRcdFx0XHR2YXIgaWQgPSBpbnNfcmVjb3JkX2lkc1swXS5pZHNbMF1cblx0XHRcdFx0XHRcdFx0dmFyIHVvYmogPSB7fTtcblx0XHRcdFx0XHRcdFx0dW9ialtcIlgtVXNlci1JZFwiXSA9IGdldENvb2tpZShcIlgtVXNlci1JZFwiKTtcblx0XHRcdFx0XHRcdFx0dW9ialtcIlgtQXV0aC1Ub2tlblwiXSA9IGdldENvb2tpZShcIlgtQXV0aC1Ub2tlblwiKTtcblx0XHRcdFx0XHRcdFx0cmVkaXJlY3RVcmwgPSBjcmVhdG9yU2VydmljZSArIFwiYXBwLy0vXCIgKyBvYmpjZXROYW1lICsgXCIvdmlldy9cIiArIGlkICsgXCI/XCIgKyAkLnBhcmFtKHVvYmopO1xuXHRcdFx0XHRcdFx0XHRvcGVuV2luZG93KHJlZGlyZWN0VXJsKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFwiXCJcIjtcblxuXG5cdGlmICFTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcblx0XHRpZiBmb3JtPy5pbnN0YW5jZV9zdHlsZSA9PSAndGFibGUnXG5cdFx0XHRpbnN0YW5jZV9zdHlsZSA9IFwiaW5zdGFuY2UtdGFibGVcIlxuXG5cdGlmIG9wdGlvbnM/LnRlbXBsYXRlTmFtZSA9PSAndGFibGUnXG5cdFx0aW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCJcblxuXHRpZiBvcHRpb25zPy5pbnN0YW5jZV9zdHlsZVxuXHRcdGluc3RhbmNlX3N0eWxlID0gb3B0aW9ucy5pbnN0YW5jZV9zdHlsZVxuXG5cdGlmICFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd1RyYWNlID09IHRydWVcblx0XHR0cmFjZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRUcmFjZXNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblx0ZWxzZVxuXHRcdHRyYWNlID0gXCJcIlxuXG5cdGluc3RhbmNlQm94U3R5bGUgPSBcIlwiO1xuXG5cdGlmIGluc3RhbmNlICYmIGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uXG5cdFx0aWYgaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtc3VjY2Vzc1wiXG5cdFx0ZWxzZSBpZiAoaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0aW5zdGFuY2VCb3hTdHlsZSA9IFwiYm94LWRhbmdlclwiXG5cdGlmICFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzID09IHRydWVcblx0XHRhdHRhY2htZW50ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblx0XHRyZWxhdGVkX2luc3RhbmNlcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cdFx0cmVsYXRlZF9yZWNvcmRzID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cdGVsc2Vcblx0XHRhdHRhY2htZW50ID0gXCJcIlxuXHRcdHJlbGF0ZWRfaW5zdGFuY2VzID0gXCJcIlxuXHRcdHJlbGF0ZWRfcmVjb3JkcyA9IFwiXCJcblxuXG5cdHdpZHRoID0gXCI5NjBweFwiXG5cdCNcdOWmguaenOe7mXRhYmxl55qEcGFyZW506K6+572ud2lkdGjvvIzliJnkvJrlr7zoh7TpmL/ph4zkupHpgq7nrrHmmL7npLp0YWJsZSDlvILluLhcblx0aWYgb3B0aW9ucz8ud2lkdGhcblx0XHR3aWR0aCA9IFwiXCJcblxuXHRjc3NIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwic3RlZWRvcy1jc3NcIilcblx0XG5cdGpxSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcIndlYnNpdGUvbGlicy9qcXVlcnkubWluLmpzXCIpXG5cblx0YWxsQ3NzTGluayA9IFwiXCJcIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBjbGFzcz1cIl9fbWV0ZW9yLWNzc19fXCIgaHJlZj1cIiN7Y3NzSHJlZn1cIj5cIlwiXCJcblxuXHR0cmFjZUNoZWNrID0gXCJcIlxuXHRpZiAhXy5pc0VtcHR5KHRyYWNlKVxuXHRcdHRyYWNlQ2hlY2sgPSBcImNoZWNrZWRcIlxuXHRpZiBvcHRpb25zPy50YWdnZXIgPT0gJ2VtYWlsJyB8fCBvcHRpb25zPy5lZGl0YWJsZVxuXHRcdHNob3dUcmFjZXNCdG4gPSBcIlwiXG5cdGVsc2Vcblx0XHRzaG93VHJhY2VzQnRuID0gXCJcIlwiXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibmF2aWdhdGlvbi1iYXIgYnRuLWdyb3VwIG5vLXByaW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDYwMHB4OyB6LWluZGV4OiA5OTk7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJwcmludC10b29sXCI+XG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY2J4LWxhYmVsXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2J4LXByaW50IGNieC1wcmludC1hdHRhY2htZW50c1wiIGlkPVwiY2J4LXByaW50LWF0dGFjaG1lbnRzXCIgY2hlY2tlZD1cImNoZWNrZWRcIj48c3Bhbj4je1RBUGkxOG4uX18oJ2luc3RhbmNlX2F0dGFjaG1lbnQnLCB7fSwgbG9jYWxlKX08L3NwYW4+PC9sYWJlbD5cblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjYngtbGFiZWxcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjYngtcHJpbnQgY2J4LXByaW50LXRyYWNlc1wiIGlkPVwiY2J4LXByaW50LXRyYWNlc1wiIGNoZWNrZWQ9XCIje3RyYWNlQ2hlY2t9XCI+PHNwYW4+I3tUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZhbF9oaXN0b3J5Jywge30sIGxvY2FsZSl9PC9zcGFuPjwvbGFiZWw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHRcIlwiXCJcblxuXHRzaG93VHJhY2VzU2NyaXB0ID0gXCJcIlwiXG5cdFx0JCggZG9jdW1lbnQgKS5yZWFkeShmdW5jdGlvbigpe1xuXHRcdFx0dmFyIGIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LXRyYWNlcycpO1xuXHRcdFx0dmFyIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnN0YW5jZS10cmFjZXMnKVswXTtcblx0XHRcdGlmIChiICYmIGIuY2hlY2tlZCAmJiB0KXtcblx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHR9IGVsc2UgaWYodCl7XG5cdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXG5cdFx0XHR9XG5cdFx0XHRpZihiKXtcblx0XHRcdFx0Yi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XG5cdFx0XHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cblx0XHRcdHZhciBhdHRhY2htZW50c0NoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NieC1wcmludC1hdHRhY2htZW50cycpO1xuXHRcdFx0dmFyIGF0dGFjaG1lbnRzVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dGFjaG1lbnRzLXNlY3Rpb24nKVswXTtcblx0XHRcdGlmIChhdHRhY2htZW50c0NoZWNrYm94ICYmIGF0dGFjaG1lbnRzQ2hlY2tib3guY2hlY2tlZCAmJiBhdHRhY2htZW50c1ZpZXcpe1xuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xuXHRcdFx0fSBlbHNlIGlmKGF0dGFjaG1lbnRzVmlldyl7XG5cdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdH1cblx0XHRcdGlmKGF0dGFjaG1lbnRzQ2hlY2tib3gpe1xuXHRcdFx0XHRhdHRhY2htZW50c0NoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdGlmIChlLnRhcmdldC5jaGVja2VkKXtcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFwiXCJcIlxuXG5cdGlmIG9wdGlvbnM/LnN0eWxlc1xuXHRcdGFsbENzc0xpbmsgPSBcIlwiXG5cblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe19pZDogaW5zdGFuY2UuZm9ybX0pO1xuXHRmb3JtRGVzY3JpcHRpb25IdG1sID0gXCJcIlxuXHRpZiBmb3JtXG5cdFx0Zm9ybURlc2NyaXB0aW9uID0gZm9ybS5kZXNjcmlwdGlvblxuXHRcdGlmIGZvcm1EZXNjcmlwdGlvblxuXHRcdFx0Zm9ybURlc2NyaXB0aW9uID0gZm9ybURlc2NyaXB0aW9uLnJlcGxhY2UoL1xcbi9nLFwiPGJyLz5cIilcblx0XHRcdGZvcm1EZXNjcmlwdGlvbkh0bWwgPSBcIlwiXCJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImJveC1oZWFkZXIgIHdpdGgtYm9yZGVyIGluc3RhbmNlLWhlYWRlclwiPlxuXHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHQje2Zvcm1EZXNjcmlwdGlvbn1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFwiXCJcIlxuXG5cdGh0bWwgPSBcIlwiXCJcblx0XHQ8IURPQ1RZUEUgaHRtbD5cblx0XHQ8aHRtbD5cblx0XHRcdDxoZWFkPlxuXHRcdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiLz5cblx0XHRcdFx0I3thbGxDc3NMaW5rfVxuXHRcdFx0XHQ8c2NyaXB0IHNyYz1cIiN7anFIcmVmfVwiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcdFx0PHNjcmlwdCBzcmM9XCIvanMvbndfY29yZS5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcdFx0I3tvcHRpb25zLnBsdWdpbnMgfHwgXCJcIn1cblxuXHRcdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdFx0LnN0ZWVkb3N7XG5cdFx0XHRcdFx0XHR3aWR0aDogI3t3aWR0aH07XG5cdFx0XHRcdFx0XHRtYXJnaW4tbGVmdDogYXV0bztcblx0XHRcdFx0XHRcdG1hcmdpbi1yaWdodDogYXV0bztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtbmFtZXtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5ib3gtdG9vbHN7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYm94LmNvbGxhcHNlZC1ib3ggLmJveC1ib2R5LC5ib3guY29sbGFwc2VkLWJveCAuYm94LWZvb3RlciB7XG5cdFx0XHRcdFx0ICBkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRib2R5e1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZDogYXp1cmUgIWltcG9ydGFudDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtdHJhY2Vze1xuXHRcdFx0XHRcdFx0cGFkZGluZy1sZWZ0OiAxNXB4O1xuXHRcdFx0XHRcdFx0cGFkZGluZy1yaWdodDogMTVweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSB7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tSW1hZ2VDb250cm9sLWFkZEJ0bi1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdHZlcnRpY2FsLWFsaWduOiB0b3A7XG5cdFx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1nYXAtYmFzZSk7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogdmFyKC0tZ2FwLWJhc2UpO1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHR3aWR0aDogNy41cmVtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkIHtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0tRmlsZUNvbnRyb2wtZGFuZ2VyLWNvbG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0gc3ZnLmljb24tcmVmcmVzaCB7XG5cdFx0XHRcdFx0dHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0XHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdFx0Y29sb3I6IHZhcigtLUZpbGVDb250cm9sLWRhbmdlci1jb2xvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSA+IHN2Zy5pY29uLWltYWdlIHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiA4cHg7XG5cdFx0XHRcdFx0d2lkdGg6IDI0cHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAyNHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUgPiBzcGFuIHtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0XHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaW1hZ2Uge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XG5cdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdFx0XHR0b3A6IDVweDtcblx0XHRcdFx0XHRyaWdodDogNXB4O1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyID4gc3ZnIHtcblx0XHRcdFx0XHR0b3A6IDA7XG5cdFx0XHRcdFx0d2lkdGg6IDEwcHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUluZm8ge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdFx0XHRcdHdpZHRoOiAxMTBweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDExMHB4O1xuXHRcdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdFx0YWxpZ24tY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1JbmZvID4gcCB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1wcm9ncmVzcyB7XG5cdFx0XHRcdFx0d2lkdGg6IDcwcHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiA1cHg7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ViZWJlYjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXByb2dyZXNzVmFsdWUge1xuXHRcdFx0XHRcdGhlaWdodDogNXB4O1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLUltYWdlQ29udHJvbC1wcm9ncmVzcy1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWluZm8pO1xuXHRcdFx0XHRcdG1pbi13aWR0aDogMTAlO1xuXHRcdFx0XHRcdHRyYW5zaXRpb246IGVhc2Utb3V0IHdpZHRoIHZhcigtLWFuaW1hdGlvbi1kdXJhdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XG5cdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZDpob3ZlciAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWVycm9yTXNnIHtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tZGFuZ2VyKTtcblx0XHRcdFx0XHRtYXJnaW46IDVweCAwIDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC11cGxvYWRCdG4ge1xuXHRcdFx0XHRcdG1hcmdpbi10b3A6IDVweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BwZXJXcmFwcGVyIHtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wcGVyV3JhcHBlciBpbWcge1xuXHRcdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0XHRtYXgtaGVpZ2h0OiA0MDBweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRyaWdodDogMDtcblx0XHRcdFx0XHRib3R0b206IDA7XG5cdFx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdFx0XHRhbGlnbi1pdGVtczogZmxleC1lbmQ7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdFx0XHRcdFx0bWFyZ2luOiAwLjVyZW07XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIgPiBhIHtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tRm9ybS1pdGVtLWZvbnRDb2xvcik7XG5cdFx0XHRcdFx0cGFkZGluZzogMnB4IDVweDtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxOHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciA+IGE6aG92ZXIge1xuXHRcdFx0XHRcdGNvbG9yOiB2YXIoLS1saW5rLWNvbG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWFjY2VwdFRpcCB7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMjBweDtcblx0XHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdFx0XHRib3JkZXI6IDJweCBkYXNoZWQgdmFyKC0tYm9yZGVyQ29sb3IpO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0taW5mbyk7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2YzZjlmZTtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxMjBweDtcblx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maXhlZC1zaXplIHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpeGVkLXNpemUgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1PdmVybGF5IHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VzIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0XHRcdFx0XHRtYXJnaW46IGNhbGModmFyKC0tZ2FwLXhzKSAqIC0xKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlcy1pdGVtIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0XHRtYXJnaW46IHZhcigtLWdhcC14cyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZSB7XG5cdFx0XHRcdFx0XHRib3JkZXI6IHZhcigtLWJvcmRlcldpZHRoKSBzb2xpZCB2YXIoLS1ib3JkZXJDb2xvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iV3JhcCB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS1pbWFnZSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlLS1sb2FkaW5nIHtcblx0XHRcdFx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLS1vcmlnaW5hbCAuYW50ZC1JbWFnZS1pbWFnZSB7XG5cdFx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdFx0XHRtYXJnaW46IGF1dG87XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdFx0XHRcdHRvcDogNTAlO1xuXHRcdFx0XHRcdFx0bWF4LWhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS1pbmZvIHtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDVweCAxMHB4O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtLXRodW1iIC5hbnRkLUltYWdlLWluZm8ge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS00LTMge1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiA1LjE1NjI1cmVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTE2LTkge1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAzLjg2NzE4NzVyZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSB7XG5cdFx0XHRcdFx0XHRtaW4td2lkdGg6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0bWluLWhlaWdodDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZS10aHVtYiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcblx0XHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLXctZnVsbCA+IGltZyB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdGhlaWdodDogYXV0bztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCN7b3B0aW9ucz8uc3R5bGVzIHx8IFwiXCJ9XG5cblx0XHRcdFx0XHQje29wdGlvbnM/LmFkZF9zdHlsZXMgfHwgXCJcIn1cblx0XHRcdFx0PC9zdHlsZT5cblx0XHRcdDwvaGVhZD5cblx0XHRcdDxib2R5PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlZWRvcyB3b3JrZmxvdyBpbnN0YW5jZS1wcmludFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJza2luLWdyZWVuIHNraW4tYWRtaW4tbHRlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGVudC13cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0I3tzaG93VHJhY2VzQnRufVxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZS1wcmludFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlICN7aW5zdGFuY2Vfc3R5bGV9XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxmb3JtIG5hbWU9XCJpbnN0YW5jZUZvcm1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zdGFuY2UtZm9ybSBib3ggI3tpbnN0YW5jZUJveFN0eWxlfVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tmb3JtRGVzY3JpcHRpb25IdG1sfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJveC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cImJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0nYXR0YWNobWVudHMtc2VjdGlvbic+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje2F0dGFjaG1lbnR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje3JlbGF0ZWRfaW5zdGFuY2VzfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tyZWxhdGVkX3JlY29yZHN9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tib2R5fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Zvcm0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCN7dHJhY2V9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvYm9keT5cblx0XHRcdDxzY3JpcHQ+I3tvcGVuRmlsZVNjcmlwdH07I3tvbkxvYWRTY3JpcHR9OyN7c2hvd1RyYWNlc1NjcmlwdH08L3NjcmlwdD5cblx0XHQ8L2h0bWw+XG5cdFwiXCJcIlxuXG5cdHJldHVybiBodG1sIiwidmFyIF9nZXRMb2NhbGUsIF9nZXRSZXF1aXJlZEZpZWxkcywgX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzLCBfZ2V0U3RhcnRTdGVwUmVxdWlyZWRGaWVsZHMsIF9nZXRUZW1wbGF0ZURhdGEsIF9nZXRWaWV3SHRtbCwgZ2V0TGlua1RleHQsIG1hcmtlZDsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluc3RhbmNlX2F0dGFjaG1lbnQgPSBcIjx0cj5cXG5cdDx0ZCBjbGFzcz1cXFwiaW5zLWF0dGFjaC12aWV3XFxcIj5cXG5cdFx0PGEgaHJlZj1cXFwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVxcXCIgY2xhc3M9XFxcImluc19hdHRhY2hfaHJlZlxcXCIgdGFyZ2V0PVxcXCJfcGFyZW50XFxcIiBkYXRhLW5hbWU9XFxcInt7dGhpcy5uYW1lfX1cXFwiIGRhdGEtdHlwZT1cXFwie3t0aGlzLm9yaWdpbmFsLnR5cGV9fVxcXCIgZGF0YS1pZD1cXFwie3tfaWR9fVxcXCI+e3t0aGlzLm5hbWV9fTwvYT5cXG5cdDwvdGQ+XFxuPC90cj5cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIjxkaXYgY2xhc3M9J3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnPnt7dmFsdWV9fTwvZGl2PlwiO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwJz5cXG5cdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cXG5cdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J3NlY3Rpb24gY2FsbG91dCBjYWxsb3V0LWRlZmF1bHQnPlxcblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Zl9sYWJlbCB0aGlzfX08L2xhYmVsPlxcblx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHR7e2Vsc2V9fVxcblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxcblx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdCBzdGVlZG9zLXRhYmxlXFxcIj5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCIgc3R5bGU9XFxcInBhZGRpbmc6MHB4O1xcXCI+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCIgPlxcblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cXFwiZGVzY3JpcHRpb25cXFwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInJlYWRvbmx5LXRhYmxlXFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7b3ZlcmZsb3cteDphdXRvO1xcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XFxcInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWNvbmRlbnNlZCBhdXRvZm9ybS10YWJsZVxcXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cXFwie3t0aGlzLmNvZGV9fVRhYmxlXFxcIiBuYW1lPVxcXCJ7e3RoaXMuY29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7dGhpcy5uYW1lfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cXFwie3t0aGlzLm5hbWV9fVRoZWFkXFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGJvZHkgaWQ9XFxcInt7dGhpcy5uYW1lfX1UYm9keVxcXCIgbmFtZT1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90Ym9keT5cXG5cdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0e3sjaWYgc2hvd0xhYmVsfX1cXG5cdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdHt7I2lmIGlzVGV4dGFyZWEgdGhpc319XFxuXHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cXG5cdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XFxuXHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0e3svaWZ9fVxcblx0XHR7ey9pZn19XFxuXHR7ey93aXRofX1cXG48L2Rpdj5cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcXG57eyN3aXRoIGdldEZpZWxkIHRoaXMubmFtZX19XFxuXHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cXG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cXG5cdFx0XHRcdFx0PHA+e3t7ZGVzY3JpcHRpb259fX08L3A+XFxuXHRcdFx0XHQ8L2Rpdj5cXG4gIFx0XHRcdFx0PC9kaXY+XFxuXHRcdHt7ZWxzZX19XFxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcXFwiPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7XFxcIj5cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1oZWFkaW5nXFxcIiA+XFxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicmVhZG9ubHktdGFibGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PHRhYmxlIHR5cGU9J3RhYmxlJyBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXFxcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVxcXCJ7e3RoaXMuY29kZX19VGFibGVcXFwiIG5hbWU9XFxcInt7dGhpcy5jb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3t0aGlzLm5hbWV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PHRoZWFkIGlkPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiIG5hbWU9XFxcInt7dGhpcy5uYW1lfX1UaGVhZFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RoZWFkPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGJvZHlcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVCb2R5IHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5Plxcblx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnaW5wdXQnfX1cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1yZXF1aXJlZD1cXFwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XFxcIj5cXG5cdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHR7eyNpZiBpc190ZXh0YXJlYX19XFxuXHRcdFx0XHRcdFx0XHQ8dGV4dGFyZWEgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+PC90ZXh0YXJlYT5cXG5cdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cXG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiB7e2dldFBlcm1pc3Npb25zIGNvZGV9fSBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2RhdGUnfX1cXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtdHlwZT1cXFwiZGF0ZVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2RhdGVUaW1lJ319XFxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXR5cGU9J2RhdGV0aW1lJyBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAncGFzc3dvcmQnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInBhc3N3b3JkXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XFxcInt7dmFsdWV9fVxcXCI+e3tsYWJlbH19PC9vcHRpb24+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJhZi1yYWRpby1ncm91cFxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XFxuICAgICAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcInJhZGlvLWlubGluZSBmaXgtaW5kZW50XFxcIj48aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIHZhbHVlPVxcXCJ7e3ZhbHVlfX1cXFwiIG5hbWU9XFxcInt7Li4vY29kZX19XFxcIiBjbGFzcz1cXFwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcXFwiPiB7e2xhYmVsfX08L2xhYmVsPlxcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2VhY2h9fVxcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiYWYtY2hlY2tib3gtZ3JvdXBcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgdmFsdWU9XFxcInt7dmFsdWV9fVxcXCIgbmFtZT1cXFwie3suLi9jb2RlfX1cXFwiIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFxcXCI+IHt7bGFiZWx9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2VhY2h9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwidXJsXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnZW1haWwnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcImVtYWlsXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnY2hlY2tib3gnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY2hlY2tib3hcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgc3R5bGU9XFxcIndpZHRoOiAxMDAlO1xcXCI+PGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiB2YWx1ZT1cXFwidHJ1ZVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFxcXCI+PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0e3svaWZ9fVxcblx0XHR7ey9pZn19XFxuXHR7ey93aXRofX1cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZSA9IGZ1bmN0aW9uKHRlbXBhbHRlTmFtZSwgc3RlZWRvc0RhdGEpIHtcbiAgdmFyIHRlbXBsYXRlLCB0ZW1wbGF0ZUNvbXBpbGVkLCB0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uO1xuICB0ZW1wbGF0ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdO1xuICB0ZW1wbGF0ZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0ZW1wbGF0ZSwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgdGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG4gIFRlbXBsYXRlW3RlbXBhbHRlTmFtZV0gPSBuZXcgQmxhemUuVGVtcGxhdGUodGVtcGFsdGVOYW1lLCB0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSBmdW5jdGlvbihzdGVlZG9zRGF0YSkge1xuICB2YXIgaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkLCBpbnN0YW5jZVNpZ25UZXh0SHRtbCwgaW5zdGFuY2VTaWduVGV4dFJlbmRlckZ1bmN0aW9uO1xuICBpbnN0YW5jZVNpZ25UZXh0SHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2luc3RhbmNlX3NpZ25fdGV4dC5odG1sJyk7XG4gIGluc3RhbmNlU2lnblRleHRDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VTaWduVGV4dEh0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dCA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlU2lnblRleHRcIiwgaW5zdGFuY2VTaWduVGV4dFJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzKEluc3RhbmNlU2lnblRleHQuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgdmFyIGltYWdlU2lnbkNvbXBpbGVkLCBpbWFnZVNpZ25IdG1sLCBpbWFnZVNpZ25SZW5kZXJGdW5jdGlvbjtcbiAgaW1hZ2VTaWduSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2ltYWdlX3NpZ24uaHRtbCcpO1xuICBpbWFnZVNpZ25Db21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW1hZ2VTaWduSHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIHJldHVybiBUZW1wbGF0ZS5pbWFnZVNpZ24uaGVscGVycyhJbWFnZVNpZ24uaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlVHJhY2VzSGFubGRlciA9IGZ1bmN0aW9uKHN0ZWVkb3NEYXRhKSB7XG4gIHZhciB0cmFjZXNIYW5sZGVyQ29tcGlsZWQsIHRyYWNlc0hhbmxkZXJIdG1sLCB0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb247XG4gIHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpO1xuICB0cmFjZXNIYW5sZGVyQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRyYWNlc0hhbmxkZXJIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICB0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlc0hhbmxkZXJDb21waWxlZCk7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXJcIiwgdHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLmhlbHBlcnMoVHJhY2VzSGFuZGxlci5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5pbml0ID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwXCIsIHN0ZWVkb3NEYXRhKTtcbiAgfVxuICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlKFwiYWZGb3JtR3JvdXBSZWFkXCIsIHN0ZWVkb3NEYXRhKTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHtcbiAgICAgIGFic29sdXRlOiBzdGVlZG9zRGF0YS5hYnNvbHV0ZVxuICAgIH0pO1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVJbWFnZVNpZ24oc3RlZWRvc0RhdGEpO1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQoc3RlZWRvc0RhdGEpO1xuICB9XG59O1xuXG5nZXRMaW5rVGV4dCA9IGZ1bmN0aW9uKGl0ZW0sIGxhYmVsLCBkZXRhaWxfdXJsKSB7XG4gIGlmIChkZXRhaWxfdXJsKSB7XG4gICAgZGV0YWlsX3VybCA9IGRldGFpbF91cmwucmVwbGFjZShcIntfaWR9XCIsIGl0ZW0uX2lkKTtcbiAgICBpZiAoIS9eaHR0cChzPyk6XFwvXFwvLy50ZXN0KGRldGFpbF91cmwpKSB7XG4gICAgICBkZXRhaWxfdXJsID0gU3RlZWRvcy5hYnNvbHV0ZVVybChkZXRhaWxfdXJsKTtcbiAgICB9XG4gICAgcmV0dXJuICc8YSBocmVmPVwiJyArIGRldGFpbF91cmwgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArIGxhYmVsICsgJzwvYT4nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlID0gZnVuY3Rpb24odmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkge1xuICB2YXIgZGF0ZSwgZGV0YWlsX3VybCwgZSwgZmllbGRPcHRpb25zLCBob3VycywgbW9udGgsIG5hbWVGaWVsZCwgcmVjb3JkcywgcmVzLCBzZWNvbmRzLCBzZWxlY3RlZE9wdGlvbiwgc2VsZWN0ZWRPcHRpb25zLCBzcGxpdGVkVmFsdWVzLCB0LCB0MCwgdDEsIHVpU2NoZW1hLCB5ZWFyO1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSBmYWxzZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpZiAoW1wic2VsZWN0XCIsIFwibXVsdGlTZWxlY3RcIiwgXCJyYWRpb1wiXS5pbmRleE9mKGZpZWxkLnR5cGUpID4gLTEpIHtcbiAgICBmaWVsZE9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICB2YXIgaXRlbVNwbGl0cztcbiAgICAgIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuICAgICAgICB2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHZhbHVlID0gdmFsdWUgPyAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgOiAnJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VybCc6XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09PSAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgICAgdmFsdWUgPSBcIjxhIGhyZWY9JycgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBcIjxhIGhyZWY9J2h0dHA6Ly9cIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKCkgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5mdWxsbmFtZSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUubmFtZSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgIHZhbHVlID0gJyoqKioqKic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICdmYWxzZScpIHtcbiAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIiwge30sIGxvY2FsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGF0ZVRpbWUnOlxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgIHNlY29uZHMgPSB0MVsxXTtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0RGF0ZSh2YWx1ZSwgdXRjT2Zmc2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgIHNlY29uZHMgPSB0MVsxXTtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0VGltZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpZiAoZmllbGQuaXNfdGV4dGFyZWEpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWUgPT09IHZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbXVsdGlTZWxlY3QnOlxuICAgICAgc3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9IGZpZWxkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gc3BsaXRlZFZhbHVlcy5pbmRleE9mKGl0ZW0udmFsdWUpID4gLTE7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgICBpZiAoZmllbGQuaXNfcGVyY2VudCkge1xuICAgICAgICAgIHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nKHZhbHVlLCBmaWVsZC5kaWdpdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvZGF0YSc6XG4gICAgICBkZXRhaWxfdXJsID0gZmllbGQuZGV0YWlsX3VybDtcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IF8ubWFwKHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldExpbmtUZXh0KGl0ZW0sIGl0ZW1bJ0BsYWJlbCddLCBkZXRhaWxfdXJsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGdldExpbmtUZXh0KHZhbHVlLCB2YWx1ZVsnQGxhYmVsJ10sIGRldGFpbF91cmwpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gXy5tYXAodmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIGl0ZW0gKyAnXCI+PC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+JztcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIHZhbHVlICsgJ1wiPjwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICByZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCJvcmlnaW5hbFwiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICByZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwge1xuICAgICAgICAgICAgZmlsdGVyczogW1tcIl9pZFwiLCAnaW4nLCB2YWx1ZV1dLFxuICAgICAgICAgICAgZmllbGRzOiBbXCJfaWRcIiwgXCJvcmlnaW5hbFwiXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gXy5tYXAocmVjb3JkcywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHZhciBmaWxlTmFtZSwgZmlsZVByZXZpZXdIdG1sLCBmaWxlVXJsO1xuICAgICAgICAgIGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycgKyBpdGVtLl9pZCk7XG4gICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gJyc7XG4gICAgICAgICAgaWYgKFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnNsaWNlKC00KSkgPiAtMSkge1xuICAgICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gXCImZW5zcDs8YSBocmVmPSdcIiArIGZpbGVVcmwgKyBcIicgdGFyZ2V0PSdfYmxhbmsnIGNsYXNzPSdhbnRkLUxpbmsnPjxzcGFuIGNsYXNzPSdhbnRkLVRwbEZpZWxkJz48c3Bhbj7pooTop4g8L3NwYW4+PC9zcGFuPjwvYT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdj48YSBocmVmPSdcIiArIChmaWxlVXJsICsgJz9kb3dubG9hZD10cnVlJykgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgZmlsZU5hbWUgKyBcIjwvYT4gXCIgKyAoZmlsZVByZXZpZXdIdG1sICE9IG51bGwgPyBmaWxlUHJldmlld0h0bWwgOiB7XG4gICAgICAgICAgICBmaWxlUHJldmlld0h0bWw6ICcnXG4gICAgICAgICAgfSkgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbG9va3VwJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICB1aVNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0KGZpZWxkLnJlZmVyZW5jZV90byk7XG4gICAgICAgICAgbmFtZUZpZWxkID0gKHVpU2NoZW1hICE9IG51bGwgPyB1aVNjaGVtYS5OQU1FX0ZJRUxEX0tFWSA6IHZvaWQgMCkgfHwgJ25hbWUnO1xuICAgICAgICAgIHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvJyArIGZpZWxkLnJlZmVyZW5jZV90byArICc/ZmlsdGVycz1bW1wiJyArIChmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcpICsgJ1wiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCInICsgbmFtZUZpZWxkICsgJ1wiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICBuYW1lRmllbGQgPSBTdGVlZG9zLmdldE9iamVjdE5hbWVGaWVsZEtleShmaWVsZC5yZWZlcmVuY2VfdG8pO1xuICAgICAgICAgIHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoZmllbGQucmVmZXJlbmNlX3RvLCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbW2ZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJywgJ2luJywgdmFsdWVdXSxcbiAgICAgICAgICAgIGZpZWxkczogW1wiX2lkXCIsIG5hbWVGaWVsZF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IF8ubWFwKHJlY29yZHMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gXCI8YSBocmVmPSdcIiArIChTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBwLy0vJyArIGZpZWxkLnJlZmVyZW5jZV90byArICcvdmlldy8nICsgaXRlbS5faWQpKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyBpdGVtW25hbWVGaWVsZF0gKyBcIjwvYT5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIiAsIFwiKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgdmFsdWUgPSB2YWx1ZSA/IFwiPGRpdiBjbGFzcz1cXFwic3RlZWRvcy1odG1sXFxcIj5cIiArIHZhbHVlICsgXCI8L2Rpdj5cIiA6ICcnO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkcywgY29kZSkge1xuICB2YXIgZmllbGQ7XG4gIGZpZWxkID0gZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpO1xuICBpZiAoZmllbGQpIHtcbiAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLm5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZC5jb2RlO1xuICAgIH1cbiAgfVxufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24gPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZm9ybSwgZm9ybV9maWVsZHMsIGZvcm1fdmVyc2lvbjtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gIGZvcm1fdmVyc2lvbiA9IHt9O1xuICBmb3JtX2ZpZWxkcyA9IFtdO1xuICBpZiAoZm9ybS5jdXJyZW50Ll9pZCA9PT0gaW5zdGFuY2UuZm9ybV92ZXJzaW9uKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50O1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IF8ud2hlcmUoZm9ybS5oaXN0b3J5cywge1xuICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtX3ZlcnNpb25cbiAgICB9KVswXTtcbiAgfVxuICBmb3JtX3ZlcnNpb24uZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIGlmIChmaWVsZC5maWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybV9maWVsZHMucHVzaChmKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICBmaWVsZFsnc2ZpZWxkcyddID0gZmllbGRbJ2ZpZWxkcyddO1xuICAgICAgZGVsZXRlIGZpZWxkWydmaWVsZHMnXTtcbiAgICAgIHJldHVybiBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuICAgIH1cbiAgfSk7XG4gIGZvcm1fdmVyc2lvbi5maWVsZHMgPSBmb3JtX2ZpZWxkcztcbiAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbiA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIHZhciBmbG93LCBmbG93X3ZlcnNpb247XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGluc3RhbmNlLmZsb3cpO1xuICBmbG93X3ZlcnNpb24gPSB7fTtcbiAgaWYgKGZsb3cuY3VycmVudC5faWQgPT09IGluc3RhbmNlLmZsb3dfdmVyc2lvbikge1xuICAgIGZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudDtcbiAgfSBlbHNlIHtcbiAgICBmbG93X3ZlcnNpb24gPSBfLndoZXJlKGZsb3cuaGlzdG9yeXMsIHtcbiAgICAgIF9pZDogaW5zdGFuY2UuZmxvd192ZXJzaW9uXG4gICAgfSlbMF07XG4gIH1cbiAgcmV0dXJuIGZsb3dfdmVyc2lvbjtcbn07XG5cbl9nZXRWaWV3SHRtbCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHZpZXdIdG1sO1xuICB2aWV3SHRtbCA9IEFzc2V0cy5nZXRUZXh0KHBhdGgpO1xuICBpZiAodmlld0h0bWwpIHtcbiAgICB2aWV3SHRtbCA9IHZpZXdIdG1sLnJlcGxhY2UoLzx0ZW1wbGF0ZVtcXHdcXHNcXFwiXFw9J10rPi9pLCBcIlwiKS5yZXBsYWNlKC88XFwvdGVtcGxhdGU+L2ksIFwiXCIpO1xuICB9XG4gIHJldHVybiB2aWV3SHRtbDtcbn07XG5cbl9nZXRMb2NhbGUgPSBmdW5jdGlvbih1c2VyKSB7XG4gIHZhciBsb2NhbGUsIHJlZiwgcmVmMTtcbiAgaWYgKCh1c2VyICE9IG51bGwgPyAocmVmID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYudG9Mb2NhbGVMb3dlckNhc2UoKSA6IHZvaWQgMCA6IHZvaWQgMCkgPT09ICd6aC1jbicpIHtcbiAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gIH0gZWxzZSBpZiAoKHVzZXIgIT0gbnVsbCA/IChyZWYxID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYxLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDAgOiB2b2lkIDApID09PSAnZW4tdXMnKSB7XG4gICAgbG9jYWxlID0gXCJlblwiO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuX2dldFJlcXVpcmVkRmllbGRzID0gZnVuY3Rpb24oZmllbGRzLCByZXYpIHtcbiAgaWYgKCFyZXYpIHtcbiAgICByZXYgPSBbXTtcbiAgfVxuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgIHJldHVybiBfZ2V0UmVxdWlyZWRGaWVsZHMoZmllbGQuZmllbGRzLCByZXYpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWVsZC5pc19yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gcmV2LnB1c2goZmllbGQuY29kZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldjtcbn07XG5cbl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgc3RhcnRTdGVwO1xuICBzdGFydFN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcF90eXBlXCIsIFwic3RhcnRcIik7XG4gIGVkaXRhYmxlQ29kZSA9IFtdO1xuICBfLmtleXMoc3RhcnRTdGVwLnBlcm1pc3Npb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChzdGFydFN0ZXAucGVybWlzc2lvbnNba2V5XSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgcmV0dXJuIGVkaXRhYmxlQ29kZS5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGVkaXRhYmxlQ29kZTtcbn07XG5cbl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgcmVxdWlyZWRGaWVsZHM7XG4gIHJlcXVpcmVkRmllbGRzID0gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkcyk7XG4gIGVkaXRhYmxlQ29kZSA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHN0ZXBzKTtcbiAgcmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVpcmVkRmllbGRzLCBlZGl0YWJsZUNvZGUpO1xufTtcblxuX2dldFRlbXBsYXRlRGF0YSA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgZmxvdywgZm9ybSwgZm9ybV92ZXJzaW9uLCBsb2NhbGUsIHN0ZWVkb3NEYXRhO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKTtcbiAgfVxuICBsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuICBzdGVlZG9zRGF0YSA9IHt9O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgc3RlZWRvc0RhdGEgPSBfLmNsb25lKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKSk7XG4gICAgc3RlZWRvc0RhdGEuaW5zbmFtZSA9IGluc3RhbmNlLm5hbWU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX2ZpbmFsX2RlY2lzaW9uID0gaW5zdGFuY2UuaW5zX2ZpbmFsX2RlY2lzaW9uO1xuICAgIHN0ZWVkb3NEYXRhLmluc19jb2RlID0gaW5zdGFuY2UuY29kZTtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfYXJjaGl2ZWQgPSBpbnN0YW5jZS5pc19hcmNoaXZlZDtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfZGVsZXRlZCA9IGluc3RhbmNlLmluc19pc19kZWxldGVkO1xuICAgIHN0ZWVkb3NEYXRhLmFwcGxpY2FudF9uYW1lID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWU7XG4gICAgc3RlZWRvc0RhdGEuYXBwbGljYW50Q29udGV4dCA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lO1xuICB9XG4gIHN0ZWVkb3NEYXRhLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbiA9IGZvcm1fdmVyc2lvbjtcbiAgc3RlZWRvc0RhdGEubG9jYWxlID0gbG9jYWxlO1xuICBzdGVlZG9zRGF0YS51dGNPZmZzZXQgPSB1c2VyLnV0Y09mZnNldDtcbiAgc3RlZWRvc0RhdGEuc3BhY2UgPSBpbnN0YW5jZS5zcGFjZTtcbiAgc3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCA9IHVzZXIuX2lkO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApIHtcbiAgICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtXG4gICAgICB9KTtcbiAgICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mbG93XG4gICAgICB9KTtcbiAgICAgIHN0ZWVkb3NEYXRhLnN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzID0gX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKGZvcm0uY3VycmVudC5maWVsZHMsIGZsb3cuY3VycmVudC5zdGVwcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGVlZG9zRGF0YTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlID0gZnVuY3Rpb24oZGF0ZSwgdXRjT2Zmc2V0KSB7XG4gIHZhciBwYXNzaW5nO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgcGFzc2luZyA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHBhc3NpbmcgPSB0cnVlO1xuICB9XG4gIGlmICghdXRjT2Zmc2V0ICYmIHV0Y09mZnNldCAhPT0gMCkge1xuICAgIHV0Y09mZnNldCA9IDg7XG4gIH1cbiAgcmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0LCBwYXNzaW5nKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tXCIpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdFRpbWUgPSBmdW5jdGlvbihkYXRlKSB7XG4gIHZhciB1dGNPZmZzZXQ7XG4gIHV0Y09mZnNldCA9IDA7XG4gIHJldHVybiBtb21lbnQoZGF0ZSkudXRjT2Zmc2V0KHV0Y09mZnNldCkuZm9ybWF0KFwiSEg6bW1cIik7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCBpbnN0YW5jZUNvbXBpbGVkLCBpbnN0YW5jZVJlbmRlckZ1bmN0aW9uLCBpbnN0YW5jZVRlbXBsYXRlLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIGluc3RhbmNlVGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUoaW5zdGFuY2UsIG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMudGVtcGxhdGVOYW1lIDogdm9pZCAwKTtcbiAgaW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZTZWxlY3RVc2VyL2csIFwiYWZTZWxlY3RVc2VyUmVhZFwiKTtcbiAgaWYgKCEob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5lZGl0YWJsZSA6IHZvaWQgMCkpIHtcbiAgICBpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZkZvcm1Hcm91cC9nLCBcImFmRm9ybUdyb3VwUmVhZFwiKTtcbiAgfVxuICBpbnN0YW5jZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVRlbXBsYXRlLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBpbnN0YW5jZVJlbmRlckZ1bmN0aW9uID0gZXZhbChpbnN0YW5jZUNvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3JlYWRvbmx5X3ZpZXdcIiwgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMpO1xuICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdChzdGVlZG9zRGF0YSk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBcIjxkaXYgaWQ9J2luc3RhbmNlZm9ybScgPlxcblx0XCIgKyBib2R5ICsgXCJcXG48L2Rpdj5cIjtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRUcmFjZXNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCBmb3JtLCBzdGVlZG9zRGF0YSwgdHJhY2VDb21waWxlZCwgdHJhY2VSZW5kZXJGdW5jdGlvbiwgdHJhY2VzSHRtbDtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuICBpZiAoZm9ybS5pbnN0YW5jZV9zdHlsZSA9PT0gXCJ0YWJsZVwiIHx8IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRlbXBsYXRlTmFtZSA6IHZvaWQgMCkgPT09IFwidGFibGVcIikge1xuICAgIHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXNfdGFibGUuaHRtbCcpO1xuICB9IGVsc2Uge1xuICAgIHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXMuaHRtbCcpO1xuICB9XG4gIHRyYWNlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRyYWNlc0h0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHRyYWNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlQ29tcGlsZWQpO1xuICBUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwidHJhY2VfcmVhZG9ubHlfdmlld1wiLCB0cmFjZVJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICBUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LmhlbHBlcnMoVHJhY2VzVGVtcGxhdGUuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LCBpbnN0YW5jZS50cmFjZXMpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRBdHRhY2htZW50VmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSkge1xuICB2YXIgYXR0YWNobWVudENvbXBpbGVkLCBhdHRhY2htZW50SHRtbCwgYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uLCBib2R5LCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIGF0dGFjaG1lbnRIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW5zdGFuY2VfYXR0YWNobWVudHMuaHRtbCcpO1xuICBhdHRhY2htZW50Q29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGF0dGFjaG1lbnRIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24gPSBldmFsKGF0dGFjaG1lbnRDb21waWxlZCk7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJhdHRhY2htZW50c19yZWFkb25seV92aWV3XCIsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5oZWxwZXJzKEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldyk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCByZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQsIHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCByZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24sIHN0ZWVkb3NEYXRhO1xuICBzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuYWJzb2x1dGUgOiB2b2lkIDApIHtcbiAgICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG4gIH1cbiAgcmVsYXRlZEluc3RhbmNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9yZWxhdGVkX2luc3RhbmNlcy5odG1sJyk7XG4gIHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZEluc3RhbmNlc0h0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXdcIiwgcmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICBUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LmhlbHBlcnMoUmVsYXRlZEluc3RhbmNlcy5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcsIHN0ZWVkb3NEYXRhKTtcbiAgcmV0dXJuIGJvZHk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCByZWxhdGVkUmVjb3Jkc0NvbXBpbGVkLCByZWxhdGVkUmVjb3Jkc0h0bWwsIHJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24sIHN0ZWVkb3NEYXRhO1xuICBzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuYWJzb2x1dGUgOiB2b2lkIDApIHtcbiAgICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG4gIH1cbiAgcmVsYXRlZFJlY29yZHNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9yZWNvcmRzLmh0bWwnKTtcbiAgcmVsYXRlZFJlY29yZHNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZFJlY29yZHNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX3JlY29yZHNfdmlld1wiLCByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuaGVscGVycyhSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdCA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIHZhciBmb3JtX3NjcmlwdCwgZm9ybV92ZXJzaW9uO1xuICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKTtcbiAgZm9ybV9zY3JpcHQgPSBmb3JtX3ZlcnNpb24uZm9ybV9zY3JpcHQ7XG4gIGlmIChmb3JtX3NjcmlwdCAmJiBmb3JtX3NjcmlwdC5yZXBsYWNlKC9cXG4vZywgXCJcIikucmVwbGFjZSgvXFxzL2csIFwiXCIpLmxlbmd0aCA+IDApIHtcbiAgICBmb3JtX3NjcmlwdCA9IFwiQ29yZUZvcm0gPSB7fTtDb3JlRm9ybS5pbnN0YW5jZWZvcm0gPSB7fTtcIiArIGZvcm1fc2NyaXB0O1xuICAgIHJldHVybiBmb3JtX3NjcmlwdCArPSBcIjtpZihDb3JlRm9ybS5mb3JtX09uTG9hZCl7d2luZG93Lm9ubG9hZCA9IENvcmVGb3JtLmZvcm1fT25Mb2FkKCk7fVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmb3JtX3NjcmlwdCA9IFwiXCI7XG4gIH1cbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwgPSBmdW5jdGlvbih1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGFsbENzc0xpbmssIGF0dGFjaG1lbnQsIGJvZHksIGNyZWF0b3JTZXJ2aWNlLCBjc3NIcmVmLCBmb3JtLCBmb3JtRGVzY3JpcHRpb24sIGZvcm1EZXNjcmlwdGlvbkh0bWwsIGh0bWwsIGluc19yZWNvcmRfaWRzLCBpbnN0YW5jZUJveFN0eWxlLCBpbnN0YW5jZV9zdHlsZSwganFIcmVmLCBsb2NhbGUsIG9uTG9hZFNjcmlwdCwgb3BlbkZpbGVTY3JpcHQsIHJlZiwgcmVmMSwgcmVsYXRlZF9pbnN0YW5jZXMsIHJlbGF0ZWRfcmVjb3Jkcywgc2hvd1RyYWNlc0J0biwgc2hvd1RyYWNlc1NjcmlwdCwgdHJhY2UsIHRyYWNlQ2hlY2ssIHdpZHRoO1xuICBib2R5ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBvbkxvYWRTY3JpcHQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0KGluc3RhbmNlKTtcbiAgY3JlYXRvclNlcnZpY2UgPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY3JlYXRvcikgIT0gbnVsbCA/IHJlZjEudXJsIDogdm9pZCAwIDogdm9pZCAwO1xuICBpbnNfcmVjb3JkX2lkcyA9IGluc3RhbmNlLnJlY29yZF9pZHM7XG4gIGxvY2FsZSA9IF9nZXRMb2NhbGUodXNlcik7XG4gIG9wZW5GaWxlU2NyaXB0ID0gXCJpZih3aW5kb3cuaXNOb2RlICYmIGlzTm9kZSgpKXtcXG5cdGF0dGFjaHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxcXCJpbnNfYXR0YWNoX2hyZWZcXFwiKTtcXG5cdGZvcih2YXIgaSA9IDA7IGkgPCBhdHRhY2hzLmxlbmd0aDsgaSsrKXtcXG5cdFx0YXR0YWNoID0gYXR0YWNoc1tpXTtcXG5cdFx0YXR0YWNoLmFkZEV2ZW50TGlzdGVuZXIoXFxcImNsaWNrXFxcIiwgZnVuY3Rpb24oZSl7XFxuXHRcdFx0aWYoaXNJbWFnZSh0aGlzLmRhdGFzZXQudHlwZSkgfHwgaXNIdG1sKHRoaXMuZGF0YXNldC50eXBlKSl7XFxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XFxuXHRcdFx0XHRvcGVuV2luZG93KFxcXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cXFwiICsgdGhpcy5kYXRhc2V0LmlkKTtcXG5cdFx0XHR9ZWxzZSBpZihud19jb3JlLmNhbk9wZW5GaWxlKHRoaXMuZGF0YXNldC5uYW1lKSl7XFxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XFxuXHRcdFx0XHRud19jb3JlLm9wZW5GaWxlKHRoaXMuaHJlZiwgdGhpcy5kYXRhc2V0Lm5hbWUpXFxuXHRcdFx0fVxcblx0XHR9KTtcXG5cdH1cXG59XFxuXFxudmFyIGZsb3cgPSBcXFwiXCIgKyBpbnN0YW5jZS5mbG93ICsgXCJcXFwiO1xcbnZhciBzcGFjZSA9IFxcXCJcIiArIGluc3RhbmNlLnNwYWNlICsgXCJcXFwiO1xcblxcbmZ1bmN0aW9uIGdldENvb2tpZShuYW1lKXtcXG5cdGxldCBwYXR0ZXJuID0gUmVnRXhwKG5hbWUgKyBcXFwiPS5bXjtdKlxcXCIpXFxuXHRsZXQgbWF0Y2hlZCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChwYXR0ZXJuKVxcblx0aWYobWF0Y2hlZCl7XFxuXHRcdGxldCBjb29raWUgPSBtYXRjaGVkWzBdLnNwbGl0KCc9JylcXG5cdFx0cmV0dXJuIGNvb2tpZVsxXVxcblx0fVxcblx0cmV0dXJuICcnXFxufVxcblxcbnZhciByZWNvcmRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcXFwiaW5zLXJlbGF0ZWQtcmVjb3Jkc1xcXCIpO1xcbmZvcih2YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKXtcXG5cdFx0dmFyIHJlY29yZCA9IHJlY29yZHNbaV07XFxuXHRcdHJlY29yZC5hZGRFdmVudExpc3RlbmVyKFxcXCJjbGlja1xcXCIsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdHZhciBjcmVhdG9yU2VydmljZSA9IFxcXCJcIiArIGNyZWF0b3JTZXJ2aWNlICsgXCJcXFwiXFxuXHRcdFx0dmFyIGluc19yZWNvcmRfaWRzID0gXCIgKyAoSlNPTi5zdHJpbmdpZnkoaW5zX3JlY29yZF9pZHMpKSArIFwiXFxuXHRcdFx0aWYoY3JlYXRvclNlcnZpY2UgJiYgaW5zX3JlY29yZF9pZHMgJiYgaW5zX3JlY29yZF9pZHMubGVuZ3RoID4gMCl7XFxuXHRcdFx0XHR2YXIgb2JqY2V0TmFtZSA9IGluc19yZWNvcmRfaWRzWzBdLm9cXG5cdFx0XHRcdHZhciBpZCA9IGluc19yZWNvcmRfaWRzWzBdLmlkc1swXVxcblx0XHRcdFx0dmFyIHVvYmogPSB7fTtcXG5cdFx0XHRcdHVvYmpbXFxcIlgtVXNlci1JZFxcXCJdID0gZ2V0Q29va2llKFxcXCJYLVVzZXItSWRcXFwiKTtcXG5cdFx0XHRcdHVvYmpbXFxcIlgtQXV0aC1Ub2tlblxcXCJdID0gZ2V0Q29va2llKFxcXCJYLUF1dGgtVG9rZW5cXFwiKTtcXG5cdFx0XHRcdHJlZGlyZWN0VXJsID0gY3JlYXRvclNlcnZpY2UgKyBcXFwiYXBwLy0vXFxcIiArIG9iamNldE5hbWUgKyBcXFwiL3ZpZXcvXFxcIiArIGlkICsgXFxcIj9cXFwiICsgJC5wYXJhbSh1b2JqKTtcXG5cdFx0XHRcdG9wZW5XaW5kb3cocmVkaXJlY3RVcmwpO1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxuXCI7XG4gIGlmICghU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gICAgaWYgKChmb3JtICE9IG51bGwgPyBmb3JtLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSA9PT0gJ3RhYmxlJykge1xuICAgICAgaW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCI7XG4gICAgfVxuICB9XG4gIGlmICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50ZW1wbGF0ZU5hbWUgOiB2b2lkIDApID09PSAndGFibGUnKSB7XG4gICAgaW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCI7XG4gIH1cbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuaW5zdGFuY2Vfc3R5bGUgOiB2b2lkIDApIHtcbiAgICBpbnN0YW5jZV9zdHlsZSA9IG9wdGlvbnMuaW5zdGFuY2Vfc3R5bGU7XG4gIH1cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd1RyYWNlID09PSB0cnVlKSB7XG4gICAgdHJhY2UgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIHRyYWNlID0gXCJcIjtcbiAgfVxuICBpbnN0YW5jZUJveFN0eWxlID0gXCJcIjtcbiAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uKSB7XG4gICAgaWYgKGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgIGluc3RhbmNlQm94U3R5bGUgPSBcImJveC1zdWNjZXNzXCI7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICBpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtZGFuZ2VyXCI7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnNob3dBdHRhY2htZW50cyA9PT0gdHJ1ZSkge1xuICAgIGF0dGFjaG1lbnQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgICByZWxhdGVkX2luc3RhbmNlcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICAgIHJlbGF0ZWRfcmVjb3JkcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkUmVjb3Jkc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhdHRhY2htZW50ID0gXCJcIjtcbiAgICByZWxhdGVkX2luc3RhbmNlcyA9IFwiXCI7XG4gICAgcmVsYXRlZF9yZWNvcmRzID0gXCJcIjtcbiAgfVxuICB3aWR0aCA9IFwiOTYwcHhcIjtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMud2lkdGggOiB2b2lkIDApIHtcbiAgICB3aWR0aCA9IFwiXCI7XG4gIH1cbiAgY3NzSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcInN0ZWVkb3MtY3NzXCIpO1xuICBqcUhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3ZWJzaXRlL2xpYnMvanF1ZXJ5Lm1pbi5qc1wiKTtcbiAgYWxsQ3NzTGluayA9IFwiPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgY2xhc3M9XFxcIl9fbWV0ZW9yLWNzc19fXFxcIiBocmVmPVxcXCJcIiArIGNzc0hyZWYgKyBcIlxcXCI+XCI7XG4gIHRyYWNlQ2hlY2sgPSBcIlwiO1xuICBpZiAoIV8uaXNFbXB0eSh0cmFjZSkpIHtcbiAgICB0cmFjZUNoZWNrID0gXCJjaGVja2VkXCI7XG4gIH1cbiAgaWYgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRhZ2dlciA6IHZvaWQgMCkgPT09ICdlbWFpbCcgfHwgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApKSB7XG4gICAgc2hvd1RyYWNlc0J0biA9IFwiXCI7XG4gIH0gZWxzZSB7XG4gICAgc2hvd1RyYWNlc0J0biA9IFwiPGRpdiBjbGFzcz1cXFwibmF2aWdhdGlvbi1iYXIgYnRuLWdyb3VwIG5vLXByaW50XFxcIiBzdHlsZT1cXFwibWluLXdpZHRoOiA2MDBweDsgei1pbmRleDogOTk5OyBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJwcmludC10b29sXFxcIj5cXG5cdFx0PGxhYmVsIGNsYXNzPVxcXCJjYngtbGFiZWxcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2xhc3M9XFxcImNieC1wcmludCBjYngtcHJpbnQtYXR0YWNobWVudHNcXFwiIGlkPVxcXCJjYngtcHJpbnQtYXR0YWNobWVudHNcXFwiIGNoZWNrZWQ9XFxcImNoZWNrZWRcXFwiPjxzcGFuPlwiICsgKFRBUGkxOG4uX18oJ2luc3RhbmNlX2F0dGFjaG1lbnQnLCB7fSwgbG9jYWxlKSkgKyBcIjwvc3Bhbj48L2xhYmVsPlxcblx0XHQ8bGFiZWwgY2xhc3M9XFxcImNieC1sYWJlbFxcXCI+PGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBjbGFzcz1cXFwiY2J4LXByaW50IGNieC1wcmludC10cmFjZXNcXFwiIGlkPVxcXCJjYngtcHJpbnQtdHJhY2VzXFxcIiBjaGVja2VkPVxcXCJcIiArIHRyYWNlQ2hlY2sgKyBcIlxcXCI+PHNwYW4+XCIgKyAoVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92YWxfaGlzdG9yeScsIHt9LCBsb2NhbGUpKSArIFwiPC9zcGFuPjwvbGFiZWw+XFxuXHQ8L2Rpdj5cXG48L2Rpdj5cIjtcbiAgfVxuICBzaG93VHJhY2VzU2NyaXB0ID0gXCIkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCl7XFxuXHR2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtdHJhY2VzJyk7XFxuXHR2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2luc3RhbmNlLXRyYWNlcycpWzBdO1xcblx0aWYgKGIgJiYgYi5jaGVja2VkICYmIHQpe1xcblx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdH0gZWxzZSBpZih0KXtcXG5cdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcXG5cdH1cXG5cdGlmKGIpe1xcblx0XHRiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdGlmIChlLnRhcmdldC5jaGVja2VkKXtcXG5cdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xcblx0XHRcdH0gZWxzZSB7XFxuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxuXFxuXFxuXHR2YXIgYXR0YWNobWVudHNDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtYXR0YWNobWVudHMnKTtcXG5cdHZhciBhdHRhY2htZW50c1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRhY2htZW50cy1zZWN0aW9uJylbMF07XFxuXHRpZiAoYXR0YWNobWVudHNDaGVja2JveCAmJiBhdHRhY2htZW50c0NoZWNrYm94LmNoZWNrZWQgJiYgYXR0YWNobWVudHNWaWV3KXtcXG5cdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdH0gZWxzZSBpZihhdHRhY2htZW50c1ZpZXcpe1xcblx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHR9XFxuXHRpZihhdHRhY2htZW50c0NoZWNrYm94KXtcXG5cdFx0YXR0YWNobWVudHNDaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcXG5cdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XFxuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xcblx0XHRcdH0gZWxzZSB7XFxuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHRcdFx0fVxcblx0XHR9KTtcXG5cdH1cXG59KTtcXG5cIjtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuc3R5bGVzIDogdm9pZCAwKSB7XG4gICAgYWxsQ3NzTGluayA9IFwiXCI7XG4gIH1cbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgIF9pZDogaW5zdGFuY2UuZm9ybVxuICB9KTtcbiAgZm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiXCI7XG4gIGlmIChmb3JtKSB7XG4gICAgZm9ybURlc2NyaXB0aW9uID0gZm9ybS5kZXNjcmlwdGlvbjtcbiAgICBpZiAoZm9ybURlc2NyaXB0aW9uKSB7XG4gICAgICBmb3JtRGVzY3JpcHRpb24gPSBmb3JtRGVzY3JpcHRpb24ucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIik7XG4gICAgICBmb3JtRGVzY3JpcHRpb25IdG1sID0gXCI8ZGl2IGNsYXNzPVxcXCJib3gtaGVhZGVyICB3aXRoLWJvcmRlciBpbnN0YW5jZS1oZWFkZXJcXFwiPlxcblx0PGRpdj5cXG5cdFx0XCIgKyBmb3JtRGVzY3JpcHRpb24gKyBcIlxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gICAgfVxuICB9XG4gIGh0bWwgPSBcIjwhRE9DVFlQRSBodG1sPlxcbjxodG1sPlxcblx0PGhlYWQ+XFxuXHRcdDxtZXRhIGh0dHAtZXF1aXY9XFxcIkNvbnRlbnQtVHlwZVxcXCIgY29udGVudD1cXFwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XFxcIi8+XFxuXHRcdFwiICsgYWxsQ3NzTGluayArIFwiXFxuXHRcdDxzY3JpcHQgc3JjPVxcXCJcIiArIGpxSHJlZiArIFwiXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0Plxcblx0XHQ8c2NyaXB0IHNyYz1cXFwiL2pzL253X2NvcmUuanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCI+PC9zY3JpcHQ+XFxuXHRcdFwiICsgKG9wdGlvbnMucGx1Z2lucyB8fCBcIlwiKSArIFwiXFxuXFxuXHRcdDxzdHlsZT5cXG5cdFx0XHQuc3RlZWRvc3tcXG5cdFx0XHRcdHdpZHRoOiBcIiArIHdpZHRoICsgXCI7XFxuXHRcdFx0XHRtYXJnaW4tbGVmdDogYXV0bztcXG5cdFx0XHRcdG1hcmdpbi1yaWdodDogYXV0bztcXG5cdFx0XHR9XFxuXFxuXHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLW5hbWV7XFxuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudFxcblx0XHRcdH1cXG5cdFx0XHQuYm94LXRvb2xze1xcblx0XHRcdFx0ZGlzcGxheTogbm9uZTtcXG5cdFx0XHR9XFxuXHRcdFx0LmJveC5jb2xsYXBzZWQtYm94IC5ib3gtYm9keSwuYm94LmNvbGxhcHNlZC1ib3ggLmJveC1mb290ZXIge1xcblx0XHRcdCAgZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblxcblx0XHRcdGJvZHl7XFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiBhenVyZSAhaW1wb3J0YW50O1xcblx0XHRcdH1cXG5cXG5cdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtdHJhY2Vze1xcblx0XHRcdFx0cGFkZGluZy1sZWZ0OiAxNXB4O1xcblx0XHRcdFx0cGFkZGluZy1yaWdodDogMTVweDtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0ge1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLUltYWdlQ29udHJvbC1hZGRCdG4tYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcblx0XHRcdHBhZGRpbmc6IHZhcigtLWdhcC14cyk7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcblx0XHRcdG1hcmdpbi1yaWdodDogdmFyKC0tZ2FwLWJhc2UpO1xcblx0XHRcdG1hcmdpbi1ib3R0b206IHZhcigtLWdhcC1iYXNlKTtcXG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0d2lkdGg6IDcuNXJlbTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCB7XFxuXHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLUZpbGVDb250cm9sLWRhbmdlci1jb2xvcik7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHN2Zy5pY29uLXJlZnJlc2gge1xcblx0XHRcdHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xcblx0XHRcdGNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUgPiBzdmcuaWNvbi1pbWFnZSB7XFxuXHRcdFx0bWFyZ2luLWJvdHRvbTogOHB4O1xcblx0XHRcdHdpZHRoOiAyNHB4O1xcblx0XHRcdGhlaWdodDogMjRweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3BhbiB7XFxuXHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XFxuXHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcXG5cdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWltYWdlIHtcXG5cdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRib3JkZXI6IG5vbmU7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XFxuXHRcdFx0Y29sb3I6ICM5OTk7XFxuXHRcdFx0dG9wOiA1cHg7XFxuXHRcdFx0cmlnaHQ6IDVweDtcXG5cdFx0XHRsaW5lLWhlaWdodDogMTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciA+IHN2ZyB7XFxuXHRcdFx0dG9wOiAwO1xcblx0XHRcdHdpZHRoOiAxMHB4O1xcblx0XHRcdGhlaWdodDogMTBweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1JbmZvIHtcXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cdFx0XHR3aWR0aDogMTEwcHg7XFxuXHRcdFx0aGVpZ2h0OiAxMTBweDtcXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xcblx0XHRcdGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRmbGV4LXdyYXA6IHdyYXA7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyA+IHAge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cdFx0XHRmb250LXNpemU6IDEycHg7XFxuXHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3Mge1xcblx0XHRcdHdpZHRoOiA3MHB4O1xcblx0XHRcdGhlaWdodDogNXB4O1xcblx0XHRcdGJhY2tncm91bmQ6ICNlYmViZWI7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1wcm9ncmVzc1ZhbHVlIHtcXG5cdFx0XHRoZWlnaHQ6IDVweDtcXG5cdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3MtYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHRkaXNwbGF5OiBibG9jaztcXG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1pbmZvKTtcXG5cdFx0XHRtaW4td2lkdGg6IDEwJTtcXG5cdFx0XHR0cmFuc2l0aW9uOiBlYXNlLW91dCB3aWR0aCB2YXIoLS1hbmltYXRpb24tZHVyYXRpb24pO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdGRpc3BsYXk6IG5vbmU7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQ6aG92ZXIgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1lcnJvck1zZyB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLWRhbmdlcik7XFxuXHRcdFx0bWFyZ2luOiA1cHggMCAwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtdXBsb2FkQnRuIHtcXG5cdFx0XHRtYXJnaW4tdG9wOiA1cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wcGVyV3JhcHBlciB7XFxuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIgaW1nIHtcXG5cdFx0XHRtYXgtd2lkdGg6IDEwMCU7XFxuXHRcdFx0bWF4LWhlaWdodDogNDAwcHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyIHtcXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXHRcdFx0cmlnaHQ6IDA7XFxuXHRcdFx0Ym90dG9tOiAwO1xcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXHRcdFx0YWxpZ24taXRlbXM6IGZsZXgtZW5kO1xcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xcblx0XHRcdG1hcmdpbjogMC41cmVtO1xcblx0XHRcdGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYSB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLUZvcm0taXRlbS1mb250Q29sb3IpO1xcblx0XHRcdHBhZGRpbmc6IDJweCA1cHg7XFxuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIgPiBhOmhvdmVyIHtcXG5cdFx0XHRjb2xvcjogdmFyKC0tbGluay1jb2xvcik7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1hY2NlcHRUaXAge1xcblx0XHRcdGhlaWdodDogMTIwcHg7XFxuXHRcdFx0Y29sb3I6ICM5OTk7XFxuXHRcdFx0Ym9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlckNvbG9yKTtcXG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLWluZm8pO1xcblx0XHRcdGJhY2tncm91bmQ6ICNmM2Y5ZmU7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHRsaW5lLWhlaWdodDogMTIwcHg7XFxuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maXhlZC1zaXplIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtT3ZlcmxheSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdH1cXG5cXG5cdFx0XHQuYW50ZC1JbWFnZXMge1xcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcXG5cdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcXG5cdFx0XHRcdG1hcmdpbjogY2FsYyh2YXIoLS1nYXAteHMpICogLTEpO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2VzLWl0ZW0ge1xcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcXG5cdFx0XHRcdG1hcmdpbjogdmFyKC0tZ2FwLXhzKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlIHtcXG5cdFx0XHRcdGJvcmRlcjogdmFyKC0tYm9yZGVyV2lkdGgpIHNvbGlkIHZhcigtLWJvcmRlckNvbG9yKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLS10aHVtYiB7XFxuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuXHRcdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWJXcmFwIHtcXG5cdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtaW1hZ2UtLWxvYWRpbmcge1xcblx0XHRcdFx0dmlzaWJpbGl0eTogaGlkZGVuO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtLW9yaWdpbmFsIC5hbnRkLUltYWdlLWltYWdlIHtcXG5cdFx0XHRcdG1heC13aWR0aDogMTAwJTtcXG5cdFx0XHRcdG1heC1oZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR3aWR0aDogYXV0bztcXG5cdFx0XHRcdG1hcmdpbjogYXV0bztcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iIHtcXG5cdFx0XHRcdHdpZHRoOiA2Ljg3NXJlbTtcXG5cdFx0XHRcdGhlaWdodDogNi44NzVyZW07XFxuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xcblx0XHRcdFx0bGVmdDogNTAlO1xcblx0XHRcdFx0dG9wOiA1MCU7XFxuXHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWluZm8ge1xcblx0XHRcdFx0cGFkZGluZzogNXB4IDEwcHg7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIgLmFudGQtSW1hZ2UtaW5mbyB7XFxuXHRcdFx0XHR3aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRwYWRkaW5nOiAwO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTQtMyB7XFxuXHRcdFx0XHRoZWlnaHQ6IDUuMTU2MjVyZW07XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tMTYtOSB7XFxuXHRcdFx0XHRoZWlnaHQ6IDMuODY3MTg3NXJlbTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIHtcXG5cdFx0XHRcdG1pbi13aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRtaW4taGVpZ2h0OiA2Ljg3NXJlbTtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iIHtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLWZpeGVkLXNpemUgLmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tdy1mdWxsID4gaW1nIHtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0aGVpZ2h0OiBhdXRvO1xcblx0XHRcdFx0fVxcblxcblx0XHRcdFwiICsgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnN0eWxlcyA6IHZvaWQgMCkgfHwgXCJcIikgKyBcIlxcblxcblx0XHRcdFwiICsgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFkZF9zdHlsZXMgOiB2b2lkIDApIHx8IFwiXCIpICsgXCJcXG5cdFx0PC9zdHlsZT5cXG5cdDwvaGVhZD5cXG5cdDxib2R5Plxcblx0XHQ8ZGl2IGNsYXNzPVxcXCJzdGVlZG9zIHdvcmtmbG93IGluc3RhbmNlLXByaW50XFxcIj5cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJza2luLWdyZWVuIHNraW4tYWRtaW4tbHRlXFxcIj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9XFxcIndyYXBwZXJcXFwiPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb250ZW50LXdyYXBwZXJcXFwiPlxcblx0XHRcdFx0XHRcdFwiICsgc2hvd1RyYWNlc0J0biArIFwiXFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UtcHJpbnRcXFwiPlxcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UgXCIgKyBpbnN0YW5jZV9zdHlsZSArIFwiXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PGZvcm0gbmFtZT1cXFwiaW5zdGFuY2VGb3JtXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJpbnN0YW5jZS1mb3JtIGJveCBcIiArIGluc3RhbmNlQm94U3R5bGUgKyBcIlxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIGZvcm1EZXNjcmlwdGlvbkh0bWwgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiYm94LWJvZHlcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiIHN0eWxlPVxcXCJib3gtc2l6aW5nOiBib3JkZXItYm94O1xcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0nYXR0YWNobWVudHMtc2VjdGlvbic+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIGF0dGFjaG1lbnQgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyByZWxhdGVkX2luc3RhbmNlcyArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIHJlbGF0ZWRfcmVjb3JkcyArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBib2R5ICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0PC9mb3JtPlxcblx0XHRcdFx0XHRcdFx0XHRcIiArIHRyYWNlICsgXCJcXG5cdFx0XHRcdFx0XHRcdDwvZGl2Plxcblxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvZGl2Plxcblx0XHQ8L2Rpdj5cXG5cdDwvYm9keT5cXG5cdDxzY3JpcHQ+XCIgKyBvcGVuRmlsZVNjcmlwdCArIFwiO1wiICsgb25Mb2FkU2NyaXB0ICsgXCI7XCIgKyBzaG93VHJhY2VzU2NyaXB0ICsgXCI8L3NjcmlwdD5cXG48L2h0bWw+XCI7XG4gIHJldHVybiBodG1sO1xufTtcbiIsIlRlbXBsYXRlTWFuYWdlciA9IHt9O1xuXG5mb3JtSWQgPSAnaW5zdGFuY2Vmb3JtJztcblxuXG5UZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUgPSAoKS0+XG5cdHBhZ2VUaXRsZSA9IFwiXCJcIlxuXHRcdHt7aW5zdGFuY2UubmFtZX19XG5cdFwiXCJcIlxuXG5cdHBhZ2VUaXRsZVRyQ2xhc3MgPSBcImluc3RhbmNlLW5hbWVcIlxuXG5cdGlmIENvcmVGb3JtPy5wYWdlVGl0bGVGaWVsZE5hbWVcblx0XHRwYWdlVGl0bGUgPSBcIlwiXCJcblx0XHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9XCIje0NvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XCJcIlwiXG5cdFx0cGFnZVRpdGxlVHJDbGFzcyA9IFwiXCJcblxuXHRpZiBDb3JlRm9ybT8ucGFnZVRpdGxlXG5cdFx0cGFnZVRpdGxlID0gXCJcIlwiXG5cdFx0XHQje0NvcmVGb3JtLnBhZ2VUaXRsZX1cblx0XHRcIlwiXCJcblx0XHRwYWdlVGl0bGVUckNsYXNzID0gXCJcIlxuXG5cdHZhbCA9XG5cdFx0cGFnZVRpdGxlOiBwYWdlVGl0bGVcblx0XHRwYWdlVGl0bGVUckNsYXNzOiBwYWdlVGl0bGVUckNsYXNzXG5cblx0cmV0dXJuIHZhbFxuXG5UZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZSA9IChpbnN0YW5jZSwgX2V4cG9ydCkgLT5cblxuXHR0ZW1wbGF0ZSA9IFwiXCJcIlxuXHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XG5cdFx0PHRhYmxlIGNsYXNzPVwidGFibGUtcGFnZS10aXRsZSBmb3JtLXRhYmxlIG5vLWJvcmRlciB0ZXh0LWFsaWduLWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1wiPlxuXHRcdFx0PHRyIGNsYXNzPVwiI3t0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlVHJDbGFzc31cIj5cblx0XHRcdFx0PHRkIGNsYXNzPVwiaW5zdGFuY2UtdGFibGUtbmFtZS10ZCBwYWdlLXRpdGxlXCI+XG5cdFx0XHRcdFx0I3t0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlfVxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC90cj5cblxuXHRcdDwvdGFibGU+XG5cdFx0PHRhYmxlIGNsYXNzPVwidGFibGUtcGFnZS1ib2R5IGZvcm0tdGFibGVcIj5cblx0XHRcdFx0PHRyIHN0eWxlPVwiaGVpZ2h0OjBweFwiPlxuXHRcdFx0XHRcdDx0aCBzdHlsZT0nd2lkdGg6IDE2JSc+PC90aD5cblx0XHRcdFx0XHQ8dGg+PC90aD5cblx0XHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XG5cdFx0XHRcdFx0PHRoPjwvdGg+XG5cdFx0XHRcdDwvdHI+XG5cdFwiXCJcIjtcblxuXHR0YWJsZV9maWVsZHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRhYmxlX2ZpZWxkcyhpbnN0YW5jZSlcblxuXHR0YWJsZV9maWVsZHMgJiYgdGFibGVfZmllbGRzLmZvckVhY2ggKHRhYmxlX2ZpZWxkKS0+XG5cblx0XHRyZXF1aXJlZCA9IFwiXCJcblx0XHRpZiAhQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSB8fCBDb3JlRm9ybT8ucGFnZVRpdGxlRmllbGROYW1lICE9IHRhYmxlX2ZpZWxkLmNvZGVcblx0XHRcdGlmIHRhYmxlX2ZpZWxkLmlzX3JlcXVpcmVkXG5cdFx0XHRcdHJlcXVpcmVkID0gXCJpcy1yZXF1aXJlZFwiXG5cblx0XHRcdGlmIF9leHBvcnRcblx0XHRcdFx0cmVxdWlyZWQgPSBcIlwiO1xuXG5cdFx0XHRwdXJlQ29kZSA9IFN0ZWVkb3MucmVtb3ZlU3BlY2lhbENoYXJhY3Rlcih0YWJsZV9maWVsZC5jb2RlKTtcblxuXHRcdFx0aWYgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZCh0YWJsZV9maWVsZClcblx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnRcblx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtdGl0bGUgI3tyZXF1aXJlZH1cIj5cblx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIG9waW5pb24tZmllbGQgb3Bpbmlvbi1maWVsZC0je3B1cmVDb2RlfSBhdXRvbWF0aWNcIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5jbHVkZXModGFibGVfZmllbGQudHlwZSwgJ3NlY3Rpb24sdGFibGUnKVxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1jaGlsZGZpZWxkIHRkLWNoaWxkZmllbGQtI3twdXJlQ29kZX1cIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHQgICB7ez4gYWZGb3JtR3JvdXAgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnRcblxuXHRcdFx0XHRcdGlmIF9leHBvcnRcblx0XHRcdFx0XHRcdHRpdGxlX3Blcm1pc3Npb24gPSBcIlwiXG5cdFx0XHRcdFx0XHRmaWVsZF9wZXJtaXNzaW9uID0gXCJcIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRpdGxlX3Blcm1pc3Npb24gPSBcInRpdGxlLVwiICsgdGFibGVfZmllbGQucGVybWlzc2lvblxuXHRcdFx0XHRcdFx0ZmllbGRfcGVybWlzc2lvbiA9IFwiZmllbGQtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uXG5cblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSBcIlwiXCJcblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHRkLXRpdGxlLSN7cHVyZUNvZGV9ICN7dGl0bGVfcGVybWlzc2lvbn0gI3tyZXF1aXJlZH1cIj5cblx0XHRcdFx0XHRcdFx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9XCIje3RhYmxlX2ZpZWxkLmNvZGV9XCJ9fVxuXHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIHRkLWZpZWxkLSN7cHVyZUNvZGV9ICN7ZmllbGRfcGVybWlzc2lvbn1cIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwiIGxhYmVsPWZhbHNlfX1cblx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kXG5cblx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0PC90YWJsZT5cblxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtZm9vdGVyIGZvcm0tdGFibGUgbm8tYm9yZGVyXCI+XG5cdFx0XHQ8dHIgY2xhc3M9XCJhcHBsaWNhbnQtd3JhcHBlclwiPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJub3dyYXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtbGVmdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tfdCBcImluc3RhbmNlX2luaXRpYXRvclwifX3vvJo8L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXRhYmxlLXdyYXBwZXItdGQgaW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0e3s+VGVtcGxhdGUuZHluYW1pYyAgdGVtcGxhdGU9XCJhZlNlbGVjdFVzZXJcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJub3dyYXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdwdWxsLWxlZnQnPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWw+e3tfdCBcImluc3RhbmNlX3N1Ym1pdF9kYXRlXCJ9fe+8mjwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1yaWdodCc+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0e3tmb3JtYXREYXRlIGluc3RhbmNlLnN1Ym1pdF9kYXRlICd7XCJmb3JtYXRcIjpcIllZWVktTU0tRERcIn0nfX1cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90YWJsZT5cblx0PC9kaXY+XG5cdFwiXCJcIlxuXHRyZXR1cm4gdGVtcGxhdGVcblxuI+atpOWkhOaooeadv+WFrOeUqOS4ju+8mmluc3RhbmNlIOe8lui+keOAgeafpeeci+OAgeaJk+WNsOOAgei9rOWPkeaXtueUn+aIkOmZhOS7tuOAgeWPkemAgemCruS7tmJvZHnpg6jliIYodGFibGUg5qih5p2/KVxuI+WmguaenOacieS/ruaUue+8jOivt+a1i+ivleehruiupOWFtuS7luWKn+iDveaYr+WQpuato+W4uOOAglxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZSA9XG5cdGRlZmF1bHQ6IChpbnN0YW5jZSktPlxuXG5cdFx0dGVtcGxhdGUgPSBcIlwiXCJcblx0XHRcdDxkaXYgY2xhc3M9XCJ3aXRoLWJvcmRlciBjb2wtbWQtMTJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlLW5hbWVcIj5cblx0XHRcdFx0XHQ8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj4je1RlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZX08L2gzPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGVscC1ibG9ja1wiPjwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGVscC1ibG9ja1wiPjwvc3Bhbj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0e3sjZWFjaCBzdGVlZG9zX2Zvcm0uZmllbGRzfX1cblx0XHRcdFx0e3sjaWYgaXNPcGluaW9uRmllbGQgdGhpc319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYXV0b21hdGljIG9waW5pb24tZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX08L2xhYmVsPlxuXG5cdFx0XHRcdFx0XHRcdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9dGhpcy5jb2RlfX1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWVsZC17e3RoaXMuY29kZX19XCI+XG5cdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlfX1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svZWFjaH19XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJhcHBsaWNhbnQtd3JhcHBlciBmb3JtLWdyb3VwIGZvcm0taG9yaXpvbnRhbFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cblx0XHRcdFx0XHQgIHt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn19Jm5ic3A7OlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cblx0XHRcdFx0ICA8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcIlwiXCJcblx0XHRyZXR1cm4gdGVtcGxhdGVcblxuXHR0YWJsZTogKGluc3RhbmNlKS0+XG5cdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5oYW5kbGVUYWJsZVRlbXBsYXRlKGluc3RhbmNlKVxuI1x0dGFibGU6ICcnJ1xuI1x0XHQ8dGFibGUgY2xhc3M9XCJib3gtaGVhZGVyICB3aXRoLWJvcmRlclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1wiPlxuI1x0XHRcdDx0ciBjbGFzcz1cImluc3RhbmNlLW5hbWVcIj5cbiNcdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLW5hbWUtdGRcIj5cbiNcdFx0XHRcdFx0PGgzIGNsYXNzPVwiYm94LXRpdGxlXCI+e3tpbnN0YW5jZS5uYW1lfX08L2gzPlxuI1x0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG4jXHRcdFx0XHQ8L3RkPlxuI1x0XHRcdDwvdHI+XG4jICAgICAgICAgICAgPHRyIGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXJcIj5cbiNcdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLXdyYXBwZXItdGRcIj5cbiNcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn19Jm5ic3A7OjwvbGFiZWw+XG4jXHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cbiNcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0PC90cj5cbiMgICAgICAgIDwvdGFibGU+XG4jXHRcdDx0YWJsZSBjbGFzcz1cImZvcm0tdGFibGVcIj5cbiNcdFx0ICAgIHt7I2VhY2ggdGFibGVfZmllbGRzfX1cbiNcdFx0XHRcdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxuI1x0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHt7I2lmIGlzX3JlcXVpcmVkfX1pcy1yZXF1aXJlZHt7L2lmfX1cIj5cbiNcdFx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19XG4jXHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkXCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBzdGVwPShnZXRPcGluaW9uRmllbGRTdGVwTmFtZSB0aGlzKSBkZWZhdWx0PScnfX1cbiNcdFx0XHRcdFx0XHQ8L3RkPlxuI1x0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdHt7ZWxzZX19XG4jXHRcdFx0XHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxuI1x0XHRcdFx0XHRcdHt7e3RyX3N0YXJ0fX19XG4jXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1jaGlsZGZpZWxkXCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHQgICB7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdFx0e3tlbHNlfX1cbiNcdFx0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtdGl0bGUge3sjaWYgaXNfcmVxdWlyZWR9fWlzLXJlcXVpcmVke3svaWZ9fVwiPlxuI1x0XHRcdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT10aGlzLmNvZGV9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIHt7cGVybWlzc2lvbn19XCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XG4jXHRcdFx0XHRcdFx0XHQ8L3RkPlxuI1x0XHRcdFx0XHRcdHt7e3RyX2VuZH19fVxuI1x0XHRcdFx0XHR7ey9pZn19XG4jXHRcdFx0XHR7ey9pZn19XG4jXG4jXHRcdCAgICB7ey9lYWNofX1cbiNcdFx0PC90YWJsZT5cbiNcdCcnJ1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlSGVscHMgPVxuXHRhcHBsaWNhbnRDb250ZXh0OiAtPlxuXHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRkYXRhID0ge1xuXHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0YXR0czoge1xuXHRcdFx0XHRuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRcdGlkOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRcdGNsYXNzOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wnLFxuXHRcdFx0XHRzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHg7d2lkdGg6MTQwcHg7ZGlzcGxheTppbmxpbmUnXG5cdFx0XHR9XG5cdFx0fVxuI1x0XHRpZiBub3Qgc3RlZWRvc19pbnN0YW5jZSB8fCBzdGVlZG9zX2luc3RhbmNlLnN0YXRlICE9IFwiZHJhZnRcIlxuXHRcdGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWVcblx0XHRyZXR1cm4gZGF0YTtcblxuaW5zdGFuY2VJZDogLT5cblx0cmV0dXJuICdpbnN0YW5jZWZvcm0nOyNcImluc3RhbmNlX1wiICsgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpO1xuXG5mb3JtX3R5cGVzOiAtPlxuXHRpZiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRyZXR1cm4gJ2Rpc2FibGVkJztcblx0ZWxzZVxuXHRcdHJldHVybiAnbWV0aG9kJztcblxuc3RlZWRvc19mb3JtOiAtPlxuXHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRpZiBmb3JtX3ZlcnNpb25cblx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uXG5cbmlubmVyc3ViZm9ybUNvbnRleHQ6IChvYmopLT5cblx0ZG9jX3ZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblx0b2JqW1widGFibGVWYWx1ZXNcIl0gPSBpZiBkb2NfdmFsdWVzIHRoZW4gZG9jX3ZhbHVlc1tvYmouY29kZV0gZWxzZSBbXVxuXHRvYmpbXCJmb3JtSWRcIl0gPSBmb3JtSWQ7XG5cdHJldHVybiBvYmo7XG5cbmluc3RhbmNlOiAtPlxuXHRTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpXG5cdGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpXG5cdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuXG5lcXVhbHM6IChhLCBiKSAtPlxuXHRyZXR1cm4gKGEgPT0gYilcblxuaW5jbHVkZXM6IChhLCBiKSAtPlxuXHRyZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuXG5maWVsZHM6IC0+XG5cdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdGlmIGZvcm1fdmVyc2lvblxuXHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG5cbmRvY192YWx1ZXM6IC0+XG5cdFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblxuaW5zdGFuY2VfYm94X3N0eWxlOiAtPlxuXHRib3ggPSBTZXNzaW9uLmdldChcImJveFwiKVxuXHRpZiBib3ggPT0gXCJpbmJveFwiIHx8IGJveCA9PSBcImRyYWZ0XCJcblx0XHRqdWRnZSA9IFNlc3Npb24uZ2V0KFwianVkZ2VcIilcblx0XHRpZiBqdWRnZVxuXHRcdFx0aWYgKGp1ZGdlID09IFwiYXBwcm92ZWRcIilcblx0XHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdFx0ZWxzZSBpZiAoanVkZ2UgPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdGlmIGlucyAmJiBpbnMuZmluYWxfZGVjaXNpb25cblx0XHRpZiBpbnMuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRyZXR1cm4gXCJib3gtc3VjY2Vzc1wiXG5cdFx0ZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09IFwicmVqZWN0ZWRcIilcblx0XHRcdHJldHVybiBcImJveC1kYW5nZXJcIlxuXG5cblRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZSA9IChpbnN0YW5jZSwgdGVtcGxhdGVOYW1lKSAtPlxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG5cblx0aWYgdGVtcGxhdGVOYW1lXG5cdFx0aWYgdGVtcGxhdGVOYW1lID09ICd0YWJsZSdcblx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLmRlZmF1bHQoaW5zdGFuY2UpXG5cblx0aWYgU2Vzc2lvbj8uZ2V0KFwiaW5zdGFuY2VQcmludFwiKVxuXHRcdGlmIGZsb3c/LnByaW50X3RlbXBsYXRlXG5cdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93LnByaW50X3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXHRcdGVsc2Vcblx0XHRcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG5cdFx0XHRcdHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRlbHNlXG5cdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG5cdFx0aWYgZmxvdz8uaW5zdGFuY2VfdGVtcGxhdGVcblx0XHRcdHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiXG5cblx0XHRpZiBmb3JtPy5pbnN0YW5jZV9zdHlsZVxuXHRcdFx0aWYgZm9ybS5pbnN0YW5jZV9zdHlsZSA9PSAndGFibGUnXG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG4jVGVtcGxhdGVNYW5hZ2VyLmV4cG9ydFRlbXBsYXRlID0gKGZsb3dJZCkgLT5cbiNcdHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGZsb3dJZCk7XG4jXG4jXHRmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZsb3coZmxvd0lkKTtcbiNcbiNcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG4jXHRcdHJldHVybiB0ZW1wbGF0ZTtcbiNcbiNcdHJldHVybiB0ZW1wbGF0ZTtcblxuIiwidmFyIGZvcm1JZDsgICAgICAgICAgICAgICAgIFxuXG5UZW1wbGF0ZU1hbmFnZXIgPSB7fTtcblxuZm9ybUlkID0gJ2luc3RhbmNlZm9ybSc7XG5cblRlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGFnZVRpdGxlLCBwYWdlVGl0bGVUckNsYXNzLCB2YWw7XG4gIHBhZ2VUaXRsZSA9IFwie3tpbnN0YW5jZS5uYW1lfX1cIjtcbiAgcGFnZVRpdGxlVHJDbGFzcyA9IFwiaW5zdGFuY2UtbmFtZVwiO1xuICBpZiAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSB7XG4gICAgcGFnZVRpdGxlID0gXCJ7ez4gYWZGb3JtR3JvdXAgbmFtZT1cXFwiXCIgKyBDb3JlRm9ybS5wYWdlVGl0bGVGaWVsZE5hbWUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVwiO1xuICAgIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiO1xuICB9XG4gIGlmICh0eXBlb2YgQ29yZUZvcm0gIT09IFwidW5kZWZpbmVkXCIgJiYgQ29yZUZvcm0gIT09IG51bGwgPyBDb3JlRm9ybS5wYWdlVGl0bGUgOiB2b2lkIDApIHtcbiAgICBwYWdlVGl0bGUgPSBcIlwiICsgQ29yZUZvcm0ucGFnZVRpdGxlO1xuICAgIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiO1xuICB9XG4gIHZhbCA9IHtcbiAgICBwYWdlVGl0bGU6IHBhZ2VUaXRsZSxcbiAgICBwYWdlVGl0bGVUckNsYXNzOiBwYWdlVGl0bGVUckNsYXNzXG4gIH07XG4gIHJldHVybiB2YWw7XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBfZXhwb3J0KSB7XG4gIHZhciB0YWJsZV9maWVsZHMsIHRlbXBsYXRlO1xuICB0ZW1wbGF0ZSA9IFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlxcblx0PHRhYmxlIGNsYXNzPVxcXCJ0YWJsZS1wYWdlLXRpdGxlIGZvcm0tdGFibGUgbm8tYm9yZGVyIHRleHQtYWxpZ24tY2VudGVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1xcXCI+XFxuXHRcdDx0ciBjbGFzcz1cXFwiXCIgKyAodGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZVRyQ2xhc3MpICsgXCJcXFwiPlxcblx0XHRcdDx0ZCBjbGFzcz1cXFwiaW5zdGFuY2UtdGFibGUtbmFtZS10ZCBwYWdlLXRpdGxlXFxcIj5cXG5cdFx0XHRcdFwiICsgKHRoaXMuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGUpICsgXCJcXG5cdFx0XHQ8L3RkPlxcblx0XHQ8L3RyPlxcblxcblx0PC90YWJsZT5cXG5cdDx0YWJsZSBjbGFzcz1cXFwidGFibGUtcGFnZS1ib2R5IGZvcm0tdGFibGVcXFwiPlxcblx0XHRcdDx0ciBzdHlsZT1cXFwiaGVpZ2h0OjBweFxcXCI+XFxuXHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XFxuXHRcdFx0XHQ8dGg+PC90aD5cXG5cdFx0XHRcdDx0aCBzdHlsZT0nd2lkdGg6IDE2JSc+PC90aD5cXG5cdFx0XHRcdDx0aD48L3RoPlxcblx0XHRcdDwvdHI+XCI7XG4gIHRhYmxlX2ZpZWxkcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudGFibGVfZmllbGRzKGluc3RhbmNlKTtcbiAgdGFibGVfZmllbGRzICYmIHRhYmxlX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKHRhYmxlX2ZpZWxkKSB7XG4gICAgdmFyIGZpZWxkX3Blcm1pc3Npb24sIHB1cmVDb2RlLCByZXF1aXJlZCwgdGl0bGVfcGVybWlzc2lvbjtcbiAgICByZXF1aXJlZCA9IFwiXCI7XG4gICAgaWYgKCEodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSB8fCAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSAhPT0gdGFibGVfZmllbGQuY29kZSkge1xuICAgICAgaWYgKHRhYmxlX2ZpZWxkLmlzX3JlcXVpcmVkKSB7XG4gICAgICAgIHJlcXVpcmVkID0gXCJpcy1yZXF1aXJlZFwiO1xuICAgICAgfVxuICAgICAgaWYgKF9leHBvcnQpIHtcbiAgICAgICAgcmVxdWlyZWQgPSBcIlwiO1xuICAgICAgfVxuICAgICAgcHVyZUNvZGUgPSBTdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIodGFibGVfZmllbGQuY29kZSk7XG4gICAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZCh0YWJsZV9maWVsZCkpIHtcbiAgICAgICAgdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnQ7XG4gICAgICAgIHRlbXBsYXRlICs9IFwiPHRkIGNsYXNzPVxcXCJ0ZC10aXRsZSBcIiArIHJlcXVpcmVkICsgXCJcXFwiPlxcblx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIn19XFxuPC90ZD5cXG48dGQgY2xhc3M9XFxcInRkLWZpZWxkIG9waW5pb24tZmllbGQgb3Bpbmlvbi1maWVsZC1cIiArIHB1cmVDb2RlICsgXCIgYXV0b21hdGljXFxcIiBjb2xzcGFuID0gXFxcIlwiICsgdGFibGVfZmllbGQudGRfY29sc3BhbiArIFwiXFxcIj5cXG5cdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIn19XFxuPC90ZD5cIjtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzKHRhYmxlX2ZpZWxkLnR5cGUsICdzZWN0aW9uLHRhYmxlJykpIHtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydDtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtY2hpbGRmaWVsZCB0ZC1jaGlsZGZpZWxkLVwiICsgcHVyZUNvZGUgKyBcIlxcXCIgY29sc3BhbiA9IFxcXCJcIiArIHRhYmxlX2ZpZWxkLnRkX2NvbHNwYW4gKyBcIlxcXCI+XFxuICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIiBsYWJlbD1mYWxzZX19XFxuPC90ZD5cIjtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0O1xuICAgICAgICAgIGlmIChfZXhwb3J0KSB7XG4gICAgICAgICAgICB0aXRsZV9wZXJtaXNzaW9uID0gXCJcIjtcbiAgICAgICAgICAgIGZpZWxkX3Blcm1pc3Npb24gPSBcIlwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZV9wZXJtaXNzaW9uID0gXCJ0aXRsZS1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb247XG4gICAgICAgICAgICBmaWVsZF9wZXJtaXNzaW9uID0gXCJmaWVsZC1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHRlbXBsYXRlICs9IFwiPHRkIGNsYXNzPVxcXCJ0ZC10aXRsZSB0ZC10aXRsZS1cIiArIHB1cmVDb2RlICsgXCIgXCIgKyB0aXRsZV9wZXJtaXNzaW9uICsgXCIgXCIgKyByZXF1aXJlZCArIFwiXFxcIj5cXG5cdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJ0ZC1maWVsZCB0ZC1maWVsZC1cIiArIHB1cmVDb2RlICsgXCIgXCIgKyBmaWVsZF9wZXJtaXNzaW9uICsgXCJcXFwiIGNvbHNwYW4gPSBcXFwiXCIgKyB0YWJsZV9maWVsZC50ZF9jb2xzcGFuICsgXCJcXFwiPlxcblx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIiBsYWJlbD1mYWxzZX19XFxuPC90ZD5cIjtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGVtcGxhdGUgKz0gXCJcdDwvdGFibGU+XFxuXFxuXHQ8dGFibGUgY2xhc3M9XFxcInRhYmxlLXBhZ2UtZm9vdGVyIGZvcm0tdGFibGUgbm8tYm9yZGVyXFxcIj5cXG5cdFx0PHRyIGNsYXNzPVxcXCJhcHBsaWNhbnQtd3JhcHBlclxcXCI+XFxuXHRcdFx0PHRkIGNsYXNzPVxcXCJub3dyYXBcXFwiPlxcblx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7X3QgXFxcImluc3RhbmNlX2luaXRpYXRvclxcXCJ9fe+8mjwvbGFiZWw+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXRhYmxlLXdyYXBwZXItdGQgaW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cXFwiYWZTZWxlY3RVc2VyXFxcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0PC90ZD5cXG5cdFx0XHQ8dGQgY2xhc3M9XFxcIm5vd3JhcFxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdwdWxsLWxlZnQnPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtbGVmdCc+XFxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7X3QgXFxcImluc3RhbmNlX3N1Ym1pdF9kYXRlXFxcIn1977yaPC9sYWJlbD5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1yaWdodCc+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHR7e2Zvcm1hdERhdGUgaW5zdGFuY2Uuc3VibWl0X2RhdGUgJ3tcXFwiZm9ybWF0XFxcIjpcXFwiWVlZWS1NTS1ERFxcXCJ9J319XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0PC90ZD5cXG5cdFx0PC90cj5cXG5cdDwvdGFibGU+XFxuPC9kaXY+XCI7XG4gIHJldHVybiB0ZW1wbGF0ZTtcbn07XG5cblRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUgPSB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgIHZhciB0ZW1wbGF0ZTtcbiAgICB0ZW1wbGF0ZSA9IFwiPGRpdiBjbGFzcz1cXFwid2l0aC1ib3JkZXIgY29sLW1kLTEyXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlLW5hbWVcXFwiPlxcblx0XHQ8aDMgY2xhc3M9XFxcImJveC10aXRsZVxcXCI+XCIgKyAoVGVtcGxhdGVNYW5hZ2VyLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlKSArIFwiPC9oMz5cXG5cdFx0PHNwYW4gY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiPjwvc3Bhbj5cXG5cdDwvZGl2Plxcblx0PHNwYW4gY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiPjwvc3Bhbj5cXG48L2Rpdj5cXG57eyNlYWNoIHN0ZWVkb3NfZm9ybS5maWVsZHN9fVxcblx0e3sjaWYgaXNPcGluaW9uRmllbGQgdGhpc319XFxuXHRcdDxkaXYgY2xhc3M9XFxcInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBhdXRvbWF0aWMgb3Bpbmlvbi1maWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX08L2xhYmVsPlxcblxcblx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgbmFtZT10aGlzLmNvZGV9fVxcblx0XHRcdDwvZGl2Plxcblx0XHQ8L2Rpdj5cXG5cdHt7ZWxzZX19XFxuXHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxcblx0XHRcdDxkaXYgY2xhc3M9XFxcImNvbC1tZC0xMiBmaWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XFxuXHRcdFx0PC9kaXY+XFxuXHRcdHt7ZWxzZX19XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwie3sjaWYgdGhpcy5pc193aWRlfX1jb2wtbWQtMTJ7e2Vsc2V9fWNvbC1tZC02e3svaWZ9fSBmaWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGV9fVxcblx0XHRcdDwvZGl2Plxcblx0XHR7ey9pZn19XFxuXHR7ey9pZn19XFxue3svZWFjaH19XFxuPGRpdiBjbGFzcz1cXFwiY29sLW1kLTEyXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImFwcGxpY2FudC13cmFwcGVyIGZvcm0tZ3JvdXAgZm9ybS1ob3Jpem9udGFsXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXG5cdFx0PGRpdiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb25cXFwiPlxcblx0XHQgIHt7X3QgXFxcImluc3RhbmNlX2luaXRpYXRvclxcXCJ9fSZuYnNwOzpcXG5cdFx0PC9kaXY+XFxuXHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVxcXCJhZlNlbGVjdFVzZXJcXFwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XFxuXHQgIDwvZGl2Plxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9LFxuICB0YWJsZTogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUoaW5zdGFuY2UpO1xuICB9XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlSGVscHMgPSB7XG4gIGFwcGxpY2FudENvbnRleHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXRhLCBzdGVlZG9zX2luc3RhbmNlO1xuICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBkYXRhID0ge1xuICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgYXR0czoge1xuICAgICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIGlkOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIFwiY2xhc3NcIjogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sJyxcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4O3dpZHRoOjE0MHB4O2Rpc3BsYXk6aW5saW5lJ1xuICAgICAgfVxuICAgIH07XG4gICAgZGF0YS5hdHRzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufTtcblxuKHtcbiAgaW5zdGFuY2VJZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdpbnN0YW5jZWZvcm0nO1xuICB9LFxuICBmb3JtX3R5cGVzOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FibGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdtZXRob2QnO1xuICAgIH1cbiAgfSxcbiAgc3RlZWRvc19mb3JtOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbiAgICB9XG4gIH0sXG4gIGlubmVyc3ViZm9ybUNvbnRleHQ6IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBkb2NfdmFsdWVzO1xuICAgIGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgb2JqW1widGFibGVWYWx1ZXNcIl0gPSBkb2NfdmFsdWVzID8gZG9jX3ZhbHVlc1tvYmouY29kZV0gOiBbXTtcbiAgICBvYmpbXCJmb3JtSWRcIl0gPSBmb3JtSWQ7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcbiAgaW5zdGFuY2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGVlZG9zX2luc3RhbmNlO1xuICAgIFNlc3Npb24uZ2V0KFwiY2hhbmdlX2RhdGVcIik7XG4gICAgaWYgKFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSkge1xuICAgICAgc3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgcmV0dXJuIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgfVxuICB9LFxuICBlcXVhbHM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfSxcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuICB9LFxuICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuICAgIH1cbiAgfSxcbiAgZG9jX3ZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgfSxcbiAgaW5zdGFuY2VfYm94X3N0eWxlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm94LCBpbnMsIGp1ZGdlO1xuICAgIGJveCA9IFNlc3Npb24uZ2V0KFwiYm94XCIpO1xuICAgIGlmIChib3ggPT09IFwiaW5ib3hcIiB8fCBib3ggPT09IFwiZHJhZnRcIikge1xuICAgICAganVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpO1xuICAgICAgaWYgKGp1ZGdlKSB7XG4gICAgICAgIGlmIChqdWRnZSA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgICAgfSBlbHNlIGlmIChqdWRnZSA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGlmIChpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uKSB7XG4gICAgICBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5cblRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCB0ZW1wbGF0ZU5hbWUpIHtcbiAgdmFyIGZsb3csIGZvcm07XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGluc3RhbmNlLmZsb3cpO1xuICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcbiAgaWYgKHRlbXBsYXRlTmFtZSkge1xuICAgIGlmICh0ZW1wbGF0ZU5hbWUgPT09ICd0YWJsZScpIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGVbXCJkZWZhdWx0XCJdKGluc3RhbmNlKTtcbiAgfVxuICBpZiAodHlwZW9mIFNlc3Npb24gIT09IFwidW5kZWZpbmVkXCIgJiYgU2Vzc2lvbiAhPT0gbnVsbCA/IFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSA6IHZvaWQgMCkge1xuICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93LnByaW50X3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93LnByaW50X3RlbXBsYXRlICsgXCI8L2Rpdj5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZsb3cgIT0gbnVsbCA/IGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgOiB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIjtcbiAgICB9XG4gICAgaWYgKGZvcm0gIT0gbnVsbCA/IGZvcm0uaW5zdGFuY2Vfc3R5bGUgOiB2b2lkIDApIHtcbiAgICAgIGlmIChmb3JtLmluc3RhbmNlX3N0eWxlID09PSAndGFibGUnKSB7XG4gICAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59O1xuIiwiU3RlZWRvc1RhYmxlID0ge307XG5cblN0ZWVkb3NUYWJsZS5mb3JtSWQgPSBcImluc3RhbmNlZm9ybVwiO1xuXG5TdGVlZG9zVGFibGUuY2hlY2tJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG4gICAgdmFyIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIHZhciBmaWVsZFZhbCA9IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaXRlbV9pbmRleCk7XG5cbiAgICB2YXIgc2ZfbmFtZSA9ICcnO1xuICAgIHZhciByZXYgPSB0cnVlO1xuICAgIGZpZWxkT2JqLnNmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoc2YpIHtcbiAgICAgICAgaWYgKHNmLnBlcm1pc3Npb24gPT0gJ2VkaXRhYmxlJykge1xuICAgICAgICAgICAgc2ZfbmFtZSA9IGZpZWxkT2JqLmNvZGUgKyBcIi5cIiArIHNmLmNvZGU7XG4gICAgICAgICAgICBpZiAoIUluc3RhbmNlTWFuYWdlci5jaGVja0Zvcm1GaWVsZFZhbHVlKCQoXCJbbmFtZT0nXCIgKyBzZl9uYW1lICsgXCInXVwiKVswXSwgc2ZfbmFtZSwgZmllbGRWYWxbc2YuY29kZV0pKSB7XG4gICAgICAgICAgICAgICAgcmV2ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXY7XG59XG5cblN0ZWVkb3NUYWJsZS5zZXRUYWJsZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCwgaXRlbV92YWx1ZSkge1xuXG4gICAgdmFyIHRhYmxlVmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCk7XG4gICAgdGFibGVWYWx1ZVtpdGVtX2luZGV4XSA9IGl0ZW1fdmFsdWU7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCkge1xuICAgIHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZClbaXRlbV9pbmRleF07XG59XG5cblN0ZWVkb3NUYWJsZS5yZW1vdmVUYWJsZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcbiAgICB2YXIgaXRlbV92YWx1ZSA9IFN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZShmaWVsZCwgaXRlbV9pbmRleCk7XG4gICAgaXRlbV92YWx1ZS5yZW1vdmVkID0gdHJ1ZTtcbn1cblxuU3RlZWRvc1RhYmxlLnNldFRhYmxlVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlKSB7XG4gICAgJChcInRhYmxlW25hbWU9J1wiICsgZmllbGQgKyBcIiddXCIpLnZhbCh7XG4gICAgICAgIHZhbDogdmFsdWVcbiAgICB9KTtcbn1cblxuU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICByZXR1cm4gJChcInRhYmxlW25hbWU9J1wiICsgZmllbGQgKyBcIiddXCIpLnZhbCgpLnZhbDtcbn1cblxuU3RlZWRvc1RhYmxlLmdldFZhbGlkVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciB2YWxpZFZhbHVlID0gW107XG5cbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGlmICghdi5yZW1vdmVkKSB7XG4gICAgICAgICAgICB2YWxpZFZhbHVlLnB1c2godik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRWYWx1ZTtcbn1cblxuXG5TdGVlZG9zVGFibGUuaGFuZGxlRGF0YSA9IGZ1bmN0aW9uIChmaWVsZCwgdmFsdWVzKSB7XG5cbiAgICBpZiAoIXZhbHVlcyB8fCAhKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICBmaWVsZE9iai5zZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICAgIGlmIChmLnR5cGUgPT0gJ3VzZXInIHx8IGYudHlwZSA9PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdltmLmNvZGVdXG4gICAgICAgICAgICAgICAgaWYgKGYuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mICh2YWx1ZVswXSkgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbZi5jb2RlXSA9IHZbZi5jb2RlXS5nZXRQcm9wZXJ0eShcImlkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUpID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2W2YuY29kZV0gPSB2W2YuY29kZV0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGYudHlwZSA9PSAnZGF0ZVRpbWUnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdltmLmNvZGVdXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQwID0gdFswXS5zcGxpdChcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0MFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0gdDFbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSwgaG91cnMsIHNlY29uZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdltmLmNvZGVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cblxuU3RlZWRvc1RhYmxlLmdldEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIGluc3RhbmNlRmllbGRzID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmllbGRzKCk7XG4gICAgaWYgKCFpbnN0YW5jZUZpZWxkcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGZpZWxkT2JqID0gaW5zdGFuY2VGaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgZmllbGQpO1xuXG4gICAgcmV0dXJuIGZpZWxkT2JqO1xufVxuXG5cblN0ZWVkb3NUYWJsZS5nZXRNb2RhbERhdGEgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG5cbiAgICB2YXIgZGF0YSA9IHt9O1xuXG4gICAgdmFyIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIGlmICghZmllbGRPYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRhdGEuZmllbGQgPSBmaWVsZE9iajtcblxuICAgIGRhdGEuZmllbGQuZm9ybXVsYSA9IEZvcm1fZm9ybXVsYS5nZXRGb3JtdWxhRmllbGRWYXJpYWJsZShcIkZvcm1fZm9ybXVsYS5maWVsZF92YWx1ZXNcIiwgZmllbGRPYmouc2ZpZWxkcyk7XG5cbiAgICBkYXRhLnZhbHVlID0ge307XG5cbiAgICBkYXRhLnZhbHVlW2ZpZWxkXSA9IFN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZShmaWVsZCwgaW5kZXgpO1xuXG4gICAgZGF0YS5pbmRleCA9IGluZGV4O1xuXG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuXG5TdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcblxuICAgIGlmICghQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcInN0ZWVkb3NfdGFibGVfbW9kYWxfXCIgKyBmaWVsZCArIFwiX1wiICsgaXRlbV9pbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBBdXRvRm9ybS5nZXRGb3JtVmFsdWVzKFwic3RlZWRvc190YWJsZV9tb2RhbF9cIiArIGZpZWxkICsgXCJfXCIgKyBpdGVtX2luZGV4KS5pbnNlcnREb2NbZmllbGRdO1xuICAgIHJldHVybiBpdGVtX3ZhbHVlO1xufVxuXG5cblN0ZWVkb3NUYWJsZS5hZGRJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgX2l0ZW1fdmFsdWUpIHtcbiAgICB2YXIga2V5cyA9IFN0ZWVkb3NUYWJsZS5nZXRLZXlzKGZpZWxkKTtcbiAgICB2YXIgaXRlbV92YWx1ZSA9IF9pdGVtX3ZhbHVlIHx8IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaW5kZXgpO1xuICAgICQoXCJ0Ym9keVtuYW1lPSdcIiArIGZpZWxkICsgXCJUYm9keSddXCIpLmFwcGVuZChTdGVlZG9zVGFibGUuZ2V0VHIoa2V5cywgaXRlbV92YWx1ZSwgaW5kZXgsIGZpZWxkLCB0cnVlKSlcblxufVxuXG5TdGVlZG9zVGFibGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIF9pdGVtX3ZhbHVlKSB7XG5cbiAgICB2YXIgaXRlbSA9ICQoXCJ0cltuYW1lPSdcIiArIGZpZWxkICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInXVwiKTtcblxuICAgIHZhciBpdGVtX3ZhbHVlID0gX2l0ZW1fdmFsdWUgfHwgU3RlZWRvc1RhYmxlLmdldEl0ZW1Nb2RhbFZhbHVlKGZpZWxkLCBpbmRleCk7XG5cbiAgICBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgICAgIHZhciB0ZHMgPSBTdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQoZmllbGQsIGluZGV4KTtcblxuICAgICAgICB2YXIgc2ZpZWxkcyA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCkuc2ZpZWxkcztcblxuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHNmaWVsZCA9IHNmaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwga2V5KTtcblxuICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlbV92YWx1ZVtrZXldO1xuXG4gICAgICAgICAgICB0ZHMgPSB0ZHMgKyBTdGVlZG9zVGFibGUuZ2V0VGQoc2ZpZWxkLCBpbmRleCwgdmFsdWUpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW0uZW1wdHkoKTtcblxuICAgICAgICBpdGVtLmFwcGVuZCh0ZHMpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICBTdGVlZG9zVGFibGUuYWRkSXRlbShmaWVsZCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCkpIHtcblxuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGluZGV4LCBpdGVtX3ZhbHVlKTtcblxuICAgICAgICAvL1N0ZWVkb3NUYWJsZS52YWx1ZUhhc2hbZmllbGRdW2luZGV4XSA9IGl0ZW1fdmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvL1N0ZWVkb3NUYWJsZS52YWx1ZUhhc2hbZmllbGRdID0gW2l0ZW1fdmFsdWVdO1xuXG4gICAgICAgIFN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlKGZpZWxkLCBbaXRlbV92YWx1ZV0pXG5cbiAgICB9XG5cbiAgICAvL+aJp+ihjOS4u+ihqOWFrOW8j+iuoeeul1xuICAgIEluc3RhbmNlTWFuYWdlci5ydW5Gb3JtdWxhKGZpZWxkKTtcblxufVxuXG5TdGVlZG9zVGFibGUucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgpIHtcblxuICAgICQoXCJ0cltuYW1lPSdcIiArIGZpZWxkICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInXVwiKS5oaWRlKCk7XG5cbiAgICBTdGVlZG9zVGFibGUucmVtb3ZlVGFibGVJdGVtKGZpZWxkLCBpbmRleCk7XG5cbiAgICBJbnN0YW5jZU1hbmFnZXIucnVuRm9ybXVsYShmaWVsZCk7XG59XG5cblN0ZWVkb3NUYWJsZS5zaG93TW9kYWwgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4LCBtZXRob2QpIHtcblxuXG4gICAgdmFyIG1vZGFsRGF0YSA9IFN0ZWVkb3NUYWJsZS5nZXRNb2RhbERhdGEoZmllbGQsIGluZGV4KTtcblxuICAgIG1vZGFsRGF0YS5tZXRob2QgPSBtZXRob2Q7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICBNb2RhbC5zaG93KFwic3RlZWRvc1RhYmxlTW9kYWxcIiwgbW9kYWxEYXRhKTtcbiAgICB9LCAzMDApXG59XG5cblN0ZWVkb3NUYWJsZS5nZXRLZXlzID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgaWYgKCFBdXRvRm9ybS5nZXRDdXJyZW50RGF0YUZvckZvcm0oU3RlZWRvc1RhYmxlLmZvcm1JZCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBzcyA9IEF1dG9Gb3JtLmdldEZvcm1TY2hlbWEoU3RlZWRvc1RhYmxlLmZvcm1JZCk7XG5cbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgaWYgKHNzLnNjaGVtYShmaWVsZCArIFwiLiRcIikudHlwZSA9PT0gT2JqZWN0KSB7XG4gICAgICAgIGtleXMgPSBzcy5vYmplY3RLZXlzKFNpbXBsZVNjaGVtYS5fbWFrZUdlbmVyaWMoZmllbGQpICsgJy4kJylcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5cztcblxufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGhlYWQgPSBmdW5jdGlvbiAoZmllbGQsIGVkaXRhYmxlKSB7XG5cbiAgICB2YXIgZmllbGRPYmogPSBmaWVsZDtcbiAgICBpZiAoIV8uaXNPYmplY3QoZmllbGQpKVxuICAgICAgICBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICBpZiAoIWZpZWxkT2JqKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgdGhlYWQgPSAnJyxcbiAgICAgICAgdHJzID0gJycsXG4gICAgICAgIGxhYmVsID0gJycsXG4gICAgICAgIHdpZHRoID0gMTAwO1xuXG4gICAgaWYgKGVkaXRhYmxlKSB7XG4gICAgICAgIC8vIHRycyA9IFwiPHRoIGNsYXNzPSdyZW1vdmVkJz48L3RoPlwiXG4gICAgICAgIHRycyA9IFwiXCJcbiAgICB9XG5cbiAgICB2YXIgc2ZpZWxkcyA9IGZpZWxkT2JqLnNmaWVsZHM7XG5cbiAgICBpZiAoIXNmaWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoZWFkO1xuICAgIH1cblxuICAgIHZhciBzZl9sZW5ndGggPSBzZmllbGRzLmxlbmd0aDtcblxuICAgIGlmIChzZl9sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB3aWRlX2ZpZWxkcyA9IHNmaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc193aWRlXCIsIHRydWUpO1xuXG4gICAgICAgIHdpZHRoID0gMTAwIC8gKHNmX2xlbmd0aCArIHdpZGVfZmllbGRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgc2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChzZiwgaW5kZXgpIHtcblxuICAgICAgICBsYWJlbCA9IChzZi5uYW1lICE9IG51bGwgJiYgc2YubmFtZS5sZW5ndGggPiAwKSA/IHNmLm5hbWUgOiBzZi5jb2RlO1xuXG4gICAgICAgIHRycyA9IHRycyArIFwiPHRkIFwiOyAvLyBub3dyYXA9J25vd3JhcCdcblxuICAgICAgICB0cnMgPSB0cnMgKyBcIiBjbGFzcz0ndGl0bGUgXCIgKyBzZi50eXBlICsgXCInXCI7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IChzZl9sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgaWYgKHNmLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgICB0cnMgPSB0cnMgKyBcInN0eWxlPSd3aWR0aDpcIiArIHdpZHRoICogMiArIFwiJSdcIlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnMgPSB0cnMgKyBcInN0eWxlPSd3aWR0aDpcIiArIHdpZHRoICsgXCIlJ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnMgPSB0cnMgKyBcIj5cIiArIGxhYmVsICsgXCI8L3RkPlwiXG4gICAgfSk7XG5cbiAgICB0aGVhZCA9ICc8dHI+JyArIHRycyArICc8L3RyPic7XG5cbiAgICByZXR1cm4gdGhlYWQ7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYm9keSA9IGZ1bmN0aW9uIChrZXlzLCBmaWVsZCwgdmFsdWVzLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSB7XG4gICAgdmFyIHRib2R5ID0gXCJcIjtcblxuICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICB0Ym9keSA9IHRib2R5ICsgU3RlZWRvc1RhYmxlLmdldFRyKGtleXMsIHZhbHVlLCBpbmRleCwgZmllbGQsIGVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGJvZHk7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUciA9IGZ1bmN0aW9uIChrZXlzLCBpdGVtX3ZhbHVlLCBpbmRleCwgZmllbGQsIGVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpIHtcblxuICAgIHZhciBmaWVsZE9iaiA9IGZpZWxkO1xuICAgIGlmICghXy5pc09iamVjdChmaWVsZCkpXG4gICAgICAgIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIHZhciB0ciA9IFwiPHRyIGlkPSdcIiArIGZpZWxkT2JqLmNvZGUgKyBcIl9pdGVtX1wiICsgaW5kZXggKyBcIicgbmFtZT0nXCIgKyBmaWVsZE9iai5jb2RlICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInIGRhdGEtaW5kZXg9J1wiICsgaW5kZXggKyBcIidcIlxuXG4gICAgaWYgKGVkaXRhYmxlIHx8IHNmaWVsZHNFZGl0YWJsZSkge1xuICAgICAgICB0ciA9IHRyICsgXCInIGNsYXNzPSdpdGVtIGVkaXQnXCJcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICB0ciA9IHRyICsgXCIgY2xhc3M9J2l0ZW0gaXRlbS1yZWFkb25seSdcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHIgPSB0ciArIFwiIGNsYXNzPSdpdGVtICdcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1fdmFsdWUucmVtb3ZlZCkge1xuICAgICAgICB0ciA9IHRyICsgXCIgc3R5bGU9J2Rpc3BsYXk6bm9uZScgXCI7XG4gICAgfVxuXG4gICAgdHIgPSB0ciArIFwiJz5cIjtcblxuICAgIHZhciB0ZHMgPSBcIlwiO1xuXG4gICAgaWYgKGVkaXRhYmxlKSB7XG4gICAgICAgIHRkcyA9IFN0ZWVkb3NUYWJsZS5nZXRSZW1vdmVUZChmaWVsZE9iai5jb2RlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgdmFyIHNmaWVsZHMgPSBmaWVsZE9iai5zZmllbGRzO1xuXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHNmaWVsZCA9IHNmaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwga2V5KTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtX3ZhbHVlW2tleV07XG5cbiAgICAgICAgdGRzID0gdGRzICsgU3RlZWRvc1RhYmxlLmdldFRkKHNmaWVsZCwgaW5kZXgsIHZhbHVlKTtcblxuICAgIH0pO1xuXG4gICAgdHIgPSB0ciArIHRkcyArIFwiPC90cj5cIjtcbiAgICByZXR1cm4gdHI7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRSZW1vdmVUZCA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgpIHtcbiAgICAvLyByZXR1cm4gXCI8dGQgY2xhc3M9J3N0ZWVkb3NUYWJsZS1pdGVtLXJlbW92ZSByZW1vdmVkJyBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInPjxpIGNsYXNzPSdmYSBmYS10aW1lcycgYXJpYS1oaWRkZW49J3RydWUnPjwvdGQ+XCI7XG4gICAgcmV0dXJuIFwiXCJcbn1cblxuU3RlZWRvc1RhYmxlLmdldFRkID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgdmFsdWUpIHtcbiAgICB2YXIgdGQgPSBcIjx0ZCBcIjtcblxuICAgIHRkID0gdGQgKyBcIiBjbGFzcz0nc3RlZWRvc1RhYmxlLWl0ZW0tZmllbGQgXCIgKyBmaWVsZC50eXBlICsgXCInIFwiO1xuXG4gICAgdmFyIHRkX3ZhbHVlID0gXCJcIjtcblxuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgdGRfdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VERWYWx1ZShmaWVsZCwgdmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXG4gICAgICAgIHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXRcblxuICAgICAgICB0ZF92YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSh2YWx1ZSwgZmllbGQsIGxvY2FsZSwgdXRjT2Zmc2V0KVxuICAgIH1cblxuICAgIHRkID0gdGQgKyBcIiBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInPlwiICsgdGRfdmFsdWUgKyBcIjwvdGQ+XCJcblxuICAgIHJldHVybiB0ZDtcbn1cblxuXG5TdGVlZG9zVGFibGUuZ2V0VERWYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgdmFsdWUpIHtcbiAgICB2YXIgdGRfdmFsdWUgPSBcIlwiO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRkX3ZhbHVlXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHZhciBmaWVsZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgaWYoW1wic2VsZWN0XCIsIFwibXVsdGlTZWxlY3RcIiwgXCJyYWRpb1wiXS5pbmRleE9mKGZpZWxkLnR5cGUpID4gLTEpe1xuICAgICAgICAgICAgZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mICh2YWx1ZVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFTcGFjZVVzZXJzKHZhbHVlKS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFTcGFjZVVzZXJzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHUgPyB1Lm5hbWUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mICh2YWx1ZVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFPcmdhbml6YXRpb25zKHZhbHVlKS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFPcmdhbml6YXRpb24odmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gbyA/IG8ubmFtZSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlID8gXCI8YSBocmVmPSdtYWlsdG86XCIgKyB2YWx1ZSArIFwiJz5cIiArIHZhbHVlICsgXCI8L2E+XCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBcIjxhIGhyZWY9J1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPScnIHRhcmdldD0nX2JsYW5rJz5cIiArIHZhbHVlICsgXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPSdodHRwOi8vXCIgKyBlbmNvZGVVUkkodmFsdWUpICsgXCInIHRhcmdldD0nX2JsYW5rJz5odHRwOi8vXCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9ICcqKioqKionO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSAkLmZvcm1hdC5kYXRlKHZhbHVlLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2YWx1ZS5zcGxpdChcIlRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gdDBbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IHQwWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnMgPSB0MVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgPSB0MVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gJC5mb3JtYXQuZGF0ZSh2YWx1ZSwgJ3l5eXktTU0tZGQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZTsgfSlcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlOyB9KVxuICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkT3B0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgICAgICAgICAgICB2YXIgc3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcihmdW5jdGlvbihpdGVtKXsgcmV0dXJuIHNwbGl0ZWRWYWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+IC0xOyB9KTtcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBzZWxlY3RlZE9wdGlvbnMubWFwKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS5sYWJlbDsgfSkuam9pbihcIixcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfcGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvUGVyY2VudFN0cmluZyh2YWx1ZSwgZmllbGQuZGlnaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1N0cmluZyh2YWx1ZSwgZmllbGQuZGlnaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29kYXRhJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlWydAbGFiZWwnXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICBjYXNlICdsb29rdXAnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWUsIGZpZWxkKTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlID8gdmFsdWUgOiAnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZTtcblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0ZF92YWx1ZTtcbn07XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBBdXRvRm9ybS5hZGRJbnB1dFR5cGUoXCJ0YWJsZVwiLCB7XG4gICAgICAgIHRlbXBsYXRlOiBcImFmVGFibGVcIixcbiAgICAgICAgdmFsdWVPdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5kYXRhKFwic2NoZW1hS2V5XCIpO1xuICAgICAgICAgICAgcmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRWYWxpZFZhbHVlKG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZUNvbnZlcnRlcnM6IHtcbiAgICAgICAgICAgIFwic3RyaW5nQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvU3RyaW5nQXJyYXksXG4gICAgICAgICAgICBcIm51bWJlclwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9OdW1iZXIsXG4gICAgICAgICAgICBcIm51bWVyQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvTnVtYmVyQXJyYXksXG4gICAgICAgICAgICBcImJvb2xlYW5cIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvQm9vbGVhbixcbiAgICAgICAgICAgIFwiYm9vbGVhbkFycmF5XCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb0Jvb2xlYW5BcnJheSxcbiAgICAgICAgICAgIFwiZGF0ZVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9EYXRlLFxuICAgICAgICAgICAgXCJkYXRlQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvRGF0ZUFycmF5XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHRBZGp1c3Q6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQuYXR0cy5tYXhsZW5ndGggPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb250ZXh0Lm1heCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHMubWF4bGVuZ3RoID0gY29udGV4dC5tYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuYWZUYWJsZS5ldmVudHMoe1xuICAgICAgICAndGFwIC5zdGVlZG9zLXRhYmxlIC5zdGVlZG9zVGFibGUtaXRlbS1hZGQsLmFkZC1pdGVtLXRyJzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSB0ZW1wbGF0ZS5kYXRhLm5hbWU7XG5cbiAgICAgICAgICAgIHZhciB0YWJsZVZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUobmFtZSk7XG5cbiAgICAgICAgICAgIHZhciBuZXdfaXRlbV9pbmRleCA9IHRhYmxlVmFsdWUgPyB0YWJsZVZhbHVlLmxlbmd0aCA6IDA7XG5cbiAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5zaG93TW9kYWwobmFtZSwgbmV3X2l0ZW1faW5kZXgsIFwiYWRkXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLnN0ZWVkb3NUYWJsZS1pdGVtLWZpZWxkJzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmRhdGEuYXR0cy5lZGl0YWJsZSB8fCB0ZW1wbGF0ZS5kYXRhLmF0dHMuc2ZpZWxkc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICAgICAgICAgICAgICBTdGVlZG9zVGFibGUuc2hvd01vZGFsKGZpZWxkLCBpbmRleCwgXCJlZGl0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLnN0ZWVkb3NUYWJsZS1pdGVtLXJlbW92ZSc6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRlbXBsYXRlLmRhdGEubmFtZTtcbiAgICAgICAgICAgIHZhciBpdGVtX2luZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgU2Vzc2lvbi5zZXQoXCJpbnN0YW5jZV9jaGFuZ2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBTdGVlZG9zVGFibGUucmVtb3ZlSXRlbShmaWVsZCwgaXRlbV9pbmRleCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3RhcCAuc3RlZWRvcy10YWJsZSAuaXRlbS1yZWFkb25seSc6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGVtcGxhdGUuZGF0YS5hdHRzLmVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICAgICAgICAgICAgICBTdGVlZG9zVGFibGUuc2hvd01vZGFsKGZpZWxkLCBpbmRleCwgXCJyZWFkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cblxuXG4gICAgVGVtcGxhdGUuYWZUYWJsZS5yZW5kZXJlZCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmRhdGEubmFtZTtcblxuICAgICAgICB2YXIgc2ZpZWxkc0VkaXRhYmxlID0gdGhpcy5kYXRhLmF0dHMuc2ZpZWxkc0VkaXRhYmxlO1xuXG4gICAgICAgIHZhciBrZXlzID0gU3RlZWRvc1RhYmxlLmdldEtleXMoZmllbGQpO1xuICAgICAgICB2YXIgdmFsaWRWYWx1ZSA9IFN0ZWVkb3NUYWJsZS5oYW5kbGVEYXRhKGZpZWxkLCB0aGlzLmRhdGEudmFsdWUpO1xuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVWYWx1ZShmaWVsZCwgdmFsaWRWYWx1ZSk7XG5cbiAgICAgICAgJChcInRoZWFkW25hbWU9J1wiICsgZmllbGQgKyBcIlRoZWFkJ11cIikuaHRtbChTdGVlZG9zVGFibGUuZ2V0VGhlYWQoZmllbGQsIHRoaXMuZGF0YS5hdHRzLmVkaXRhYmxlKSk7XG5cbiAgICAgICAgJChcInRib2R5W25hbWU9J1wiICsgZmllbGQgKyBcIlRib2R5J11cIikuaHRtbChTdGVlZG9zVGFibGUuZ2V0VGJvZHkoa2V5cywgZmllbGQsIFN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlKGZpZWxkKSwgdGhpcy5kYXRhLmF0dHMuZWRpdGFibGUsIHNmaWVsZHNFZGl0YWJsZSkpO1xuXG4gICAgICAgIHN0ciA9IHQoXCJzdGVlZG9zX3RhYmxlX2FkZF9pdGVtXCIpO1xuICAgICAgICBhZGRJdGVtVHIgPSBcIjx0ciBjbGFzcz0nYWRkLWl0ZW0tdHInPjx0ZCBjb2xzcGFuPSdcIiArIGtleXMubGVuZ3RoICsgXCInPjxpIGNsYXNzPSdpb24gaW9uLXBsdXMtcm91bmQnPjwvaT5cIiArIHN0ciArIFwiPC90ZD48L3RyPlwiO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEuYXR0cy5lZGl0YWJsZSkge1xuICAgICAgICAgICAgJChcInRmb290W25hbWU9J1wiICsgZmllbGQgKyBcIlRmb290J11cIikuYXBwZW5kKGFkZEl0ZW1Ucik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgICAgICBpZiAoYy5zdGVwX3R5cGUgPT0gJ2NvdW50ZXJTaWduJyB8fCBJbnN0YW5jZU1hbmFnZXIuY2NIYXNFZGl0UGVybWlzc2lvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9ydW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gVGVtcGxhdGUuY3VycmVudERhdGEoKTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkVmFsdWUgPSBTdGVlZG9zVGFibGUuaGFuZGxlRGF0YShmaWVsZCwgZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnNldFRhYmxlVmFsdWUoZmllbGQsIHZhbGlkVmFsdWUpO1xuICAgICAgICAgICAgICAgICQoXCJ0Ym9keVtuYW1lPSdcIiArIGZpZWxkICsgXCJUYm9keSddXCIpLmh0bWwoU3RlZWRvc1RhYmxlLmdldFRib2R5KGtleXMsIGZpZWxkLCBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCksIGRhdGEuYXR0cy5lZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICB9O1xufSIsIkltYWdlU2lnbi5oZWxwZXJzID1cblx0c3BhY2VVc2VyU2lnbjogKHVzZXJJZCktPlxuXHRcdHNwYWNlID0gXCJcIlxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRzcGFjZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zcGFjZVxuXHRcdGVsc2Vcblx0XHRcdHNwYWNlID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cblx0XHRzcGFjZVVzZXJTaWduID0gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kT25lKHtzcGFjZTogc3BhY2UsIHVzZXI6IHVzZXJJZH0pO1xuXHRcdHJldHVybiBzcGFjZVVzZXJTaWduXG5cblx0aW1hZ2VVUkw6ICh1c2VySWQpLT5cblxuXHRcdHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKHVzZXJJZCk7XG5cblx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGFic29sdXRlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmFic29sdXRlXG5cblx0XHRpZiBzcGFjZVVzZXJTaWduPy5zaWduXG5cdFx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0XHRyZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgc3BhY2VVc2VyU2lnbi5zaWduKTtcbiIsIkltYWdlU2lnbi5oZWxwZXJzID0ge1xuICBzcGFjZVVzZXJTaWduOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgc3BhY2UsIHNwYWNlVXNlclNpZ247XG4gICAgc3BhY2UgPSBcIlwiO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHNwYWNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnNwYWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFjZSA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgc3BhY2VVc2VyU2lnbiA9IGRiLnNwYWNlX3VzZXJfc2lnbnMuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2UsXG4gICAgICB1c2VyOiB1c2VySWRcbiAgICB9KTtcbiAgICByZXR1cm4gc3BhY2VVc2VyU2lnbjtcbiAgfSxcbiAgaW1hZ2VVUkw6IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgIHZhciBhYnNvbHV0ZSwgc3BhY2VVc2VyU2lnbjtcbiAgICBzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbih1c2VySWQpO1xuICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgYWJzb2x1dGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuYWJzb2x1dGU7XG4gICAgfVxuICAgIGlmIChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApIHtcbiAgICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcGkvZmlsZXMvYXZhdGFycy9cIiArIHNwYWNlVXNlclNpZ24uc2lnbik7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiVHJhY2VzSGFuZGxlci5oZWxwZXJzID1cblx0c2hvd1NpZ25JbWFnZTogKGhhbmRsZXIsIGlzX2ZpbmlzaGVkLCBqdWRnZSwgdHJhY2VTaG93U2lnbkltYWdlKSAtPlxuXHRcdGlmIHRyYWNlU2hvd1NpZ25JbWFnZSA9PSBmYWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgIWlzX2ZpbmlzaGVkXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRpZiBbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKVxuXG5cdFx0aWYgc3BhY2VVc2VyU2lnbj8uc2lnblxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRvYmplY3RVcmw6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpLT5cblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSIsIlRyYWNlc0hhbmRsZXIuaGVscGVycyA9IHtcbiAgc2hvd1NpZ25JbWFnZTogZnVuY3Rpb24oaGFuZGxlciwgaXNfZmluaXNoZWQsIGp1ZGdlLCB0cmFjZVNob3dTaWduSW1hZ2UpIHtcbiAgICB2YXIgc3BhY2VVc2VyU2lnbjtcbiAgICBpZiAodHJhY2VTaG93U2lnbkltYWdlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWlzX2ZpbmlzaGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKGhhbmRsZXIpO1xuICAgIGlmIChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBvYmplY3RVcmw6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpO1xuICB9XG59O1xuIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyA9XG5cdGFwcGxpY2FudENvbnRleHQ6IC0+XG5cdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGRhdGEgPSB7XG5cdFx0XHRuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRhdHRzOiB7bmFtZTogJ2luc19hcHBsaWNhbnQnLCBpZDogJ2luc19hcHBsaWNhbnQnLCBjbGFzczogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnfSxcblx0XHRcdHZhbHVlOiBzdGVlZG9zX2luc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cdFx0fVxuXHRcdGlmIG5vdCBzdGVlZG9zX2luc3RhbmNlIHx8IHN0ZWVkb3NfaW5zdGFuY2Uuc3RhdGUgIT0gXCJkcmFmdFwiXG5cdFx0XHRkYXRhLmF0dHMuZGlzYWJsZWQgPSB0cnVlXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0aW5zdGFuY2VJZDogLT5cblx0XHRyZXR1cm4gJ2luc3RhbmNlZm9ybSc7I1wiaW5zdGFuY2VfXCIgKyBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIik7XG5cblx0Zm9ybV90eXBlczogLT5cblx0XHRpZiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRcdHJldHVybiAnZGlzYWJsZWQnO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnbWV0aG9kJztcblxuXHRzdGVlZG9zX2Zvcm06IC0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBmb3JtX3ZlcnNpb25cblxuXHRpbm5lcnN1YmZvcm1Db250ZXh0OiAob2JqKS0+XG5cdFx0ZG9jX3ZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblx0XHRvYmpbXCJ0YWJsZVZhbHVlc1wiXSA9IGlmIGRvY192YWx1ZXMgdGhlbiBkb2NfdmFsdWVzW29iai5jb2RlXSBlbHNlIFtdXG5cdFx0b2JqW1wiZm9ybUlkXCJdID0gXCJpbnN0YW5jZWZvcm1cIjtcblx0XHRyZXR1cm4gb2JqO1xuXG5cdGluc3RhbmNlOiAtPlxuXHRcdFNlc3Npb24uZ2V0KFwiY2hhbmdlX2RhdGVcIilcblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKVxuXHRcdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0cmV0dXJuIHN0ZWVkb3NfaW5zdGFuY2U7XG5cblx0ZW1wdHk6ICh2YWwpIC0+XG5cdFx0aWYgdmFsXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR1bmVtcHR5OiAodmFsKSAtPlxuXHRcdGlmIHZhbFxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdGVxdWFsczogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIChhID09IGIpXG5cblx0dW5lcXVhbHM6IChhLCBiKSAtPlxuXHRcdHJldHVybiAhKGEgPT0gYilcblxuXHRpbmNsdWRlczogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcblxuXHRpbmNsdWRlOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuXG5cdGZpZWxkczogLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcblxuXHRmb3JtYXREYXRlOiAoZGF0ZSwgb3B0aW9ucyktPlxuXHRcdGlmICFkYXRlXG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRpZiBvcHRpb25zICYmIHR5cGVvZihvcHRpb25zKSA9PSAnc3RyaW5nJ1xuXHRcdFx0b3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9ucyk7XG5cblx0XHRpZiAhb3B0aW9ucy5mb3JtYXRcblx0XHRcdG9wdGlvbnMgPSB7Zm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW1cIn1cblxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcblxuXHR0cmFjZXM6IC0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRzdGVlZG9zRGF0YSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/LnZpZXc/LnRlbXBsYXRlPy5zdGVlZG9zRGF0YVxuXHRcdFx0aW5zdGFuY2UgPSBzdGVlZG9zRGF0YT8uaW5zdGFuY2Vcblx0XHRcdGZsb3cgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24oaW5zdGFuY2UpO1xuXHRcdFx0bG9jYWxlID0gc3RlZWRvc0RhdGE/LmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0XHRmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmxvd1ZlcnNpb24oKVxuXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cblx0XHRpZiAhaW5zdGFuY2UgfHwgIWZsb3dcblx0XHRcdHJldHVybiB7fTtcblxuXHRcdHN0ZXBzID0gZmxvdy5zdGVwcztcblxuXHRcdHRyYWNlcyA9IHt9O1xuXG5cdFx0aW5zdGFuY2UudHJhY2VzPy5mb3JFYWNoICh0cmFjZSktPlxuXHRcdFx0c3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdHJhY2Uuc3RlcClcblxuXHRcdFx0YXBwcm92ZXMgPSBbXVxuXG5cdFx0XHR0cmFjZS5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSkgLT5cblx0XHRcdFx0aWYgdHJhY2UuaXNfZmluaXNoZWQgPT0gdHJ1ZVxuIyDlt7Lnu5PmnZ/nmoTmmL7npLrkuLrmoLjlh4Yv6amz5ZueL+WPlua2iOeUs+ivt1xuXHRcdFx0XHRcdGlmIGFwcHJvdmUuanVkZ2UgPT0gJ2FwcHJvdmVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAncmVqZWN0ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlamVjdGVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSB0ZXJtaW5hdGVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICdyZWFzc2lnbmVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICdyZWxvY2F0ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlbG9jYXRlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAnJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFwiXCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gXCJcIlxuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHBlbmRpbmdcIiwge30sIGxvY2FsZSlcblxuXHRcdFx0XHRhcHByb3Zlcy5wdXNoXG5cdFx0XHRcdFx0X2lkOiBhcHByb3ZlLl9pZFxuXHRcdFx0XHRcdGhhbmRsZXI6IGFwcHJvdmUudXNlclxuXHRcdFx0XHRcdGhhbmRsZXJfbmFtZTogYXBwcm92ZS5oYW5kbGVyX25hbWVcblx0XHRcdFx0XHRoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lOiBhcHByb3ZlLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWVcblx0XHRcdFx0XHRoYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZTogYXBwcm92ZS5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZVxuXHRcdFx0XHRcdGZpbmlzaF9kYXRlOiBhcHByb3ZlLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0anVkZ2U6IGFwcHJvdmUuanVkZ2Vcblx0XHRcdFx0XHRqdWRnZV9uYW1lOiBqdWRnZV9uYW1lXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGFwcHJvdmUuZGVzY3JpcHRpb25cblx0XHRcdFx0XHRpc19maW5pc2hlZDogYXBwcm92ZS5pc19maW5pc2hlZFxuXHRcdFx0XHRcdHR5cGU6IGFwcHJvdmUudHlwZVxuXHRcdFx0XHRcdG9waW5pb25fZmllbGRzX2NvZGU6IGFwcHJvdmUub3Bpbmlvbl9maWVsZHNfY29kZVxuXHRcdFx0XHRcdHNpZ25fZmllbGRfY29kZTogYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGVcblx0XHRcdFx0XHRpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWRcblx0XHRcdFx0XHRzaWduX3Nob3c6IGFwcHJvdmUuc2lnbl9zaG93XG5cblxuXHRcdFx0aWYgc3RlcFxuXHRcdFx0XHRpZiBzdGVwLm5hbWUgb2YgdHJhY2VzXG5cdFx0XHRcdFx0dHJhY2VzW3N0ZXAubmFtZV0gPSB0cmFjZXNbc3RlcC5uYW1lXS5jb25jYXQoYXBwcm92ZXMpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0cmFjZXNbc3RlcC5uYW1lXSA9IGFwcHJvdmVzXG5cblx0XHRyZXR1cm4gdHJhY2VzO1xuXG5cblxuXHRkb2NfdmFsdWVzOiAtPlxuXHRcdFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblxuXHRpbnN0YW5jZV9ib3hfc3R5bGU6IC0+XG5cdFx0Ym94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIilcblx0XHRpZiBib3ggPT0gXCJpbmJveFwiIHx8IGJveCA9PSBcImRyYWZ0XCJcblx0XHRcdGp1ZGdlID0gU2Vzc2lvbi5nZXQoXCJqdWRnZVwiKVxuXHRcdFx0aWYganVkZ2Vcblx0XHRcdFx0aWYgKGp1ZGdlID09IFwiYXBwcm92ZWRcIilcblx0XHRcdFx0XHRyZXR1cm4gXCJib3gtc3VjY2Vzc1wiXG5cdFx0XHRcdGVsc2UgaWYgKGp1ZGdlID09IFwicmVqZWN0ZWRcIilcblx0XHRcdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiBpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uXG5cdFx0XHRpZiBpbnMuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRcdHJldHVybiBcImJveC1zdWNjZXNzXCJcblx0XHRcdGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRcdHJldHVybiBcImJveC1kYW5nZXJcIlxuXG4jaXNfZGlzYWJsZWQ6IC0+XG4jICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuIyAgICBpZiAhaW5zXG4jICAgICAgICByZXR1cm47XG4jICAgIGlmIGlucy5zdGF0ZSE9XCJkcmFmdFwiXG4jICAgICAgICByZXR1cm4gXCJkaXNhYmxlZFwiO1xuIyAgICByZXR1cm47XG5cblx0dGFibGVfZmllbGRzOiAoaW5zdGFuY2UpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbilcblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdGZpZWxkcyA9IF8uY2xvbmUoZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG5cblx0XHRcdGZpZWxkcy5mb3JFYWNoIChmaWVsZCwgaW5kZXgpIC0+XG5cdFx0XHRcdGZpZWxkLnRyX3N0YXJ0ID0gXCJcIjtcblx0XHRcdFx0ZmllbGQudHJfZW5kID0gXCJcIjtcblx0XHRcdFx0dGRfY29sc3BhbiA9IDE7XG4jXHRcdFx0XHTlvLrliLborr7nva7moIflpLTlrZfmrrXkuLrlrr3lrZfmrrVcblx0XHRcdFx0aWYgQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSA9PSBmaWVsZC5jb2RlXG5cdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWVcblxuXHRcdFx0XHRpZiBmaWVsZC5mb3JtdWxhICYmIGZpZWxkLnR5cGUgIT0gJ29kYXRhJ1xuXHRcdFx0XHRcdGZpZWxkLnBlcm1pc3Npb24gPSBcInJlYWRvbmx5XCI7XG5cblx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG4jIOWmguaenOW9k+WJjeWtl+auteaYr+WIhue7hOOAgeihqOagvOOAgeWuveWtl+autVxuXHRcdFx0XHRcdGlmIGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRcdFx0ZmllbGQudGRfY29sc3BhbiA9IDQ7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZmllbGQudGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRpZiBpbmRleCAhPSAwXG5cdFx0XHRcdFx0XHRmaWVsZC50cl9zdGFydCA9IFwiPHRyPlwiO1xuXHRcdFx0XHRcdFx0ZmllbGQudHJfZW5kID0gXCI8L3RyPlwiO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cHJlX2ZpZWxkcyA9IGZpZWxkcy5zbGljZSgwLCBpbmRleCk7XG5cblx0XHRcdFx0XHRwcmVfd2lkZV9maWVsZHMgPSBwcmVfZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfd2lkZVwiLCB0cnVlKTtcblxuXHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCJcIjtcblxuXHRcdFx0XHRcdHRyX2VuZCA9IFwiXCI7XG5cblx0XHRcdFx0XHQjIOWFiOiuoeeul+W9k+WJjeWtl+auteaYr+WQpuS4uuWuveWtl+autVxuXHRcdFx0XHRcdGJlZm9yZV9maWVsZCA9IG51bGw7XG5cdFx0XHRcdFx0YWZ0ZXJfZmllbGQgPSBudWxsO1xuXG5cdFx0XHRcdFx0aWYgaW5kZXggPiAwXG5cdFx0XHRcdFx0XHRiZWZvcmVfZmllbGQgPSBmaWVsZHNbaW5kZXggLSAxXVxuXG5cdFx0XHRcdFx0aWYgaW5kZXggPCBmaWVsZHMubGVuZ3RoIC0gMVxuXHRcdFx0XHRcdFx0YWZ0ZXJfZmllbGQgPSBmaWVsZHNbaW5kZXggKyAxXVxuXG5cdFx0XHRcdFx0IyDlpoLmnpzlvZPliY3lrZfmrrXmmK/liIbnu4TjgIHooajmoLzjgIHlrr3lrZfmrrVcblx0XHRcdFx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSA0O1xuXHRcdFx0XHRcdGVsc2UgaWYgZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cdFx0XHRcdFx0ZWxzZVxuIyDliY3lkI7pg73mmK/lrr3lrZfmrrVcblx0XHRcdFx0XHRcdGlmIGJlZm9yZV9maWVsZCAmJiBhZnRlcl9maWVsZCAmJiBiZWZvcmVfZmllbGQuaXNfd2lkZSAmJiBhZnRlcl9maWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gMztcblxuXHRcdFx0XHRcdFx0IyDlvZPliY3mmK90ciDkuIvnmoQg56ys5LiA5LiqdGQgJiDlkI7ovrnnmoTlrZfmrrXmmK/lrr3lrZfmrrVcblx0XHRcdFx0XHRcdGlmIChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PSAwICYmIGFmdGVyX2ZpZWxkICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSAzO1xuXG5cdFx0XHRcdFx0XHQjIOW9k+WJjeaYr3RyIOS4i+eahCDnrKzkuIDkuKp0ZCAmIOW9k+WJjeWtl+auteaYr+acgOWQjuS4gOS4quWtl+autVxuXHRcdFx0XHRcdFx0aWYgKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09IDAgJiYgYWZ0ZXJfZmllbGQgPT0gbnVsbFxuXHRcdFx0XHRcdFx0XHRmaWVsZC5pc193aWRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRmaWVsZC50ZF9jb2xzcGFuID0gdGRfY29sc3BhbjtcblxuXG5cdFx0XHRcdFx0aWYgaW5kZXggPT0gMFxuIyB0cl9zdGFydCA9IFwiPHRyPlwiOyDnlLHkuo5UZW1wbGF0ZeeahOe8luivkWJ1Z++8jOWvvOiHtOavj+asoee7meS4gOS4qnRy5byA5aeL5pe277yM5Lya6Ieq5Yqo6KGl5aS05oiW6KGl5bC+44CC5Zug5q2k5Zyo56ys5LiA6KGM6L+U5Zue5LiA5Liq56m65a2X56ym5LiyLlxuXHRcdFx0XHRcdFx0dHJfc3RhcnQgPSBcIjx0cj5cIjtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT0gMCB8fCBmaWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHRcdGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCI8dHIgY2xhc3MgPSBcXFwidHItY2hpbGQtdGFibGVcXFwiPlwiO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0dHJfc3RhcnQgPSBcIjx0cj5cIjtcblxuXHRcdFx0XHRcdGZpZWxkLnRyX3N0YXJ0ID0gdHJfc3RhcnQ7XG5cblxuXHRcdFx0XHRcdGlmIGluZGV4ICsgMSA9PSBmaWVsZHMubGVuZ3RoIHx8IGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ3RhYmxlJyB8fCBmaWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHR0cl9lbmQgPSBcIjwvdHI+XCI7XG5cblx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgIT0gMFxuXHRcdFx0XHRcdFx0dHJfZW5kID0gXCI8L3RyPlwiO1xuXG5cdFx0XHRcdFx0ZmllbGQudHJfZW5kID0gdHJfZW5kO1xuXG5cdFx0XHRyZXR1cm4gZmllbGRzO1xuXG5cdHNvcnRfYXBwcm92ZTogKGFwcHJvdmVzLCBvcmRlciktPlxuXHRcdGlmICFhcHByb3Zlc1xuXHRcdFx0cmV0dXJuIFtdXG5cblx0XHRpZiAhYXBwcm92ZXMgaW5zdGFuY2VvZiBBcnJheVxuXHRcdFx0cmV0dXJuIFtdXG5cdFx0ZWxzZVxuXHRcdFx0aWYgb3JkZXIgPT0gJ2Rlc2MnXG5cdFx0XHRcdGFwcHJvdmVzLnNvcnQgKHAxLCBwMikgLT5cblx0XHRcdFx0XHRfcDEgPSAwXG5cdFx0XHRcdFx0X3AyID0gMFxuXG5cdFx0XHRcdFx0aWYgcDEuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMSA9IHAxLmZpbmlzaF9kYXRlLmdldFRpbWUoKVxuXG5cdFx0XHRcdFx0aWYgcDIuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcblxuXHRcdFx0XHRcdHJldHVybiBfcDIgLSBfcDFcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwcm92ZXMuc29ydCAocDEsIHAyKSAtPlxuXHRcdFx0XHRcdF9wMSA9IDBcblx0XHRcdFx0XHRfcDIgPSAwXG5cblx0XHRcdFx0XHRpZiBwMS5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpXG5cblx0XHRcdFx0XHRpZiBwMi5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIF9wMSAtIF9wMlxuXHRcdHJldHVybiBhcHByb3Zlc1xuXG5cdF90OiAoa2V5KS0+XG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXHRnZXRGaWVsZDogKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKVxuXG5cdGdldFZhbHVlOiAoY29kZSktPlxuXHRcdGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlXG5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cblx0XHR1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0XG5cblx0XHR2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge31cblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0dmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpXG5cblx0XHRyZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlIHZhbHVlc1tjb2RlXSwgZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKSwgbG9jYWxlLCB1dGNPZmZzZXRcblxuXHRnZXRMYWJlbDogKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cdFx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsIGZvcm1fdmVyc2lvbi5maWVsZHMsIGNvZGVcblxuXHRpc1RleHRhcmVhOiAoZmllbGQpLT5cblx0XHRpZiBmaWVsZD8udHlwZSA9PSBcImlucHV0XCIgJiYgZmllbGQ/LmlzX3RleHRhcmVhXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdGdldENmQ2xhc3M6IChmaWVsZCktPlxuXHRcdGlmIGZpZWxkPy50eXBlID09IFwiaW5wdXRcIiAmJiBmaWVsZD8uaXNfdGV4dGFyZWFcblx0XHRcdHJldHVybiBcImNmVGV4dGFyZWFcIlxuXG5cdGdldFRhYmxlVGhlYWQ6IChmaWVsZCktPlxuXHRcdHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGhlYWQoZmllbGQsIGZhbHNlKVxuXG5cdGdldFRhYmxlQm9keTogKGZpZWxkKS0+XG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlXG5cdFx0XHR2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge31cblx0XHRlbHNlXG5cdFx0XHR2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKClcblxuXHRcdHRhYmxlVmFsdWUgPSB2YWx1ZXNbZmllbGQuY29kZV07XG5cdFx0cmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUYm9keShmaWVsZC5zZmllbGRzLmdldFByb3BlcnR5KFwiY29kZVwiKSwgZmllbGQsIHRhYmxlVmFsdWUsIGZhbHNlKVxuXG5cdHNob3dMYWJlbDogKGZpZWxkKS0+XG5cdFx0dGVtcGxhdGVEYXRhID0gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhXG5cdFx0aWYgdGVtcGxhdGVEYXRhLmxhYmVsID09IGZhbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRyZXR1cm4gdHJ1ZVxuXG4jXHRhZkZpZWxkTGFiZWxUZXh0OiAob3ApLT5cbiNcdFx0aWYgIVRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YVxuI1x0XHRcdHJldHVybiBBdXRvRm9ybS5nZXRMYWJlbEZvckZpZWxkKG9wLm5hbWUpXG4jXHRcdGVsc2VcbiNcdFx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG4jXHRcdFx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsIGZvcm1fdmVyc2lvbi5maWVsZHMsIG9wPy5oYXNoPy5uYW1lXG5cblx0aXNPcGluaW9uRmllbGQ6IChmaWVsZCktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkLmZvcm11bGEpXG5cblx0aXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmc6IChmaWVsZF9mb3JtdWxhKS0+XG5cdFx0cmV0dXJuIEluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSlcblxuXHRpbmNsdWRlc09waW5pb25GaWVsZDogKGZvcm0sIGZvcm1fdmVyc2lvbiktPlxuXG5cdFx0ZmllbGRfZm9ybXVsYXMgPSBuZXcgQXJyYXkoKTtcblxuXHRcdGZpZWxkcyA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7X2lkOiBmb3JtX3ZlcnNpb24sIGZvcm06IGZvcm19KT8uZmllbGRzIHx8IFtdXG5cblx0XHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdFx0aWYgZi50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0Y29uc29sZS5sb2cgJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJ1xuXHRcdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRcdGY/LmZpZWxkcz8uZm9yRWFjaCAoZjEpLT5cblx0XHRcdFx0XHRmaWVsZF9mb3JtdWxhcy5wdXNoIGYxLmZvcm11bGFcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmllbGRfZm9ybXVsYXMucHVzaCBmLmZvcm11bGFcblxuXHRcdF8uc29tZSBmaWVsZF9mb3JtdWxhcywgKGZpZWxkX2Zvcm11bGEpLT5cblx0XHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cblx0Z2V0T3BpbmlvbkZpZWxkU3RlcHNOYW1lOiAoZmllbGRfZm9ybXVsYSwgdG9wX2tleXdvcmRzKS0+XG5cblx0XHRvcGluaW9uRmllbGRzID0gbmV3IEFycmF5KCk7XG4jXHRcdGNvbnNvbGUubG9nKFwiZmllbGRfZm9ybXVsYVwiLCBmaWVsZF9mb3JtdWxhKVxuXHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSlcblx0XHRcdGlmIGZpZWxkX2Zvcm11bGFcblxuI1x0XHRcdFx0Zm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCIsXCIpXG5cdFx0XHRcdGZvbzEgPSBmaWVsZF9mb3JtdWxhLnNwbGl0KFwiO1wiKVxuXG4jXHRcdFx0XHRpZiB0b3Bfa2V5d29yZHNcbiNcdFx0XHRcdFx0Zm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCI7XCIpXG5cblx0XHRcdFx0Zm9vMS5mb3JFYWNoIChmb28pLT5cblx0XHRcdFx0XHRqc29uX2Zvcm11bGEgPSB7fVxuXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRqc29uX2Zvcm11bGEgPSBldmFsKFwiKFwiICsgZm9vICsgXCIpXCIpXG5cdFx0XHRcdFx0Y2F0Y2hcblx0XHRcdFx0XHRcdGpzb25fZm9ybXVsYSA9IHt9XG5cblx0XHRcdFx0XHRpZiBqc29uX2Zvcm11bGE/LnlpamlhbmxhblxuXHRcdFx0XHRcdFx0c2YgPSB7fVxuXG5cdFx0XHRcdFx0XHRzZi5zdGVwTmFtZSA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uc3RlcFxuXG5cdFx0XHRcdFx0XHRzZi5pbWFnZV9zaWduID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5pbWFnZV9zaWduIHx8IGZhbHNlXG5cblx0XHRcdFx0XHRcdHNmLm9ubHlfY2Nfb3BpbmlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9jYyB8fCBmYWxzZVxuXG5cdFx0XHRcdFx0XHRzZi5kZWZhdWx0X2Rlc2NyaXB0aW9uID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5kZWZhdWx0XG5cblx0XHRcdFx0XHRcdHNmLm9ubHlfaGFuZGxlciA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9oYW5kbGVyXG5cblx0XHRcdFx0XHRcdHNmLnRvcF9rZXl3b3JkcyA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4udG9wX2tleXdvcmRzIHx8IHRvcF9rZXl3b3Jkc1xuXG5cdFx0XHRcdFx0XHRvcGluaW9uRmllbGRzLnB1c2goc2YpO1xuXG5cdFx0XHRcdFx0ZWxzZSBpZihmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3RyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpID4gLTEpXG5cblx0XHRcdFx0XHRcdHNmID0ge29ubHlfY2Nfb3BpbmlvbjogZmFsc2UsIGltYWdlX3NpZ246IGZhbHNlLCB0b3Bfa2V5d29yZHM6IHRvcF9rZXl3b3Jkc31cblxuXHRcdFx0XHRcdFx0aWYgZm9vLmluZGV4T2YoXCJ7c2lnbmF0dXJlLlwiKSA+IC0xXG5cdFx0XHRcdFx0XHRcdHNmLmltYWdlX3NpZ24gPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGZvbyA9IGZvby5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIixcIlwiKTtcblxuXHRcdFx0XHRcdFx0czEgPSBmb28ucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpXG5cdFx0XHRcdFx0XHRpZiBzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMVxuXHRcdFx0XHRcdFx0XHRzZi5zdGVwTmFtZSA9IHMxLnNwbGl0KFwiLlwiKVsxXVxuXHRcdFx0XHRcdFx0XHRpZiBvcGluaW9uRmllbGRzLmZpbHRlclByb3BlcnR5KFwic3RlcE5hbWVcIixzZi5zdGVwTmFtZSkubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0XHRcdG9waW5pb25GaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcInN0ZXBOYW1lXCIsIHNmLnN0ZXBOYW1lKT8ub25seV9jY19vcGluaW9uID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKVsyXT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnY2MnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNmLm9ubHlfY2Nfb3BpbmlvbiA9IHRydWVcblx0XHRcdFx0XHRcdG9waW5pb25GaWVsZHMucHVzaChzZik7XG5cblx0XHRyZXR1cm4gb3BpbmlvbkZpZWxkc1xuXG5cdHNob3dDQ09waW5pb246IChmaWVsZCktPlxuXHRcdGlmIGZpZWxkLmZvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkLmZvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMVxuXHRcdFx0czEgPSBmaWVsZC5mb3JtdWxhLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLFwiXCIpLnJlcGxhY2UoXCJ7XCIsXCJcIikucmVwbGFjZShcIn1cIixcIlwiKVxuXHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDJcblx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpWzJdPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdjYydcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKCBocmVmLCB0aXRsZSwgdGV4dCApIC0+XG5cdFx0XHQjIFx0cmV0dXJuIFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyN7aHJlZn0nIHRpdGxlPScje3RpdGxlfSc+I3t0ZXh0fTwvYT5cIlxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKVxuXHRcdFx0cmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpXG5cblx0Zl9sYWJlbDogKHRoYXQpLT5cblx0XHRyZXR1cm4gdGhhdC5uYW1lIHx8IHRoYXQuY29kZVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5zdGVlZG9zX2Zvcm0gPSAtPlxuXHRcdHJldHVybiB0aGlzLmZvcm1fdmVyc2lvblxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNTZWN0aW9uID0gKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvblxuXHRcdHJldHVybiBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLnR5cGUgPT0gJ3NlY3Rpb24nXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5kb2NfdmFsdWVzID0gLT5cblx0XHRpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG5cdFx0cmV0dXJuIGluc3RhbmNlLnZhbHVlcztcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmFwcGxpY2FudENvbnRleHQgPSAtPlxuXHRcdGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcblx0XHRkYXRhID0ge1xuXHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0YXR0czoge25hbWU6ICdpbnNfYXBwbGljYW50JywgaWQ6ICdpbnNfYXBwbGljYW50JywgY2xhc3M6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J30sXG5cdFx0XHR2YWx1ZTogaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblx0XHR9XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnN0YW5jZSA9IC0+XG5cdFx0cmV0dXJuIHRoaXMuaW5zdGFuY2VcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZpZWxkcyA9IC0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gdGhpcy5mb3JtX3ZlcnNpb25cblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtX3R5cGVzID0gLT5cblx0XHRyZXR1cm4gXCJkaXNhYmxlZFwiXG5cblx0VGVtcGxhdGUucmVnaXN0ZXJIZWxwZXIgXCJhZkZpZWxkTGFiZWxUZXh0XCIsIChvcCktPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgZm9ybV92ZXJzaW9uLmZpZWxkcywgb3A/Lmhhc2g/Lm5hbWVcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLl90ID0gKGtleSktPlxuXHRcdGxvY2FsZSA9IHRoaXMubG9jYWxlXG5cblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnNfYXR0YWNoX2Rvd25sb2FkX3VybCA9IChfaWQsIGFic29sdXRlKS0+XG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy8je19pZH0/ZG93bmxvYWQ9dHJ1ZVwiKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy8je19pZH0/ZG93bmxvYWQ9dHJ1ZVwiO1xuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMub3B0aW9ucyA9IChmaWVsZCktPlxuXHRcdG9wdGlvbnMgPSBmaWVsZD8ub3B0aW9ucz8uc3BsaXQoXCJcXG5cIilcblx0XHRyZXYgPSBbXVxuXHRcdG9wdGlvbnM/LmZvckVhY2ggKGl0ZW0pLT5cblx0XHRcdHJldi5wdXNoKHtsYWJlbDogaXRlbSwgdmFsdWU6IGl0ZW19KVxuXG5cdFx0cmV0dXJuIHJldlxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZ2V0UGVybWlzc2lvbnMgPSAoY29kZSktPlxuXHRcdGlmICFUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuc3RhcnRTdGVwRWRpdGFibGVGaWVsZHM/LmluY2x1ZGVzKGNvZGUpXG5cdFx0XHRyZXR1cm4gXCJyZWFkb25seSBkaXNhYmxlZFwiXG5cdFx0cmV0dXJuIFwiXCJcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuZXZlbnRzID1cblx0J2NoYW5nZSAuZm9ybS1jb250cm9sLC5jaGVja2JveCBpbnB1dCwuYWYtcmFkaW8tZ3JvdXAgaW5wdXQsLmFmLWNoZWNrYm94LWdyb3VwIGlucHV0JzogKGV2ZW50KS0+XG5cdFx0SW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KVxuXG5cdCd0eXBlYWhlYWQ6Y2hhbmdlIC5mb3JtLWNvbnRyb2wnOiAoZXZlbnQpIC0+XG5cdFx0SW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KVxuXG5cdCdjbGljayAuY2ZUZXh0YXJlYSBhJzogKGV2ZW50KS0+XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRTdGVlZG9zLm9wZW5XaW5kb3coZXZlbnQudGFyZ2V0LmhyZWYpO1xuXG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLm9uQ3JlYXRlZCA9ICgpLT5cblx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0aWYgIWluc3RhbmNlXG5cdFx0cmV0dXJuO1xuXG5cdHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlKTtcblxuXHR0cnlcblx0XHRjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodGVtcGxhdGUsIHtpc0JvZHk6IHRydWV9KTtcblx0Y2F0Y2ggZVxuXHRcdGNvbnNvbGUubG9nIFwiSW5zdGFuY2UgVGVtcGxhdGUgRXJyb3JcIiwgZVxuXHRcdGNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShcIlwiLCB7aXNCb2R5OiB0cnVlfSk7XG5cblxuXHRyZW5kZXJGdW5jdGlvbiA9IGV2YWwoY29tcGlsZWQpO1xuXG5cdGluc3RhbmNlVmlldyA9IG5ldyBCbGF6ZS5WaWV3KFwiY3VzdG9tX2luc3RhbmNlX3RlbXBsYXRlXCIsIHJlbmRlckZ1bmN0aW9uKTtcblxuXHRpbnN0YW5jZUN1c3RvbVRlbXBsYXRlID0gbmV3IEJsYXplLlRlbXBsYXRlKGluc3RhbmNlVmlldy5uYW1lLCByZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlID0gaW5zdGFuY2VDdXN0b21UZW1wbGF0ZVxuXG5cdFRlbXBsYXRlLmluc3RhbmNlX2N1c3RvbV90ZW1wbGF0ZS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuXG5cblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25SZW5kZXJlZCA9ICgpLT5cblx0IyB0ID0gdGhpcztcblxuXHQjdC5zdWJzY3JpYmUgXCJpbnN0YW5jZV9kYXRhXCIsIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSwgLT5cblx0IyAgICBUcmFja2VyLmFmdGVyRmx1c2ggLT5cblx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0aWYgIWluc3RhbmNlXG5cdFx0cmV0dXJuO1xuXG5cdCMkKFwiI2luc19hcHBsaWNhbnRcIikuc2VsZWN0MigpLnZhbChpbnN0YW5jZS5hcHBsaWNhbnQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuXHQjJChcIiNpbnNfYXBwbGljYW50XCIpLnZhbChpbnN0YW5jZS5hcHBsaWNhbnQpO1xuXHRJbnN0YW5jZU1hbmFnZXIuc2V0SW5zdGFuY2VGb3JtQXBwbGljYW50KGluc3RhbmNlLmFwcGxpY2FudCwgaW5zdGFuY2UuYXBwbGljYW50X25hbWUpXG5cblxuXHRBcHByb3ZlTWFuYWdlci5lcnJvciA9IHtuZXh0U3RlcHM6ICcnLCBuZXh0U3RlcFVzZXJzOiAnJ307XG5cblx0IyBpbnN0YW5jZSBmcm9t57uR5a6a5LqL5Lu2XG5cdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2RyYWZ0J1xuXHRcdEluc3RhbmNlRXZlbnQuaW5pdEV2ZW50cyhpbnN0YW5jZS5mbG93KTtcblxuXHRpZiAhQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cblx0XHRjdXJyZW50QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuXG5cblx0XHRpbnN0YW5jZU51bWJlckZpZWxkcyA9ICQoXCJbZGF0YS1mb3JtdWxhXVwiLCAkKFwiI2luc3RhbmNlZm9ybVwiKSlcblxuXHRcdGluc3RhbmNlTnVtYmVyRmllbGRzLmVhY2ggKCktPlxuXHRcdFx0c2NoZW1hS2V5ID0gdGhpcy5kYXRhc2V0LnNjaGVtYUtleVxuXHRcdFx0ZWxlbWVudCA9ICQodGhpcylcblx0XHRcdGlmICEkKHRoaXMpLnZhbCgpICYmIHNjaGVtYUtleSAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIilcblx0XHRcdFx0TWV0ZW9yLmNhbGwgJ2dldEluc3RhbmNlVmFsdWVzJywgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpLCAoZXJyb3IsIHJlc3VsdCktPlxuXHRcdFx0XHRcdGlmIGVycm9yXG5cdFx0XHRcdFx0XHR0b2FzdHIuZXJyb3IoZXJyb3IucmVhc29uKVxuXG5cdFx0XHRcdFx0aWYgIXJlc3VsdFtzY2hlbWFLZXldXG5cdFx0XHRcdFx0XHRrZXkgPSBlbGVtZW50LmRhdGEoXCJmb3JtdWxhXCIpPy5yZXBsYWNlKFwiYXV0b19udW1iZXIoXCIsIFwiXCIpLnJlcGxhY2UoXCIpXCIsIFwiXCIpXG5cblx0XHRcdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpLnJlcGxhY2UoL1xcJy9nLCBcIlwiKVxuXG5cdFx0XHRcdFx0XHRpZiBrZXkuaW5kZXhPZihcIntcIikgPiAtMVxuXHRcdFx0XHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpXG5cdFx0XHRcdFx0XHRcdGtleSA9IGtleS50cmltKClcblx0XHRcdFx0XHRcdFx0a2V5ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShrZXksICdpbnN0YW5jZWZvcm0nKVxuXHRcdFx0XHRcdFx0SW5zdGFuY2VOdW1iZXJSdWxlcy5pbnN0YW5jZU51bWJlckJ1aWxkZXIgZWxlbWVudCwga2V5XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZWxlbWVudD8udmFsKHJlc3VsdFtzY2hlbWFLZXldKS50cmlnZ2VyKFwiY2hhbmdlXCIpXG5cblx0XHRqdWRnZSA9IGN1cnJlbnRBcHByb3ZlLmp1ZGdlXG5cdFx0Y3VycmVudFN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXG5cdFx0dW5sZXNzIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuXG5cblx0XHR1bmxlc3MgZm9ybV92ZXJzaW9uLmZpZWxkc1xuXHRcdFx0cmV0dXJuXG5cblx0XHRmb3JtdWxhX2ZpZWxkcyA9IEZvcm1fZm9ybXVsYS5nZXRGb3JtdWxhRmllbGRWYXJpYWJsZShcIkZvcm1fZm9ybXVsYS5maWVsZF92YWx1ZXNcIiwgZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG5cdFx0aW5zZXJ0RG9jID0gQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcImluc3RhbmNlZm9ybVwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UpXG5cdFx0Rm9ybV9mb3JtdWxhLnJ1bihcIlwiLCBcIlwiLCBmb3JtdWxhX2ZpZWxkcywgaW5zZXJ0RG9jLCBmb3JtX3ZlcnNpb24uZmllbGRzKTtcblx0XHQj5Zyo5q2k5aSE5Yid5aeL5YyWc2Vzc2lvbiDkuK3nmoQgZm9ybV92YWx1ZXMg5Y+Y6YeP77yM55So5LqO6Kem5Y+R5LiL5LiA5q2l5q2l6aqk6K6h566XXG5cdFx0U2Vzc2lvbi5zZXQoXCJpbnN0YW5jZV9mb3JtX3ZhbHVlc1wiLCB7aW5zdGFuY2VJZDogaW5zdGFuY2UuX2lkLCB2YWx1ZXM6IGluc2VydERvY30pO1xuXG5cblxuIiwidmFyIG1hcmtlZDtcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyA9IHtcbiAgYXBwbGljYW50Q29udGV4dDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGEsIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgc3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGRhdGEgPSB7XG4gICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICBhdHRzOiB7XG4gICAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgaWQ6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgXCJjbGFzc1wiOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCdcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogc3RlZWRvc19pbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuICAgIH07XG4gICAgaWYgKCFzdGVlZG9zX2luc3RhbmNlIHx8IHN0ZWVkb3NfaW5zdGFuY2Uuc3RhdGUgIT09IFwiZHJhZnRcIikge1xuICAgICAgZGF0YS5hdHRzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sXG4gIGluc3RhbmNlSWQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW5zdGFuY2Vmb3JtJztcbiAgfSxcbiAgZm9ybV90eXBlczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgICAgcmV0dXJuICdkaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbWV0aG9kJztcbiAgICB9XG4gIH0sXG4gIHN0ZWVkb3NfZm9ybTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gICAgfVxuICB9LFxuICBpbm5lcnN1YmZvcm1Db250ZXh0OiBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgZG9jX3ZhbHVlcztcbiAgICBkb2NfdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIG9ialtcInRhYmxlVmFsdWVzXCJdID0gZG9jX3ZhbHVlcyA/IGRvY192YWx1ZXNbb2JqLmNvZGVdIDogW107XG4gICAgb2JqW1wiZm9ybUlkXCJdID0gXCJpbnN0YW5jZWZvcm1cIjtcbiAgICByZXR1cm4gb2JqO1xuICB9LFxuICBpbnN0YW5jZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgU2Vzc2lvbi5nZXQoXCJjaGFuZ2VfZGF0ZVwiKTtcbiAgICBpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKSB7XG4gICAgICBzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICByZXR1cm4gc3RlZWRvc19pbnN0YW5jZTtcbiAgICB9XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgdW5lbXB0eTogZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9LFxuICB1bmVxdWFsczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiAhKGEgPT09IGIpO1xuICB9LFxuICBpbmNsdWRlczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiLnNwbGl0KCcsJykuaW5jbHVkZXMoYSk7XG4gIH0sXG4gIGluY2x1ZGU6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuICB9LFxuICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuICAgIH1cbiAgfSxcbiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24oZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5mb3JtYXQpIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tXCJcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcbiAgfSxcbiAgdHJhY2VzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmxvdywgaW5zdGFuY2UsIGxvY2FsZSwgcmVmLCByZWYxLCByZWYyLCByZWYzLCBzdGVlZG9zRGF0YSwgc3RlcHMsIHRyYWNlcztcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBzdGVlZG9zRGF0YSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYudmlldykgIT0gbnVsbCA/IChyZWYyID0gcmVmMS50ZW1wbGF0ZSkgIT0gbnVsbCA/IHJlZjIuc3RlZWRvc0RhdGEgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICBpbnN0YW5jZSA9IHN0ZWVkb3NEYXRhICE9IG51bGwgPyBzdGVlZG9zRGF0YS5pbnN0YW5jZSA6IHZvaWQgMDtcbiAgICAgIGZsb3cgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24oaW5zdGFuY2UpO1xuICAgICAgbG9jYWxlID0gc3RlZWRvc0RhdGEgIT0gbnVsbCA/IHN0ZWVkb3NEYXRhLmxvY2FsZSA6IHZvaWQgMDtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmxvd1ZlcnNpb24oKTtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIGlmICghaW5zdGFuY2UgfHwgIWZsb3cpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RlcHMgPSBmbG93LnN0ZXBzO1xuICAgIHRyYWNlcyA9IHt9O1xuICAgIGlmICgocmVmMyA9IGluc3RhbmNlLnRyYWNlcykgIT0gbnVsbCkge1xuICAgICAgcmVmMy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgIHZhciBhcHByb3ZlcywgcmVmNCwgc3RlcDtcbiAgICAgICAgc3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdHJhY2Uuc3RlcCk7XG4gICAgICAgIGFwcHJvdmVzID0gW107XG4gICAgICAgIGlmICgocmVmNCA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsKSB7XG4gICAgICAgICAgcmVmNC5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICAgIHZhciBqdWRnZV9uYW1lO1xuICAgICAgICAgICAgaWYgKHRyYWNlLmlzX2ZpbmlzaGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlmIChhcHByb3ZlLmp1ZGdlID09PSAnYXBwcm92ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWplY3RlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAndGVybWluYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHRlcm1pbmF0ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ3JlYXNzaWduZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICdyZWxvY2F0ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWxvY2F0ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBwZW5kaW5nXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVzLnB1c2goe1xuICAgICAgICAgICAgICBfaWQ6IGFwcHJvdmUuX2lkLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBhcHByb3ZlLnVzZXIsXG4gICAgICAgICAgICAgIGhhbmRsZXJfbmFtZTogYXBwcm92ZS5oYW5kbGVyX25hbWUsXG4gICAgICAgICAgICAgIGhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZSxcbiAgICAgICAgICAgICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUsXG4gICAgICAgICAgICAgIGZpbmlzaF9kYXRlOiBhcHByb3ZlLmZpbmlzaF9kYXRlLFxuICAgICAgICAgICAgICBqdWRnZTogYXBwcm92ZS5qdWRnZSxcbiAgICAgICAgICAgICAganVkZ2VfbmFtZToganVkZ2VfbmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGFwcHJvdmUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGlzX2ZpbmlzaGVkOiBhcHByb3ZlLmlzX2ZpbmlzaGVkLFxuICAgICAgICAgICAgICB0eXBlOiBhcHByb3ZlLnR5cGUsXG4gICAgICAgICAgICAgIG9waW5pb25fZmllbGRzX2NvZGU6IGFwcHJvdmUub3Bpbmlvbl9maWVsZHNfY29kZSxcbiAgICAgICAgICAgICAgc2lnbl9maWVsZF9jb2RlOiBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSxcbiAgICAgICAgICAgICAgaXNfcmVhZDogYXBwcm92ZS5pc19yZWFkLFxuICAgICAgICAgICAgICBzaWduX3Nob3c6IGFwcHJvdmUuc2lnbl9zaG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmIChzdGVwLm5hbWUgaW4gdHJhY2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VzW3N0ZXAubmFtZV0gPSB0cmFjZXNbc3RlcC5uYW1lXS5jb25jYXQoYXBwcm92ZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VzW3N0ZXAubmFtZV0gPSBhcHByb3ZlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJhY2VzO1xuICB9LFxuICBkb2NfdmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICB9LFxuICBpbnN0YW5jZV9ib3hfc3R5bGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBib3gsIGlucywganVkZ2U7XG4gICAgYm94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIik7XG4gICAgaWYgKGJveCA9PT0gXCJpbmJveFwiIHx8IGJveCA9PT0gXCJkcmFmdFwiKSB7XG4gICAgICBqdWRnZSA9IFNlc3Npb24uZ2V0KFwianVkZ2VcIik7XG4gICAgICBpZiAoanVkZ2UpIHtcbiAgICAgICAgaWYgKGp1ZGdlID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJib3gtc3VjY2Vzc1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGp1ZGdlID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJib3gtZGFuZ2VyXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgaWYgKGlucyAmJiBpbnMuZmluYWxfZGVjaXNpb24pIHtcbiAgICAgIGlmIChpbnMuZmluYWxfZGVjaXNpb24gPT09IFwiYXBwcm92ZWRcIikge1xuICAgICAgICByZXR1cm4gXCJib3gtc3VjY2Vzc1wiO1xuICAgICAgfSBlbHNlIGlmIChpbnMuZmluYWxfZGVjaXNpb24gPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICByZXR1cm4gXCJib3gtZGFuZ2VyXCI7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB0YWJsZV9maWVsZHM6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGZpZWxkcywgZm9ybV92ZXJzaW9uO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtVmVyc2lvbihpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICBmaWVsZHMgPSBfLmNsb25lKGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQsIGluZGV4KSB7XG4gICAgICAgIHZhciBhZnRlcl9maWVsZCwgYmVmb3JlX2ZpZWxkLCBwcmVfZmllbGRzLCBwcmVfd2lkZV9maWVsZHMsIHRkX2NvbHNwYW4sIHRyX2VuZCwgdHJfc3RhcnQ7XG4gICAgICAgIGZpZWxkLnRyX3N0YXJ0ID0gXCJcIjtcbiAgICAgICAgZmllbGQudHJfZW5kID0gXCJcIjtcbiAgICAgICAgdGRfY29sc3BhbiA9IDE7XG4gICAgICAgIGlmICgodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSA9PT0gZmllbGQuY29kZSkge1xuICAgICAgICAgIGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5mb3JtdWxhICYmIGZpZWxkLnR5cGUgIT09ICdvZGF0YScpIHtcbiAgICAgICAgICBmaWVsZC5wZXJtaXNzaW9uID0gXCJyZWFkb25seVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgIGZpZWxkLnRkX2NvbHNwYW4gPSA0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZC50ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBmaWVsZC50cl9zdGFydCA9IFwiPHRyPlwiO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkLnRyX2VuZCA9IFwiPC90cj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlX2ZpZWxkcyA9IGZpZWxkcy5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgICAgcHJlX3dpZGVfZmllbGRzID0gcHJlX2ZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcImlzX3dpZGVcIiwgdHJ1ZSk7XG4gICAgICAgICAgdHJfc3RhcnQgPSBcIlwiO1xuICAgICAgICAgIHRyX2VuZCA9IFwiXCI7XG4gICAgICAgICAgYmVmb3JlX2ZpZWxkID0gbnVsbDtcbiAgICAgICAgICBhZnRlcl9maWVsZCA9IG51bGw7XG4gICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlX2ZpZWxkID0gZmllbGRzW2luZGV4IC0gMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCA8IGZpZWxkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBhZnRlcl9maWVsZCA9IGZpZWxkc1tpbmRleCArIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgIHRkX2NvbHNwYW4gPSA0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVfZmllbGQgJiYgYWZ0ZXJfZmllbGQgJiYgYmVmb3JlX2ZpZWxkLmlzX3dpZGUgJiYgYWZ0ZXJfZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09PSAwICYmIGFmdGVyX2ZpZWxkICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgZmllbGQuaXNfd2lkZSA9IHRydWU7XG4gICAgICAgICAgICAgIHRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PT0gMCAmJiBhZnRlcl9maWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLnRkX2NvbHNwYW4gPSB0ZF9jb2xzcGFuO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0cj5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PT0gMCB8fCBmaWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0ciBjbGFzcyA9IFxcXCJ0ci1jaGlsZC10YWJsZVxcXCI+XCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0cj5cIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZC50cl9zdGFydCA9IHRyX3N0YXJ0O1xuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGZpZWxkcy5sZW5ndGggfHwgZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScgfHwgZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgdHJfZW5kID0gXCI8L3RyPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICB0cl9lbmQgPSBcIjwvdHI+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWVsZC50cl9lbmQgPSB0cl9lbmQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gIH0sXG4gIHNvcnRfYXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZXMsIG9yZGVyKSB7XG4gICAgaWYgKCFhcHByb3Zlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoIWFwcHJvdmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgYXBwcm92ZXMuc29ydChmdW5jdGlvbihwMSwgcDIpIHtcbiAgICAgICAgICB2YXIgX3AxLCBfcDI7XG4gICAgICAgICAgX3AxID0gMDtcbiAgICAgICAgICBfcDIgPSAwO1xuICAgICAgICAgIGlmIChwMS5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocDIuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wMiAtIF9wMTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHByb3Zlcy5zb3J0KGZ1bmN0aW9uKHAxLCBwMikge1xuICAgICAgICAgIHZhciBfcDEsIF9wMjtcbiAgICAgICAgICBfcDEgPSAwO1xuICAgICAgICAgIF9wMiA9IDA7XG4gICAgICAgICAgaWYgKHAxLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICBfcDEgPSBwMS5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwMi5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3AxIC0gX3AyO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVzO1xuICB9LFxuICBfdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5KTtcbiAgfSxcbiAgZ2V0RmllbGQ6IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSk7XG4gICAgfVxuICB9LFxuICBnZXRWYWx1ZTogZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciBmb3JtX3ZlcnNpb24sIGluc3RhbmNlLCBsb2NhbGUsIHV0Y09mZnNldCwgdmFsdWVzO1xuICAgIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0O1xuICAgIHZhbHVlcyA9IGluc3RhbmNlLnZhbHVlcyB8fCB7fTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICB2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgfVxuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWVzW2NvZGVdLCBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLCBsb2NhbGUsIHV0Y09mZnNldCk7XG4gIH0sXG4gIGdldExhYmVsOiBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uO1xuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwoZm9ybV92ZXJzaW9uLmZpZWxkcywgY29kZSk7XG4gIH0sXG4gIGlzVGV4dGFyZWE6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQudHlwZSA6IHZvaWQgMCkgPT09IFwiaW5wdXRcIiAmJiAoZmllbGQgIT0gbnVsbCA/IGZpZWxkLmlzX3RleHRhcmVhIDogdm9pZCAwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICBnZXRDZkNsYXNzOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnR5cGUgOiB2b2lkIDApID09PSBcImlucHV0XCIgJiYgKGZpZWxkICE9IG51bGwgPyBmaWVsZC5pc190ZXh0YXJlYSA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiBcImNmVGV4dGFyZWFcIjtcbiAgICB9XG4gIH0sXG4gIGdldFRhYmxlVGhlYWQ6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgcmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUaGVhZChmaWVsZCwgZmFsc2UpO1xuICB9LFxuICBnZXRUYWJsZUJvZHk6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIGluc3RhbmNlLCB0YWJsZVZhbHVlLCB2YWx1ZXM7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG4gICAgICB2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgICB9XG4gICAgdGFibGVWYWx1ZSA9IHZhbHVlc1tmaWVsZC5jb2RlXTtcbiAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRib2R5KGZpZWxkLnNmaWVsZHMuZ2V0UHJvcGVydHkoXCJjb2RlXCIpLCBmaWVsZCwgdGFibGVWYWx1ZSwgZmFsc2UpO1xuICB9LFxuICBzaG93TGFiZWw6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIHRlbXBsYXRlRGF0YTtcbiAgICB0ZW1wbGF0ZURhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGE7XG4gICAgaWYgKHRlbXBsYXRlRGF0YS5sYWJlbCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGlzT3BpbmlvbkZpZWxkOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkLmZvcm11bGEpO1xuICB9LFxuICBpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZzogZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZVNpZ25UZXh0LmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9LFxuICBpbmNsdWRlc09waW5pb25GaWVsZDogZnVuY3Rpb24oZm9ybSwgZm9ybV92ZXJzaW9uKSB7XG4gICAgdmFyIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHMsIHJlZjtcbiAgICBmaWVsZF9mb3JtdWxhcyA9IG5ldyBBcnJheSgpO1xuICAgIGZpZWxkcyA9ICgocmVmID0gZGIuZm9ybV92ZXJzaW9ucy5maW5kT25lKHtcbiAgICAgIF9pZDogZm9ybV92ZXJzaW9uLFxuICAgICAgZm9ybTogZm9ybVxuICAgIH0pKSAhPSBudWxsID8gcmVmLmZpZWxkcyA6IHZvaWQgMCkgfHwgW107XG4gICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgdmFyIHJlZjE7XG4gICAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZygnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoZi50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYxID0gZi5maWVsZHMpICE9IG51bGwgPyByZWYxLmZvckVhY2goZnVuY3Rpb24oZjEpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGRfZm9ybXVsYXMucHVzaChmMS5mb3JtdWxhKTtcbiAgICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmllbGRfZm9ybXVsYXMucHVzaChmLmZvcm11bGEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfLnNvbWUoZmllbGRfZm9ybXVsYXMsIGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICAgIH0pO1xuICB9LFxuICBnZXRPcGluaW9uRmllbGRTdGVwc05hbWU6IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEsIHRvcF9rZXl3b3Jkcykge1xuICAgIHZhciBmb28xLCBvcGluaW9uRmllbGRzO1xuICAgIG9waW5pb25GaWVsZHMgPSBuZXcgQXJyYXkoKTtcbiAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKSkge1xuICAgICAgaWYgKGZpZWxkX2Zvcm11bGEpIHtcbiAgICAgICAgZm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCI7XCIpO1xuICAgICAgICBmb28xLmZvckVhY2goZnVuY3Rpb24oZm9vKSB7XG4gICAgICAgICAgdmFyIGpzb25fZm9ybXVsYSwgcmVmLCByZWYxLCBzMSwgc2Y7XG4gICAgICAgICAganNvbl9mb3JtdWxhID0ge307XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25fZm9ybXVsYSA9IGV2YWwoXCIoXCIgKyBmb28gKyBcIilcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgICBqc29uX2Zvcm11bGEgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGpzb25fZm9ybXVsYSAhPSBudWxsID8ganNvbl9mb3JtdWxhLnlpamlhbmxhbiA6IHZvaWQgMCkge1xuICAgICAgICAgICAgc2YgPSB7fTtcbiAgICAgICAgICAgIHNmLnN0ZXBOYW1lID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5zdGVwO1xuICAgICAgICAgICAgc2YuaW1hZ2Vfc2lnbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uaW1hZ2Vfc2lnbiB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNmLm9ubHlfY2Nfb3BpbmlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9jYyB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNmLmRlZmF1bHRfZGVzY3JpcHRpb24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuW1wiZGVmYXVsdFwiXTtcbiAgICAgICAgICAgIHNmLm9ubHlfaGFuZGxlciA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9oYW5kbGVyO1xuICAgICAgICAgICAgc2YudG9wX2tleXdvcmRzID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi50b3Bfa2V5d29yZHMgfHwgdG9wX2tleXdvcmRzO1xuICAgICAgICAgICAgcmV0dXJuIG9waW5pb25GaWVsZHMucHVzaChzZik7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3RyYWNlcy5cIikgOiB2b2lkIDApID4gLTEgfHwgKGZpZWxkX2Zvcm11bGEgIT0gbnVsbCA/IGZpZWxkX2Zvcm11bGEuaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSkge1xuICAgICAgICAgICAgc2YgPSB7XG4gICAgICAgICAgICAgIG9ubHlfY2Nfb3BpbmlvbjogZmFsc2UsXG4gICAgICAgICAgICAgIGltYWdlX3NpZ246IGZhbHNlLFxuICAgICAgICAgICAgICB0b3Bfa2V5d29yZHM6IHRvcF9rZXl3b3Jkc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmb28uaW5kZXhPZihcIntzaWduYXR1cmUuXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc2YuaW1hZ2Vfc2lnbiA9IHRydWU7XG4gICAgICAgICAgICAgIGZvbyA9IGZvby5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIiwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzMSA9IGZvby5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgICAgICAgIGlmIChzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBzZi5zdGVwTmFtZSA9IHMxLnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgICAgICAgaWYgKG9waW5pb25GaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJzdGVwTmFtZVwiLCBzZi5zdGVwTmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICgocmVmID0gb3BpbmlvbkZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcE5hbWVcIiwgc2Yuc3RlcE5hbWUpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICByZWYub25seV9jY19vcGluaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKChyZWYxID0gczEuc3BsaXQoXCIuXCIpWzJdKSAhPSBudWxsID8gcmVmMS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogdm9pZCAwKSA9PT0gJ2NjJykge1xuICAgICAgICAgICAgICAgICAgICBzZi5vbmx5X2NjX29waW5pb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9waW5pb25GaWVsZHMucHVzaChzZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9waW5pb25GaWVsZHM7XG4gIH0sXG4gIHNob3dDQ09waW5pb246IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIHJlZiwgcmVmMSwgcmVmMiwgczE7XG4gICAgaWYgKCgocmVmID0gZmllbGQuZm9ybXVsYSkgIT0gbnVsbCA/IHJlZi5pbmRleE9mKFwie3RyYWNlcy5cIikgOiB2b2lkIDApID4gLTEgfHwgKChyZWYxID0gZmllbGQuZm9ybXVsYSkgIT0gbnVsbCA/IHJlZjEuaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSkge1xuICAgICAgczEgPSBmaWVsZC5mb3JtdWxhLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLCBcIlwiKS5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgIGlmIChzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMikge1xuICAgICAgICBpZiAoKChyZWYyID0gczEuc3BsaXQoXCIuXCIpWzJdKSAhPSBudWxsID8gcmVmMi50b0xvY2FsZUxvd2VyQ2FzZSgpIDogdm9pZCAwKSA9PT0gJ2NjJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgbWFya0Rvd25Ub0h0bWw6IGZ1bmN0aW9uKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgaWYgKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKTtcbiAgICB9XG4gIH0sXG4gIGZfbGFiZWw6IGZ1bmN0aW9uKHRoYXQpIHtcbiAgICByZXR1cm4gdGhhdC5uYW1lIHx8IHRoYXQuY29kZTtcbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnN0ZWVkb3NfZm9ybSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1fdmVyc2lvbjtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc1NlY3Rpb24gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvbjtcbiAgICByZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKS50eXBlID09PSAnc2VjdGlvbic7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZG9jX3ZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnN0YW5jZTtcbiAgICBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlLnZhbHVlcztcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5hcHBsaWNhbnRDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGEsIGluc3RhbmNlO1xuICAgIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcbiAgICByZXR1cm4gZGF0YSA9IHtcbiAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgIGF0dHM6IHtcbiAgICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBpZDogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBcImNsYXNzXCI6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J1xuICAgICAgfSxcbiAgICAgIHZhbHVlOiBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuICAgIH07XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5maWVsZHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IHRoaXMuZm9ybV92ZXJzaW9uO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG4gICAgfVxuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZvcm1fdHlwZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICB9O1xuICBUZW1wbGF0ZS5yZWdpc3RlckhlbHBlcihcImFmRmllbGRMYWJlbFRleHRcIiwgZnVuY3Rpb24ob3ApIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uLCByZWY7XG4gICAgZm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbjtcbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsKGZvcm1fdmVyc2lvbi5maWVsZHMsIG9wICE9IG51bGwgPyAocmVmID0gb3AuaGFzaCkgIT0gbnVsbCA/IHJlZi5uYW1lIDogdm9pZCAwIDogdm9pZCAwKTtcbiAgfSk7XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuX3QgPSBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zX2F0dGFjaF9kb3dubG9hZF91cmwgPSBmdW5jdGlvbihfaWQsIGFic29sdXRlKSB7XG4gICAgaWYgKGFic29sdXRlKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXCIgKyBfaWQgKyBcIj9kb3dubG9hZD10cnVlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cIiArIF9pZCArIFwiP2Rvd25sb2FkPXRydWVcIjtcbiAgICB9XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMub3B0aW9ucyA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIG9wdGlvbnMsIHJlZiwgcmV2O1xuICAgIG9wdGlvbnMgPSBmaWVsZCAhPSBudWxsID8gKHJlZiA9IGZpZWxkLm9wdGlvbnMpICE9IG51bGwgPyByZWYuc3BsaXQoXCJcXG5cIikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgcmV2ID0gW107XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJldi5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogaXRlbSxcbiAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV2O1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmdldFBlcm1pc3Npb25zID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciByZWY7XG4gICAgaWYgKCEoKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhjb2RlKSA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiBcInJlYWRvbmx5IGRpc2FibGVkXCI7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9O1xufVxuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5ldmVudHMgPSB7XG4gICdjaGFuZ2UgLmZvcm0tY29udHJvbCwuY2hlY2tib3ggaW5wdXQsLmFmLXJhZGlvLWdyb3VwIGlucHV0LC5hZi1jaGVja2JveC1ncm91cCBpbnB1dCc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgcmV0dXJuIEluc3RhbmNlTWFuYWdlci5pbnN0YW5jZWZvcm1DaGFuZ2VFdmVudChldmVudCk7XG4gIH0sXG4gICd0eXBlYWhlYWQ6Y2hhbmdlIC5mb3JtLWNvbnRyb2wnOiBmdW5jdGlvbihldmVudCkge1xuICAgIHJldHVybiBJbnN0YW5jZU1hbmFnZXIuaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQoZXZlbnQpO1xuICB9LFxuICAnY2xpY2sgLmNmVGV4dGFyZWEgYSc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gU3RlZWRvcy5vcGVuV2luZG93KGV2ZW50LnRhcmdldC5ocmVmKTtcbiAgfVxufTtcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25DcmVhdGVkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb21waWxlZCwgZSwgaW5zdGFuY2UsIGluc3RhbmNlQ3VzdG9tVGVtcGxhdGUsIGluc3RhbmNlVmlldywgcmVuZGVyRnVuY3Rpb24sIHRlbXBsYXRlO1xuICBpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlKTtcbiAgdHJ5IHtcbiAgICBjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodGVtcGxhdGUsIHtcbiAgICAgIGlzQm9keTogdHJ1ZVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICBlID0gZXJyb3IxO1xuICAgIGNvbnNvbGUubG9nKFwiSW5zdGFuY2UgVGVtcGxhdGUgRXJyb3JcIiwgZSk7XG4gICAgY29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKFwiXCIsIHtcbiAgICAgIGlzQm9keTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlckZ1bmN0aW9uID0gZXZhbChjb21waWxlZCk7XG4gIGluc3RhbmNlVmlldyA9IG5ldyBCbGF6ZS5WaWV3KFwiY3VzdG9tX2luc3RhbmNlX3RlbXBsYXRlXCIsIHJlbmRlckZ1bmN0aW9uKTtcbiAgaW5zdGFuY2VDdXN0b21UZW1wbGF0ZSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShpbnN0YW5jZVZpZXcubmFtZSwgcmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUgPSBpbnN0YW5jZUN1c3RvbVRlbXBsYXRlO1xuICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlLmhlbHBlcnMoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5vblJlbmRlcmVkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjdXJyZW50QXBwcm92ZSwgY3VycmVudFN0ZXAsIGZvcm1fdmVyc2lvbiwgZm9ybXVsYV9maWVsZHMsIGluc2VydERvYywgaW5zdGFuY2UsIGluc3RhbmNlTnVtYmVyRmllbGRzLCBqdWRnZTtcbiAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBJbnN0YW5jZU1hbmFnZXIuc2V0SW5zdGFuY2VGb3JtQXBwbGljYW50KGluc3RhbmNlLmFwcGxpY2FudCwgaW5zdGFuY2UuYXBwbGljYW50X25hbWUpO1xuICBBcHByb3ZlTWFuYWdlci5lcnJvciA9IHtcbiAgICBuZXh0U3RlcHM6ICcnLFxuICAgIG5leHRTdGVwVXNlcnM6ICcnXG4gIH07XG4gIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2RyYWZ0Jykge1xuICAgIEluc3RhbmNlRXZlbnQuaW5pdEV2ZW50cyhpbnN0YW5jZS5mbG93KTtcbiAgfVxuICBpZiAoIUFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgIGN1cnJlbnRBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG4gICAgaW5zdGFuY2VOdW1iZXJGaWVsZHMgPSAkKFwiW2RhdGEtZm9ybXVsYV1cIiwgJChcIiNpbnN0YW5jZWZvcm1cIikpO1xuICAgIGluc3RhbmNlTnVtYmVyRmllbGRzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWxlbWVudCwgc2NoZW1hS2V5O1xuICAgICAgc2NoZW1hS2V5ID0gdGhpcy5kYXRhc2V0LnNjaGVtYUtleTtcbiAgICAgIGVsZW1lbnQgPSAkKHRoaXMpO1xuICAgICAgaWYgKCEkKHRoaXMpLnZhbCgpICYmIHNjaGVtYUtleSAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpIHtcbiAgICAgICAgcmV0dXJuIE1ldGVvci5jYWxsKCdnZXRJbnN0YW5jZVZhbHVlcycsIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSwgZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICAgIHZhciBrZXksIHJlZjtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnJvci5yZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlc3VsdFtzY2hlbWFLZXldKSB7XG4gICAgICAgICAgICBrZXkgPSAocmVmID0gZWxlbWVudC5kYXRhKFwiZm9ybXVsYVwiKSkgIT0gbnVsbCA/IHJlZi5yZXBsYWNlKFwiYXV0b19udW1iZXIoXCIsIFwiXCIpLnJlcGxhY2UoXCIpXCIsIFwiXCIpIDogdm9pZCAwO1xuICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcXCIvZywgXCJcIikucmVwbGFjZSgvXFwnL2csIFwiXCIpO1xuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKFwie1wiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgICAgICAgICAga2V5ID0ga2V5LnRyaW0oKTtcbiAgICAgICAgICAgICAga2V5ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShrZXksICdpbnN0YW5jZWZvcm0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBJbnN0YW5jZU51bWJlclJ1bGVzLmluc3RhbmNlTnVtYmVyQnVpbGRlcihlbGVtZW50LCBrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC52YWwocmVzdWx0W3NjaGVtYUtleV0pLnRyaWdnZXIoXCJjaGFuZ2VcIikgOiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBqdWRnZSA9IGN1cnJlbnRBcHByb3ZlLmp1ZGdlO1xuICAgIGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoIWZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWZvcm1fdmVyc2lvbi5maWVsZHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9ybXVsYV9maWVsZHMgPSBGb3JtX2Zvcm11bGEuZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUoXCJGb3JtX2Zvcm11bGEuZmllbGRfdmFsdWVzXCIsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgIGluc2VydERvYyA9IEF1dG9Gb3JtLmdldEZvcm1WYWx1ZXMoXCJpbnN0YW5jZWZvcm1cIiwgdm9pZCAwLCB2b2lkIDAsIGZhbHNlKTtcbiAgICBGb3JtX2Zvcm11bGEucnVuKFwiXCIsIFwiXCIsIGZvcm11bGFfZmllbGRzLCBpbnNlcnREb2MsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgIHJldHVybiBTZXNzaW9uLnNldChcImluc3RhbmNlX2Zvcm1fdmFsdWVzXCIsIHtcbiAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLl9pZCxcbiAgICAgIHZhbHVlczogaW5zZXJ0RG9jXG4gICAgfSk7XG4gIH1cbn07XG4iLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzID0ge1xuXG5cdHNob3dNYWluVGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLndvcmtmbG93TWFpbkF0dGFjaFRpdGxlLmdldCgpO1xuXHR9LFxuXHRpc0NsaWVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIE1ldGVvci5pc0NsaWVudFxuXHR9LFxuXHRlbmFibGVkX2FkZF9tYWluX2F0dGFjaG1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24gJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gXCJkcmFmdFwiICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiaW5ib3hcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0Ly8g5bey57uP57uT5p2f55qE5Y2V5a2Q5LiN6IO95pS56ZmE5Lu2XG5cdFx0aWYgKGlucy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHR2YXIgY3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cblx0XHRpZiAoIWN1cnJlbnRfc3RlcClcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIGNj55qE5Y2V5a2Q77yM5Y+q5pyJ5Zyo5b2T5YmN5q2l6aqk5omN6IO95L+u5pS56ZmE5Lu2XG5cdFx0dmFyIGFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcblx0XHRpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT0gXCJjY1wiKSB7XG5cdFx0XHR2YXIgY3VycmVudFRyYWNlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRUcmFjZSgpO1xuXHRcdFx0aWYoY3VycmVudFRyYWNlICYmIGN1cnJlbnRUcmFjZS5faWQgIT0gYXBwcm92ZS50cmFjZSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyDliIblj5HnmoTmraPmlofmiJbogIXpmYTku7bkuI3mmL7npLrovazkuLpwZGbmjInpkq5cblx0XHQvLyDlpoLmnpzmnInmraPmlofmnYPpmZDliJnkuLrmraPmlofvvIzlkKbliJnliIblj5HkuLrpmYTku7Zcblx0XHQvLyDliIblj5HnmoTpmYTku7bkuI3lhYHorrjkv67mlLkg5Yig6ZmkIOaWsOWinueJiOacrFxuXHRcdHZhciBtYWluX2F0dGFjaF9jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuX2lkLFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0fSkuY291bnQoKTtcblxuXHRcdHZhciBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50ID0gMDtcblxuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlKSB7XG5cdFx0XHR2YXIgc3RhcnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRTdGFydFN0ZXAoKTtcblx0XHRcdGlmIChzdGFydF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoKSB7XG5cdFx0XHRcdHZhciBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlLFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHRcdFx0fSkuY291bnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUgJiYgbWFpbl9hdHRhY2hfY291bnQgPCAxICYmIGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPCAxKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblxuXHRcdC8vIOato+aWh+acgOWkmuWPquiDveacieS4gOS4qlxuXHRcdGlmIChtYWluX2F0dGFjaF9jb3VudCA+PSAxIHx8IGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPj0gMSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIOW8gOWni+iKgueCueW5tuS4lOiuvue9ruS6huWPr+S7peS4iuS8oOato+aWh+aJjeaYvuekuuS4iuS8oOato+aWh+eahOaMiemSrlxuXHRcdHZhciBjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRpZiAoY3VycmVudF9zdGVwICYmIGN1cnJlbnRfc3RlcC5zdGVwX3R5cGUgPT0gXCJzdGFydFwiICYmIGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlKVxuXHRcdFx0cmV0dXJuIHRydWVcblxuXHRcdHJldHVybiBmYWxzZVxuXHR9LFxuXG5cdGVuYWJsZWRfZWRpdF9ub3JtYWxfYXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbiAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdHZhciBmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZsb3coaW5zLmZsb3cpO1xuXHRcdGlmICghZmxvdylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cblx0XHQvLyDliIblj5HlkI7nmoQg6ZmE5Lu277yM5LiN5Y+v5Lul57yW6L6RL+WIoOmZpO+8jOS5n+S4jeiuqeS4iuS8oOaWsOeahOmZhOS7tiwg5rWB56iL5YiX6KGo77ya5re75Yqg5bGe5oCnIOKAmOiiq+WIhuWPkeWQjuaYr+WQpuWFgeiuuOS4iuS8oOmZhOS7tuKAmSAjMTgzN1xuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlICYmICFmbG93LnVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZClcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiZHJhZnRcIiAmJiBTZXNzaW9uLmdldChcImJveFwiKSAhPSBcImluYm94XCIpIHtcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblxuXHRcdC8vIOW3sue7j+e7k+adn+eahOWNleWtkOS4jeiDveaUuemZhOS7tlxuXHRcdGlmIChpbnMuc3RhdGUgPT0gXCJjb21wbGV0ZWRcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0Ly8gY2PnmoTljZXlrZDvvIzlj6rmnInlnKjlvZPliY3mraXpqqTmiY3og73kv67mlLnpmYTku7Zcblx0XHR2YXIgYXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuXHRcdGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PSBcImNjXCIpIHtcblx0XHRcdHZhciBjdXJyZW50VHJhY2UgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFRyYWNlKCk7XG5cdFx0XHRpZihjdXJyZW50VHJhY2UgJiYgY3VycmVudFRyYWNlLl9pZCAhPSBhcHByb3ZlLnRyYWNlKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChJbnN0YW5jZU1hbmFnZXIuaXNDQyhpbnMpKSB7XG5cdFx0XHR2YXIgc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDQ1N0ZXAoKTtcblx0XHRcdGlmIChzdGVwICYmIChzdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBzdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdW5kZWZpbmVkKSlcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0aWYgKGN1cnJlbnRfc3RlcCAmJiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB1bmRlZmluZWQpKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZVxuXHR9LFxuXG5cdG1haW5fYXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHR2YXIgc3RhcnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRTdGFydFN0ZXAoKTtcblxuXHRcdC8vIOWmguaenOaYr+iiq+WIhuWPkeeahOeUs+ivt+WNleW5tuS4lOacieS/ruaUueato+aWh+eahOadg+mZkO+8jOWImeS8mOWFiOaYvuekuuWOn+eUs+ivt+WNleaWh+S7tlxuXHRcdHZhciBtYWluX2F0dGFjaCA9IG51bGw7XG5cdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgJiYgc3RhcnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlKSB7XG5cdFx0XHRtYWluX2F0dGFjaCA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsXG5cdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIW1haW5fYXR0YWNoKSB7XG5cdFx0XHRtYWluX2F0dGFjaCA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5faWQsXG5cdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFpbl9hdHRhY2g7XG5cdH0sXG5cblx0bm9ybWFsX2F0dGFjaG1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdHZhciBzZWxlY3RvciA9IHtcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzoge1xuXHRcdFx0XHQkbmU6IHRydWVcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHZhciBhdHRzID0gbmV3IEFycmF5KCk7XG5cblx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuXHRcdFx0Ly8g5aaC5p6c5piv6KKr5YiG5Y+R55qE55Sz6K+35Y2V77yM5YiZ5pi+56S65Y6f55Sz6K+35Y2V5paH5Lu2LCDlpoLmnpzpgInmi6nkuoblsIbljp/ooajljZXlrZjlgqjkuLrpmYTku7bkuZ/opoHmmL7npLosIOWQjOaXtuS5n+imgeaYvuekuuaWsOS4iuS8oOeahOmZhOS7tlxuXHRcdFx0dmFyIGRmaXMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRcdGRmaXMucHVzaChpbnMuX2lkKTtcblx0XHRcdHNlbGVjdG9yWydtZXRhZGF0YS5pbnN0YW5jZSddID0ge1xuXHRcdFx0XHQkaW46IGRmaXNcblx0XHRcdH07XG5cblxuXHRcdFx0c2VsZWN0b3JbXCIkb3JcIl0gPSBbe1xuXHRcdFx0XHRcIm1ldGFkYXRhLmluc3RhbmNlXCI6IGlucy5faWRcblx0XHRcdH0sIHtcblx0XHRcdFx0XCJtZXRhZGF0YS5pbnN0YW5jZVwiOiB7XG5cdFx0XHRcdFx0JGluOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIm1ldGFkYXRhLmlzX3ByaXZhdGVcIjoge1xuXHRcdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XVxuXG5cdFx0XHQvLyDlpoLmnpzljp/nlLPor7fljZXmnInmraPmlofkvYbmmK/liIblj5HlkI7msqHmnInmraPmlofmnYPpmZDvvIzliJnljp/nlLPor7fljZXmraPmlofmmL7npLrlnKjpmYTku7bmoI9cblx0XHRcdHZhciBzdGFydF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldFN0YXJ0U3RlcCgpO1xuXHRcdFx0aWYgKHN0YXJ0X3N0ZXAgJiYgc3RhcnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCAhPSB0cnVlKSB7XG5cdFx0XHRcdHZhciBkaXN0cmlidXRlX21haW4gPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoe1xuXHRcdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0XHRcdCRpbjogaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGlzdHJpYnV0ZV9tYWluKSB7XG5cdFx0XHRcdFx0dmFyIGZpcnN0VmVyc2lvbk1haW4gPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoZGlzdHJpYnV0ZV9tYWluLm1ldGFkYXRhLnBhcmVudCk7XG5cdFx0XHRcdFx0ZGlzdHJpYnV0ZV9tYWluLmF0dGFjaG1lbnRVcGxvYWRlZEF0ID0gZmlyc3RWZXJzaW9uTWFpbiA/IGZpcnN0VmVyc2lvbk1haW4udXBsb2FkZWRBdCA6IGRpc3RyaWJ1dGVfbWFpbi51cGxvYWRlZEF0O1xuXHRcdFx0XHRcdGF0dHMucHVzaChkaXN0cmlidXRlX21haW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdG9yWydtZXRhZGF0YS5pbnN0YW5jZSddID0gaW5zLl9pZDtcblx0XHR9XG5cblx0XHRjZnMuaW5zdGFuY2VzLmZpbmQoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdFx0dmFyIGZpcnN0VmVyc2lvbiA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZShjLm1ldGFkYXRhLnBhcmVudCk7XG5cdFx0XHRjLmF0dGFjaG1lbnRVcGxvYWRlZEF0ID0gZmlyc3RWZXJzaW9uID8gZmlyc3RWZXJzaW9uLnVwbG9hZGVkQXQgOiBjLnVwbG9hZGVkQXQ7XG5cdFx0XHRhdHRzLnB1c2goYyk7XG5cdFx0fSlcblxuXHRcdHJldHVybiBfLnNvcnRCeShhdHRzLCAnYXR0YWNobWVudFVwbG9hZGVkQXQnKTtcblx0fSxcblxuXHRzaG93QXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIOWmguaenOaYr+iiq+WIhuWPkeeahOeUs+ivt+WNle+8jOWImeaYvuekuuWOn+eUs+ivt+WNleaWh+S7tiDlkozliIblj5HlkI7nlLPor7fljZXmlofku7Zcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRpbnN0YW5jZUlkcy5wdXNoKGlucy5faWQpO1xuXHRcdHZhciBhdHRhY2htZW50c19jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWVcblx0XHR9KS5jb3VudCgpO1xuXG5cdFx0aWYgKFNlc3Npb24gJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpICYmIGF0dGFjaG1lbnRzX2NvdW50IDwgMSlcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09IFwiZHJhZnRcIiB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSBcImluYm94XCIgfHwgYXR0YWNobWVudHNfY291bnQgPiAwKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdF90OiBmdW5jdGlvbihrZXkpIHtcblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpXG5cdH0sXG5cblx0XzogZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIGxvY2FsZTtcblx0XHRpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcblx0XHR9XG5cdH0sXG5cblx0Zmxvd19maWxlczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjZnMuZmlsZXMuZmluZCh7ICdtZXRhZGF0YS5zcGFjZSc6IGlucy5zcGFjZSwgJ21ldGFkYXRhLm9iamVjdF9uYW1lJzogJ2Zsb3dzJywgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGlucy5mbG93IH0pO1xuXHR9LFxuXG5cdGlzRHJhZnRBbmRGbG93ZmlsZXNFeGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiAoU2Vzc2lvbi5nZXQoJ2JveCcpID09ICdkcmFmdCcpICYmICEhY2ZzLmZpbGVzLmZpbmQoeyAnbWV0YWRhdGEuc3BhY2UnOiBpbnMuc3BhY2UsICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBpbnMuZmxvdyB9KS5jb3VudCgpO1xuXHR9XG5cblxufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuX3QgPSBmdW5jdGlvbihrZXkpIHtcblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXHR9XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuZW5hYmxlZF9hZGRfbWFpbl9hdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH07XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH07XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5tYWluX2F0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jb21wYWN0KFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsIGluc3RhbmNlLl9pZF0pO1xuXHRcdHZhciBhdHRhY2htZW50ID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnQ7XG5cdH07XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5ub3JtYWxfYXR0YWNobWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RlZWRvc0RhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGFcblx0XHR2YXIgaW5zdGFuY2UgPSBzdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNsb25lKGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuXHRcdGluc3RhbmNlSWRzLnB1c2goaW5zdGFuY2UuX2lkKTtcblx0XHR2YXIgYXR0YWNobWVudHMgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB7XG5cdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCRvcjogW3tcblx0XHRcdFx0J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB7XG5cdFx0XHRcdFx0JG5lOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLFxuXHRcdFx0XHRcIm1ldGFkYXRhLm93bmVyXCI6IHN0ZWVkb3NEYXRhLnNlc3Npb25Vc2VySWQgfHwgc3RlZWRvc0RhdGEudXNlcklkIHx8ICctMScgLy8g6Ziy5q2i5pWw5o2u5byC5bi45pe2LOaYvuekuuS6huengeaciemZhOS7tlxuXHRcdFx0fV1cblx0XHR9KS5mZXRjaCgpO1xuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnRzO1xuXHR9O1xuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuc2hvd0F0dGFjaG1lbnRzID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY2xvbmUoaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG5cdFx0aW5zdGFuY2VJZHMucHVzaChpbnN0YW5jZS5faWQpO1xuXG5cdFx0dmFyIGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZVxuXHRcdH0pLmZldGNoKCk7XG5cblx0XHRpZiAoYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuc2hvd01haW5UaXRsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNvbXBhY3QoW2luc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSwgaW5zdGFuY2UuX2lkXSk7XG5cdFx0dmFyIG1haW5fYXR0YWNoX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdH0pLmNvdW50KCk7XG5cblx0XHRyZXR1cm4gbWFpbl9hdHRhY2hfY291bnQgPiAwXG5cdH1cbn1cbiIsIm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIilcbkluc3RhbmNlU2lnblRleHQuaGVscGVycyA9XG5cdHNob3c6IChzdGVwTmFtZSktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoJ2luc3RhbmNlUHJpbnQnKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRcdGlmIEluc3RhbmNlTWFuYWdlci5pc0luYm94KClcblx0XHRcdFx0bXlBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKClcblx0XHRcdFx0aWYgbXlBcHByb3ZlXG5cdFx0XHRcdFx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdFx0XHRteVRyYWNlID0gaW5zdGFuY2U/LnRyYWNlcz8uZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCBteUFwcHJvdmUudHJhY2UpXG5cdFx0XHRcdFx0cmV0dXJuIG15VHJhY2U/Lm5hbWUgPT0gc3RlcE5hbWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRkZWZhdWx0RGVzY3JpcHRpb246ICgpLT5cbiNcdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uIHx8IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9kZWZhdWx0X29waW5pb25cIilcblx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb25cblxuXHR0cmFjZXM6ICgpLT5cblx0XHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpXG5cblx0dHJhY2U6IChzdGVwTmFtZSwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduLCB0b3Bfa2V5d29yZHMpLT5cblx0XHRpbnN0YW5jZSA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UoKVxuXG5cdFx0aXNfY29tcGxldGVkID0gaW5zdGFuY2U/LnN0YXRlID09IFwiY29tcGxldGVkXCJcblxuXHRcdGNvbXBsZXRlZF9kYXRlID0gaWYgaXNfY29tcGxldGVkIHRoZW4gXy5sYXN0KGluc3RhbmNlLnRyYWNlcyk/LmZpbmlzaF9kYXRlPy5nZXRUaW1lKCkgZWxzZSAwXG5cblx0XHRpZiBpc19jb21wbGV0ZWQgJiYgaW5zdGFuY2UuZmluaXNoX2RhdGVcblx0XHRcdGNvbXBsZXRlZF9kYXRlID0gaW5zdGFuY2UuZmluaXNoX2RhdGU/LmdldFRpbWUoKVxuXG5cdFx0dHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKVxuXG5cdFx0YXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tzdGVwTmFtZV0pXG5cblx0XHRhcHByb3ZlX3NvcnQgPSAoYXBwcm92ZXMsIHRvcF9rZXl3b3JkcyktPlxuXG4j5a+5QXBwcm92ZXPmjpLluo/vvIwg5oyJ54Wn5o+Q5Lqk5pe26Ze05o6S5YCS5bqP77yM5aaC5p6c5rKh5pyJ5o+Q5Lqk5YiZ5pi+56S65Zyo5pyA5LiK6L65XG5cdFx0XHRhcHByb3Zlc19zb3J0ZWQgPSBfLnNvcnRCeSBhcHByb3ZlcywgKGFwcHJvdmUpLT5cblx0XHRcdFx0cmV0dXJuIC0oYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKClcblxuXHRcdFx0I+mAmui/h+WFs+mUruWtl+aOkuW6j1xuXHRcdFx0aWYgdG9wX2tleXdvcmRzXG5cdFx0XHRcdHRvcF9hcHByb3ZlcyA9IG5ldyBBcnJheSgpXG5cblx0XHRcdFx0dG9wX2tleXdvcmRzLnNwbGl0KFwiLFwiKS5mb3JFYWNoIChrZXkpIC0+XG5cdFx0XHRcdFx0dG9wX2FwcHJvdmVzID0gXy51bmlvbiB0b3BfYXBwcm92ZXMsIF8uZmlsdGVyKGFwcHJvdmVzX3NvcnRlZCwgKGFwcHJvdmUpLT5cblx0XHRcdFx0XHRcdHJldHVybiBhcHByb3ZlPy5oYW5kbGVyX25hbWU/LmluZGV4T2Yoa2V5KSA+IC0xXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQjIOWvuee9rumhtuaEj+ingeaMieeFp+WkhOeQhuS6i+S7tuaOkuWAkuW6j1xuXHRcdFx0XHR0b3BfYXBwcm92ZXMgPSBfLnNvcnRCeSB0b3BfYXBwcm92ZXMsICh0b3BfYXBwcm92ZSktPlxuXHRcdFx0XHRcdHJldHVybiAtKHRvcF9hcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKVxuXG5cdFx0XHRcdGFwcHJvdmVzX3NvcnRlZCA9IF8udW5pb24gdG9wX2FwcHJvdmVzLCBhcHByb3Zlc19zb3J0ZWRcblx0XHRcdHJldHVybiBhcHByb3Zlc19zb3J0ZWQgfHwgW11cblxuXHRcdGFwcHJvdmVzID0gXy5maWx0ZXIgYXBwcm92ZXMsIChhKS0+XG5cdFx0XHRyZXR1cm4gYS50eXBlIGlzbnQgXCJmb3J3YXJkXCIgYW5kIGEudHlwZSBpc250IFwiZGlzdHJpYnV0ZVwiIGFuZCBhLnR5cGUgaXNudCBcInRlcm1pbmF0ZWRcIlxuXG5cdFx0aWYgb25seV9jY19vcGluaW9uXG5cdFx0XHRhcHByb3ZlcyA9IGFwcHJvdmVzPy5maWx0ZXJQcm9wZXJ0eShcInR5cGVcIiwgXCJjY1wiKVxuXG5cdFx0YXBwcm92ZXNfc29ydGVkID0gYXBwcm92ZV9zb3J0KGFwcHJvdmVzLCB0b3Bfa2V5d29yZHMpXG5cblx0XHRhcHByb3Zlc0dyb3VwID0gXy5ncm91cEJ5KGFwcHJvdmVzLCBcImhhbmRsZXJcIik7XG5cblx0XHRoYXNOZXh0ID0gKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIC0+XG5cdFx0XHRoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl1cblx0XHRcdHJldHVybiBfLmluZGV4T2YoaGFuZGxlckFwcHJvdmVzLCBhcHByb3ZlKSArIDEgPCBoYW5kbGVyQXBwcm92ZXMubGVuZ3RoXG5cblx0XHRoYXZlRGVzY3JpcHRpb25BcHByb3ZlID0gKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIC0+XG5cdFx0XHRoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl1cblxuXHRcdFx0ZGVzY3JpcHRpb25BcHByb3ZlcyA9IF8uZmlsdGVyIGhhbmRsZXJBcHByb3ZlcywgKGEpLT5cblx0XHRcdFx0aWYgYS5kZXNjcmlwdGlvblxuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRpZiBkZXNjcmlwdGlvbkFwcHJvdmVzLmxlbmd0aCA9PSAwXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cblx0XHRhcHByb3Zlc19zb3J0ZWQuZm9yRWFjaCAoYXBwcm92ZSkgLT5cbiNcdFx0XHTmnInovpPlhaXmhI/op4Eg5oiWIOacgOaWsOS4gOadoeW5tuS4lOeUqOaIt+ayoeaciei+k+WFpei/h+aEj+ingVxuI1x0XHRcdGlmICFhcHByb3ZlLmlzX2ZpbmlzaGVkIHx8IGFwcHJvdmUuZGVzY3JpcHRpb24gfHwgKCFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApICYmICFoYXZlRGVzY3JpcHRpb25BcHByb3ZlKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApKVxuI1x0XHRcdGlmICFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApXG5cdFx0XHRpZiBhcHByb3ZlLnNpZ25fc2hvdyAhPSBmYWxzZSAmJiAoYXBwcm92ZS5kZXNjcmlwdGlvbiB8fCAoIWFwcHJvdmUuZGVzY3JpcHRpb24gJiYgIWhhc05leHQoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgJiYgIWFwcHJvdmUuaXNfZmluaXNoZWQpIHx8IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud29ya2Zsb3c/LnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbilcblx0XHRcdFx0aWYgYXBwcm92ZS5qdWRnZSBpc250ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHRcdGFwcHJvdmUuX2Rpc3BsYXkgPSB0cnVlXG5cblx0XHRhcHByb3Zlc19zb3J0ZWQgPSBfLmZpbHRlciBhcHByb3Zlc19zb3J0ZWQsIChhKSAtPlxuXHRcdFx0aWYgaXNfY29tcGxldGVkXG5cdFx0XHRcdHJldHVybiBhLl9kaXNwbGF5ID09IHRydWUgJiYgYS5pc19maW5pc2hlZCAmJiBhLmZpbmlzaF9kYXRlPy5nZXRUaW1lKCkgPD0gY29tcGxldGVkX2RhdGVcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGEuX2Rpc3BsYXkgPT0gdHJ1ZVxuXHRcdHJldHVybiBhcHByb3Zlc19zb3J0ZWRcblxuXHRpbmNsdWRlOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlKGEsIGIpXG5cblx0dW5lbXB0eTogKHZhbCktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnVuZW1wdHkodmFsKSB8fCBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndvcmtmbG93Py5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb25cblxuXHRmb3JtYXREYXRlOiAoZGF0ZSwgb3B0aW9ucyktPlxuXHRcdGlmICFvcHRpb25zXG5cdFx0XHRvcHRpb25zID0ge1wiZm9ybWF0XCI6IFwiWVlZWS1NTS1ERFwifVxuXG5cdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZm9ybWF0RGF0ZShkYXRlLCBvcHRpb25zKVxuXG5cdGlzTXlBcHByb3ZlOiAoYXBwcm92ZSwgb25seV9jY19vcGluaW9uKSAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gJ2luYm94J1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0Y3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKVxuXG5cdFx0XHRpZiAhYXBwcm92ZT8uX2lkXG5cdFx0XHRcdGFwcHJvdmUgPSBjdXJyZW50QXBwcm92ZVxuXG5cdFx0XHRpZiBhcHByb3ZlLl9pZCA9PSBjdXJyZW50QXBwcm92ZT8uX2lkICYmIGN1cnJlbnRBcHByb3ZlPy50eXBlID09ICdjYycgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWVcblx0XHRcdFx0aWYgXy5pbmRleE9mKGN1cnJlbnRBcHByb3ZlPy5vcGluaW9uX2ZpZWxkc19jb2RlLCBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSkgPiAtMVxuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0aWYgIShjdXJyZW50QXBwcm92ZT8udHlwZSA9PSAnY2MnKSAmJiBvbmx5X2NjX29waW5pb25cblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcdGlmIGN1cnJlbnRBcHByb3ZlICYmIGFwcHJvdmUuX2lkID09IGN1cnJlbnRBcHByb3ZlLl9pZFxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdG15QXBwcm92ZURlc2NyaXB0aW9uOiAoYXBwcm92ZUlkKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdG15QXBwcm92ZSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/Lm15QXBwcm92ZT8uZ2V0KClcblx0XHRcdFx0aWYgbXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PSBhcHByb3ZlSWRcblx0XHRcdFx0XHRpZiAhbXlBcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlID09IFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGE/Lm5hbWVcblx0XHRcdFx0XHRcdGlmICFTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG15QXBwcm92ZT8uZGVzY3JpcHRpb24gfHwgXCJcIlxuXHRcdFx0XHRcdFx0cmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXG5cdG5vdzogKCktPlxuXHRcdHJldHVybiBuZXcgRGF0ZSgpO1xuXG5cdGlzUmVhZE9ubHk6ICgpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRpc09waW5pb25PZkZpZWxkOiAoYXBwcm92ZSktPlxuXHRcdGlmIGFwcHJvdmUudHlwZSA9PSBcImNjXCIgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWVcblx0XHRcdGlmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lID09IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKGhyZWYsIHRpdGxlLCB0ZXh0KSAtPlxuXHRcdFx0IyBcdHJldHVybiBcIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScje2hyZWZ9JyB0aXRsZT0nI3t0aXRsZX0nPiN7dGV4dH08L2E+XCJcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJylcblx0XHRcdHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKVxuXG5cdHN0ZXBzOiAoZmllbGRfZm9ybXVsYSwgc3RlcCwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduKS0+XG5cdFx0c3RlcHMgPSBbXVxuXHRcdGlmICFzdGVwXG5cdFx0XHRpZiAhZmllbGRfZm9ybXVsYVxuXHRcdFx0XHRmaWVsZF9mb3JtdWxhID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKT8uZmllbGRzPy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCB0aGlzLm5hbWUpLmZvcm11bGFcblx0XHRcdHN0ZXBzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRPcGluaW9uRmllbGRTdGVwc05hbWUoZmllbGRfZm9ybXVsYSwgVGVtcGxhdGUuaW5zdGFuY2UoKT8uZGF0YS50b3Bfa2V5d29yZHMpXG5cdFx0ZWxzZVxuXHRcdFx0c3RlcHMgPSBbe3N0ZXBOYW1lOiBzdGVwLCBvbmx5X2NjX29waW5pb246IG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbjogaW1hZ2Vfc2lnbn1dXG5cdFx0cmV0dXJuIHN0ZXBzXG5cblx0aW1hZ2VTaWduRGF0YTogKGhhbmRsZXIpIC0+XG5cdFx0cmV0dXJuIHt1c2VyOiBoYW5kbGVyfVxuXG5cdHNob3dTaWduSW1hZ2U6IChoYW5kbGVyLCBpbWFnZV9zaWduLCBqdWRnZSkgLT5cblx0XHRpZiBbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKVxuXG5cdFx0aWYgc3BhY2VVc2VyU2lnbj8uc2lnbiAmJiBpbWFnZV9zaWduXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdGdldExhc3RTaWduQXBwcm92ZTogKCktPlxuXHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0cmV0dXJuIF8ubGFzdChUcmFjZXNNYW5hZ2VyLmdldEhhbmRsZXJTaWduU2hvd0FwcHJvdmVzIGlucywgTWV0ZW9yLnVzZXJJZCgpKVxuXG5cblx0bGFzdE15QXBwcm92ZURlc2NyaXB0aW9uOiAoKS0+XG5cdFx0dHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKVxuXHRcdGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cdFx0YXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tjdXJyZW50U3RlcC5uYW1lXSlcblxuXHRcdGFwcHJvdmVzID0gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIE1ldGVvci51c2VySWQoKSlcblxuXHRcdGlmIGFwcHJvdmVzLmxlbmd0aCA+IDFcblx0XHRcdHJldHVybiBhcHByb3Zlc1thcHByb3Zlcy5sZW5ndGggLSAyXT8uZGVzY3JpcHRpb25cblxuXHRcdHJldHVybiBcIlwiO1xuXG5cdHNob3dBcHByb3ZlOiAoYXBwcm92ZSktPlxuXHRcdGlmICFhcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5kYXRhPy5uYW1lXG5cdFx0XHRpZiBhcHByb3ZlPy5pc19yZWFkXG5cdFx0XHRcdGlmIGFwcHJvdmUuaXNfZmluaXNoZWRcblx0XHRcdFx0XHRyZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhhcHByb3ZlLmp1ZGdlKVxuXHRcdHJldHVybiBmYWxzZTtcblxuXHRqdWRnZV9kZXNjcmlwdGlvbjogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIHQoanVkZ2UgKyBcIl9kZXNjcmlwdGlvblwiKVxuXG5cdGlzX2FwcHJvdmVkOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4gXCJhcHByb3ZlZFwiID09IGp1ZGdlXG5cblx0aXNfcmVqZWN0ZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBcInJlamVjdGVkXCIgPT0ganVkZ2VcblxuXHRpc19yZWFkZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGp1ZGdlKVxuXG5cdGFkZENsYXNzOiAoKS0+XG5cdFx0bmFtZSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGE/Lm5hbWVcblx0XHRzZXRUaW1lb3V0ICgpIC0+XG5cdFx0XHR0cnlcblx0XHRcdFx0ZWxlbWVudCA9ICQoXCIuYXV0b21hdGljLm9waW5pb24tZmllbGQtXCIgKyBuYW1lKVxuXHRcdFx0XHRpZiBlbGVtZW50Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRpZiBlbGVtZW50Py5pcyhcInRkXCIpXG5cdFx0XHRcdFx0XHRlbGVtZW50LmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0JChcIi5pbnN0YW5jZS1zaWduXCIsIGVsZW1lbnQpLmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUubG9nIGVcblx0XHQsIDFcblx0XHRyZXR1cm4gJydcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdEluc3RhbmNlU2lnblRleHQuaGVscGVycy5kZWZhdWx0RGVzY3JpcHRpb24gPSAtPlxuXHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb24gfHwgVEFQaTE4bi5fXyhcImluc3RhbmNlX2RlZmF1bHRfb3BpbmlvblwiLCB7fSwgbG9jYWxlKSIsInZhciBtYXJrZWQ7XG5cbm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIik7XG5cbkluc3RhbmNlU2lnblRleHQuaGVscGVycyA9IHtcbiAgc2hvdzogZnVuY3Rpb24oc3RlcE5hbWUpIHtcbiAgICB2YXIgaW5zdGFuY2UsIG15QXBwcm92ZSwgbXlUcmFjZSwgcmVmO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldCgnaW5zdGFuY2VQcmludCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChJbnN0YW5jZU1hbmFnZXIuaXNJbmJveCgpKSB7XG4gICAgICAgIG15QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuICAgICAgICBpZiAobXlBcHByb3ZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICBteVRyYWNlID0gaW5zdGFuY2UgIT0gbnVsbCA/IChyZWYgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwgPyByZWYuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCBteUFwcHJvdmUudHJhY2UpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiAobXlUcmFjZSAhPSBudWxsID8gbXlUcmFjZS5uYW1lIDogdm9pZCAwKSA9PT0gc3RlcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWZhdWx0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvbjtcbiAgfSxcbiAgdHJhY2VzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKTtcbiAgfSxcbiAgdHJhY2U6IGZ1bmN0aW9uKHN0ZXBOYW1lLCBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ24sIHRvcF9rZXl3b3Jkcykge1xuICAgIHZhciBhcHByb3ZlX3NvcnQsIGFwcHJvdmVzLCBhcHByb3Zlc0dyb3VwLCBhcHByb3Zlc19zb3J0ZWQsIGNvbXBsZXRlZF9kYXRlLCBoYXNOZXh0LCBoYXZlRGVzY3JpcHRpb25BcHByb3ZlLCBpbnN0YW5jZSwgaXNfY29tcGxldGVkLCByZWYsIHJlZjEsIHJlZjIsIHRyYWNlcztcbiAgICBpbnN0YW5jZSA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UoKTtcbiAgICBpc19jb21wbGV0ZWQgPSAoaW5zdGFuY2UgIT0gbnVsbCA/IGluc3RhbmNlLnN0YXRlIDogdm9pZCAwKSA9PT0gXCJjb21wbGV0ZWRcIjtcbiAgICBjb21wbGV0ZWRfZGF0ZSA9IGlzX2NvbXBsZXRlZCA/IChyZWYgPSBfLmxhc3QoaW5zdGFuY2UudHJhY2VzKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmZpbmlzaF9kYXRlKSAhPSBudWxsID8gcmVmMS5nZXRUaW1lKCkgOiB2b2lkIDAgOiB2b2lkIDAgOiAwO1xuICAgIGlmIChpc19jb21wbGV0ZWQgJiYgaW5zdGFuY2UuZmluaXNoX2RhdGUpIHtcbiAgICAgIGNvbXBsZXRlZF9kYXRlID0gKHJlZjIgPSBpbnN0YW5jZS5maW5pc2hfZGF0ZSkgIT0gbnVsbCA/IHJlZjIuZ2V0VGltZSgpIDogdm9pZCAwO1xuICAgIH1cbiAgICB0cmFjZXMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpO1xuICAgIGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbc3RlcE5hbWVdKTtcbiAgICBhcHByb3ZlX3NvcnQgPSBmdW5jdGlvbihhcHByb3ZlcywgdG9wX2tleXdvcmRzKSB7XG4gICAgICB2YXIgYXBwcm92ZXNfc29ydGVkLCB0b3BfYXBwcm92ZXM7XG4gICAgICBhcHByb3Zlc19zb3J0ZWQgPSBfLnNvcnRCeShhcHByb3ZlcywgZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICByZXR1cm4gLShhcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRvcF9rZXl3b3Jkcykge1xuICAgICAgICB0b3BfYXBwcm92ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdG9wX2tleXdvcmRzLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiB0b3BfYXBwcm92ZXMgPSBfLnVuaW9uKHRvcF9hcHByb3ZlcywgXy5maWx0ZXIoYXBwcm92ZXNfc29ydGVkLCBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgICB2YXIgcmVmMztcbiAgICAgICAgICAgIHJldHVybiAoYXBwcm92ZSAhPSBudWxsID8gKHJlZjMgPSBhcHByb3ZlLmhhbmRsZXJfbmFtZSkgIT0gbnVsbCA/IHJlZjMuaW5kZXhPZihrZXkpIDogdm9pZCAwIDogdm9pZCAwKSA+IC0xO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvcF9hcHByb3ZlcyA9IF8uc29ydEJ5KHRvcF9hcHByb3ZlcywgZnVuY3Rpb24odG9wX2FwcHJvdmUpIHtcbiAgICAgICAgICByZXR1cm4gLSh0b3BfYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhcHByb3Zlc19zb3J0ZWQgPSBfLnVuaW9uKHRvcF9hcHByb3ZlcywgYXBwcm92ZXNfc29ydGVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcHByb3Zlc19zb3J0ZWQgfHwgW107XG4gICAgfTtcbiAgICBhcHByb3ZlcyA9IF8uZmlsdGVyKGFwcHJvdmVzLCBmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gYS50eXBlICE9PSBcImZvcndhcmRcIiAmJiBhLnR5cGUgIT09IFwiZGlzdHJpYnV0ZVwiICYmIGEudHlwZSAhPT0gXCJ0ZXJtaW5hdGVkXCI7XG4gICAgfSk7XG4gICAgaWYgKG9ubHlfY2Nfb3Bpbmlvbikge1xuICAgICAgYXBwcm92ZXMgPSBhcHByb3ZlcyAhPSBudWxsID8gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJ0eXBlXCIsIFwiY2NcIikgOiB2b2lkIDA7XG4gICAgfVxuICAgIGFwcHJvdmVzX3NvcnRlZCA9IGFwcHJvdmVfc29ydChhcHByb3ZlcywgdG9wX2tleXdvcmRzKTtcbiAgICBhcHByb3Zlc0dyb3VwID0gXy5ncm91cEJ5KGFwcHJvdmVzLCBcImhhbmRsZXJcIik7XG4gICAgaGFzTmV4dCA9IGZ1bmN0aW9uKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIHtcbiAgICAgIHZhciBoYW5kbGVyQXBwcm92ZXM7XG4gICAgICBoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl07XG4gICAgICByZXR1cm4gXy5pbmRleE9mKGhhbmRsZXJBcHByb3ZlcywgYXBwcm92ZSkgKyAxIDwgaGFuZGxlckFwcHJvdmVzLmxlbmd0aDtcbiAgICB9O1xuICAgIGhhdmVEZXNjcmlwdGlvbkFwcHJvdmUgPSBmdW5jdGlvbihhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSB7XG4gICAgICB2YXIgZGVzY3JpcHRpb25BcHByb3ZlcywgaGFuZGxlckFwcHJvdmVzO1xuICAgICAgaGFuZGxlckFwcHJvdmVzID0gYXBwcm92ZXNHcm91cFthcHByb3ZlLmhhbmRsZXJdO1xuICAgICAgZGVzY3JpcHRpb25BcHByb3ZlcyA9IF8uZmlsdGVyKGhhbmRsZXJBcHByb3ZlcywgZnVuY3Rpb24oYSkge1xuICAgICAgICBpZiAoYS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRlc2NyaXB0aW9uQXBwcm92ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYXBwcm92ZXNfc29ydGVkLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgdmFyIHJlZjM7XG4gICAgICBpZiAoYXBwcm92ZS5zaWduX3Nob3cgIT09IGZhbHNlICYmIChhcHByb3ZlLmRlc2NyaXB0aW9uIHx8ICghYXBwcm92ZS5kZXNjcmlwdGlvbiAmJiAhaGFzTmV4dChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAmJiAhYXBwcm92ZS5pc19maW5pc2hlZCkgfHwgKChyZWYzID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93KSAhPSBudWxsID8gcmVmMy5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb24gOiB2b2lkIDApKSkge1xuICAgICAgICBpZiAoYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcHJvdmUuX2Rpc3BsYXkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXBwcm92ZXNfc29ydGVkID0gXy5maWx0ZXIoYXBwcm92ZXNfc29ydGVkLCBmdW5jdGlvbihhKSB7XG4gICAgICB2YXIgcmVmMztcbiAgICAgIGlmIChpc19jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGEuX2Rpc3BsYXkgPT09IHRydWUgJiYgYS5pc19maW5pc2hlZCAmJiAoKHJlZjMgPSBhLmZpbmlzaF9kYXRlKSAhPSBudWxsID8gcmVmMy5nZXRUaW1lKCkgOiB2b2lkIDApIDw9IGNvbXBsZXRlZF9kYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGEuX2Rpc3BsYXkgPT09IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFwcHJvdmVzX3NvcnRlZDtcbiAgfSxcbiAgaW5jbHVkZTogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGUoYSwgYik7XG4gIH0sXG4gIHVuZW1wdHk6IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudW5lbXB0eSh2YWwpIHx8ICgocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93KSAhPSBudWxsID8gcmVmLnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiA6IHZvaWQgMCk7XG4gIH0sXG4gIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIFwiZm9ybWF0XCI6IFwiWVlZWS1NTS1ERFwiXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpO1xuICB9LFxuICBpc015QXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZSwgb25seV9jY19vcGluaW9uKSB7XG4gICAgdmFyIGN1cnJlbnRBcHByb3ZlLCBpbnM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9PSAnaW5ib3gnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgY3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcbiAgICAgIGlmICghKGFwcHJvdmUgIT0gbnVsbCA/IGFwcHJvdmUuX2lkIDogdm9pZCAwKSkge1xuICAgICAgICBhcHByb3ZlID0gY3VycmVudEFwcHJvdmU7XG4gICAgICB9XG4gICAgICBpZiAoYXBwcm92ZS5faWQgPT09IChjdXJyZW50QXBwcm92ZSAhPSBudWxsID8gY3VycmVudEFwcHJvdmUuX2lkIDogdm9pZCAwKSAmJiAoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLnR5cGUgOiB2b2lkIDApID09PSAnY2MnICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSB7XG4gICAgICAgIGlmIChfLmluZGV4T2YoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLm9waW5pb25fZmllbGRzX2NvZGUgOiB2b2lkIDAsIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoISgoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLnR5cGUgOiB2b2lkIDApID09PSAnY2MnKSAmJiBvbmx5X2NjX29waW5pb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRBcHByb3ZlICYmIGFwcHJvdmUuX2lkID09PSBjdXJyZW50QXBwcm92ZS5faWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgbXlBcHByb3ZlRGVzY3JpcHRpb246IGZ1bmN0aW9uKGFwcHJvdmVJZCkge1xuICAgIHZhciBteUFwcHJvdmUsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgbXlBcHByb3ZlID0gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5teUFwcHJvdmUpICE9IG51bGwgPyByZWYxLmdldCgpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICBpZiAobXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PT0gYXBwcm92ZUlkKSB7XG4gICAgICAgICAgaWYgKCFteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlIHx8IG15QXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgPT09ICgocmVmMiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMyA9IHJlZjIuZGF0YSkgIT0gbnVsbCA/IHJlZjMubmFtZSA6IHZvaWQgMCA6IHZvaWQgMCkpIHtcbiAgICAgICAgICAgIGlmICghU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiAobXlBcHByb3ZlICE9IG51bGwgPyBteUFwcHJvdmUuZGVzY3JpcHRpb24gOiB2b2lkIDApIHx8IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbm93OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgfSxcbiAgaXNSZWFkT25seTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc09waW5pb25PZkZpZWxkOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGFwcHJvdmUudHlwZSA9PT0gXCJjY1wiICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSB7XG4gICAgICBpZiAoVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUgPT09IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIG1hcmtEb3duVG9IdG1sOiBmdW5jdGlvbihtYXJrRG93blN0cmluZykge1xuICAgIGlmIChtYXJrRG93blN0cmluZykge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICBtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSk7XG4gICAgfVxuICB9LFxuICBzdGVwczogZnVuY3Rpb24oZmllbGRfZm9ybXVsYSwgc3RlcCwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduKSB7XG4gICAgdmFyIHJlZiwgcmVmMSwgcmVmMiwgc3RlcHM7XG4gICAgc3RlcHMgPSBbXTtcbiAgICBpZiAoIXN0ZXApIHtcbiAgICAgIGlmICghZmllbGRfZm9ybXVsYSkge1xuICAgICAgICBmaWVsZF9mb3JtdWxhID0gKHJlZiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5maWVsZHMpICE9IG51bGwgPyByZWYxLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIHRoaXMubmFtZSkuZm9ybXVsYSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHN0ZXBzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRPcGluaW9uRmllbGRTdGVwc05hbWUoZmllbGRfZm9ybXVsYSwgKHJlZjIgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gcmVmMi5kYXRhLnRvcF9rZXl3b3JkcyA6IHZvaWQgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc3RlcE5hbWU6IHN0ZXAsXG4gICAgICAgICAgb25seV9jY19vcGluaW9uOiBvbmx5X2NjX29waW5pb24sXG4gICAgICAgICAgaW1hZ2Vfc2lnbjogaW1hZ2Vfc2lnblxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHM7XG4gIH0sXG4gIGltYWdlU2lnbkRhdGE6IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcjogaGFuZGxlclxuICAgIH07XG4gIH0sXG4gIHNob3dTaWduSW1hZ2U6IGZ1bmN0aW9uKGhhbmRsZXIsIGltYWdlX3NpZ24sIGp1ZGdlKSB7XG4gICAgdmFyIHNwYWNlVXNlclNpZ247XG4gICAgaWYgKFsncmV0dXJuZWQnLCAndGVybWluYXRlZCcsICdyZXRyaWV2ZWQnXS5pbmNsdWRlcyhqdWRnZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24oaGFuZGxlcik7XG4gICAgaWYgKChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApICYmIGltYWdlX3NpZ24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBnZXRMYXN0U2lnbkFwcHJvdmU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnM7XG4gICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgcmV0dXJuIF8ubGFzdChUcmFjZXNNYW5hZ2VyLmdldEhhbmRsZXJTaWduU2hvd0FwcHJvdmVzKGlucywgTWV0ZW9yLnVzZXJJZCgpKSk7XG4gIH0sXG4gIGxhc3RNeUFwcHJvdmVEZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFwcHJvdmVzLCBjdXJyZW50U3RlcCwgcmVmLCB0cmFjZXM7XG4gICAgdHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKTtcbiAgICBjdXJyZW50U3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgIGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbY3VycmVudFN0ZXAubmFtZV0pO1xuICAgIGFwcHJvdmVzID0gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIE1ldGVvci51c2VySWQoKSk7XG4gICAgaWYgKGFwcHJvdmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiAocmVmID0gYXBwcm92ZXNbYXBwcm92ZXMubGVuZ3RoIC0gMl0pICE9IG51bGwgPyByZWYuZGVzY3JpcHRpb24gOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9LFxuICBzaG93QXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIHZhciByZWYsIHJlZjE7XG4gICAgaWYgKCFhcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PT0gKChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGF0YSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMCkpIHtcbiAgICAgIGlmIChhcHByb3ZlICE9IG51bGwgPyBhcHByb3ZlLmlzX3JlYWQgOiB2b2lkIDApIHtcbiAgICAgICAgaWYgKGFwcHJvdmUuaXNfZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhhcHByb3ZlLmp1ZGdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGp1ZGdlX2Rlc2NyaXB0aW9uOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiB0KGp1ZGdlICsgXCJfZGVzY3JpcHRpb25cIik7XG4gIH0sXG4gIGlzX2FwcHJvdmVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBcImFwcHJvdmVkXCIgPT09IGp1ZGdlO1xuICB9LFxuICBpc19yZWplY3RlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4gXCJyZWplY3RlZFwiID09PSBqdWRnZTtcbiAgfSxcbiAgaXNfcmVhZGVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGp1ZGdlKTtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuYW1lLCByZWYsIHJlZjE7XG4gICAgbmFtZSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGF0YSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUsIGVsZW1lbnQ7XG4gICAgICB0cnkge1xuICAgICAgICBlbGVtZW50ID0gJChcIi5hdXRvbWF0aWMub3Bpbmlvbi1maWVsZC1cIiArIG5hbWUpO1xuICAgICAgICBpZiAoZWxlbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuaXMoXCJ0ZFwiKSA6IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAkKFwiLmluc3RhbmNlLXNpZ25cIiwgZWxlbWVudCkuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cbiAgICB9LCAxKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgSW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzLmRlZmF1bHREZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb24gfHwgVEFQaTE4bi5fXyhcImluc3RhbmNlX2RlZmF1bHRfb3BpbmlvblwiLCB7fSwgbG9jYWxlKTtcbiAgfTtcbn1cbiIsIm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIilcblRyYWNlc1RlbXBsYXRlLmhlbHBlcnMgPVxuXHR0cmFjZVNob3dTaWduSW1hZ2U6ICgpLT5cblx0XHRyZXR1cm4gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT0gZmFsc2UgJiYgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT0gJ2ZhbHNlJ1xuXHRlcXVhbHM6IChhLCBiKSAtPlxuXHRcdGEgPT0gYlxuXHRlbXB0eTogKGEpIC0+XG5cdFx0aWYgYVxuXHRcdFx0YS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPCAxXG5cdFx0ZWxzZVxuXHRcdFx0dHJ1ZVxuXHR1bmVtcHR5OiAoYSkgLT5cblx0XHRpZiBhXG5cdFx0XHRhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA+IDBcblx0XHRlbHNlXG5cdFx0XHRmYWxzZVxuXG5cdGFwcGVuZDogKGEsIGIpIC0+XG5cdFx0YSArIGJcblxuXHRkYXRlRm9ybWF0OiAoZGF0ZSkgLT5cblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiBkYXRlPy5nZXRGdWxsWWVhcigpID09IChuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKVxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU0tREQgSEg6bW0nKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblxuXHRnZXRTdGVwTmFtZTogKHN0ZXBJZCkgLT5cblx0XHRzdGVwID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlU3RlcChzdGVwSWQpXG5cdFx0aWYgc3RlcFxuXHRcdFx0cmV0dXJuIHN0ZXAubmFtZVxuXHRcdG51bGxcblx0c2hvd0RlbGV0ZUJ1dHRvbjogKGFwcHJvdmVkKSAtPlxuXHRcdGlmIGFwcHJvdmVkIGFuZCBhcHByb3ZlZC50eXBlID09ICdjYycgYW5kIGFwcHJvdmVkLmZyb21fdXNlciA9PSBNZXRlb3IudXNlcklkKCkgYW5kIGFwcHJvdmVkLmlzX2ZpbmlzaGVkICE9IHRydWUgYW5kICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0aXNTaG93TW9kaWZpY2F0aW9uQnV0dG9uOiAoYXBwcm92ZWQpIC0+XG5cdFx0YXBwcm92ZV9hZG1pbnMgPSBNZXRlb3Iuc2V0dGluZ3M/LnB1YmxpYz8ud29ya2Zsb3c/LmFwcHJvdmVfYWRtaW5zXG5cdFx0aWYgYXBwcm92ZV9hZG1pbnM/Lmxlbmd0aFxuXHRcdFx0aXNTaG93ID0gYXBwcm92ZV9hZG1pbnM/LmNvbnRhaW5zIE1ldGVvci51c2VySWQoKVxuXHRcdHVubGVzcyBpc1Nob3dcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHJldHVybiBhcHByb3ZlZC5oYW5kbGVyID09IE1ldGVvci51c2VySWQoKVxuXHRpc0VkaXRpbmc6ICgpIC0+XG5cdFx0IHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmlzX2VkaXRpbmc/LmdldCgpXG5cdGlzU2hvd0Rlc2NyaXB0aW9uOiAoYXBwcm92ZWQpLT5cblx0XHQjIGRlYnVnZ2VyXG5cdFx0aWYgVHJhY2VzVGVtcGxhdGUuaGVscGVycy5pc1Nob3dNb2RpZmljYXRpb25CdXR0b24gYXBwcm92ZWRcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0cmV0dXJuIGFwcHJvdmVkLmRlc2NyaXB0aW9uPy50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwXG5cdGlzQ0M6IChhcHByb3ZlZCkgLT5cblx0XHRpZiBhcHByb3ZlZCBhbmQgYXBwcm92ZWQudHlwZSA9PSAnY2MnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdGdldEFwcHJvdmVTdGF0dXNJY29uOiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIGF1dG9TdWJtaXR0ZWQgPT0gdHJ1ZVxuXHRcdFx0cmV0dXJuICdpb24gaW9uLWFuZHJvaWQtYWxhcm0tY2xvY2snXG5cdFx0I+W3sue7k+adn+eahOaYvuekuuS4uuaguOWHhi/pqbPlm54v5Y+W5raI55Sz6K+377yM5bm25pi+56S65aSE55CG54q25oCB5Zu+5qCHXG5cdFx0YXBwcm92ZVN0YXR1c0ljb24gPSB1bmRlZmluZWRcblx0XHRzd2l0Y2ggYXBwcm92ZUp1ZGdlXG5cdFx0XHR3aGVuICdhcHByb3ZlZCdcblx0XHRcdFx0IyDlt7LmoLjlh4Zcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jaGVja21hcmstcm91bmQnXG5cdFx0XHR3aGVuICdyZWplY3RlZCdcblx0XHRcdFx0IyDlt7LpqbPlm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jbG9zZS1yb3VuZCdcblx0XHRcdHdoZW4gJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5raIXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLWJhbidcblx0XHRcdHdoZW4gJ3JlYXNzaWduZWQnXG5cdFx0XHRcdCMg6L2s562+5qC4XG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYW5kcm9pZC1jb250YWN0J1xuXHRcdFx0d2hlbiAncmVsb2NhdGVkJ1xuXHRcdFx0XHQjIOmHjeWumuS9jVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFycm93LXNocmluaydcblx0XHRcdHdoZW4gJ3JldHJpZXZlZCdcblx0XHRcdFx0IyDlt7Llj5blm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtdW5kbydcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnJ1xuXHRcdFx0XHRicmVha1xuXHRcdGFwcHJvdmVTdGF0dXNJY29uXG5cdGdldEFwcHJvdmVTdGF0dXNUZXh0OiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cdFx0I+W3sue7k+adn+eahOaYvuekuuS4uuaguOWHhi/pqbPlm54v5Y+W5raI55Sz6K+377yM5bm25pi+56S65aSE55CG54q25oCB5Zu+5qCHXG5cdFx0aWYgYXV0b1N1Ym1pdHRlZCA9PSB0cnVlXG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV90aW1lb3V0X2F1dG9fc3VibWl0dGVkJywge30sIGxvY2FsZSlcblx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IHVuZGVmaW5lZFxuXHRcdHN3aXRjaCBhcHByb3ZlSnVkZ2Vcblx0XHRcdHdoZW4gJ2FwcHJvdmVkJ1xuXHRcdFx0XHQjIOW3suaguOWHhlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIGFwcHJvdmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlamVjdGVkJ1xuXHRcdFx0XHQjIOW3sumps+WbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlamVjdGVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5raIXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZWFzc2lnbmVkJ1xuXHRcdFx0XHQjIOi9rOetvuaguFxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYXNzaWduZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmVsb2NhdGVkJ1xuXHRcdFx0XHQjIOmHjeWumuS9jVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlbG9jYXRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZXRyaWV2ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0cmlldmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JldHVybmVkJ1xuXHRcdFx0XHQjIOW3sumAgOWbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHVybmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlYWRlZCdcblx0XHRcdFx0IyDlt7LpmIVcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFkZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9ICcnXG5cdFx0XHRcdGJyZWFrXG5cdFx0YXBwcm92ZVN0YXR1c1RleHRcblx0XG5cdGdldEFwcHJvdmVKdWRnZUNsYXNzOiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIGF1dG9TdWJtaXR0ZWQgPT0gdHJ1ZVxuXHRcdFx0cmV0dXJuICdhdXRvU3VibWl0dGVkJ1xuXHRcdHJldHVybiBhcHByb3ZlSnVkZ2VcblxuXHRfdDogKGtleSktPlxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSlcblxuXHRteUFwcHJvdmVEZXNjcmlwdGlvbjogKGFwcHJvdmVJZCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRteUFwcHJvdmUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5teUFwcHJvdmU/LmdldCgpXG5cdFx0XHRcdGlmIG15QXBwcm92ZSAmJiBteUFwcHJvdmUuaWQgPT0gYXBwcm92ZUlkXG5cdFx0XHRcdFx0aWYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXHRcdFx0XHRcdFx0cmV0dXJuIG15QXBwcm92ZT8uZGVzY3JpcHRpb24gfHwgXCJcIlxuXHRcdFx0XHRcdHJldHVybiBTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblx0aXNGb3J3YXJkOiAoYXBwcm92ZWQpIC0+XG5cdFx0aWYgYXBwcm92ZWQgYW5kIGFwcHJvdmVkLnR5cGUgPT0gJ2ZvcndhcmQnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdHNob3dGb3J3YXJkRGVsZXRlQnV0dG9uOiAoYXBwcm92ZSkgLT5cblx0XHRpZiBkYi5pbnN0YW5jZXMuZmluZChhcHByb3ZlLmZvcndhcmRfaW5zdGFuY2UpLmNvdW50KCkgaXMgMFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdmb3J3YXJkJyBhbmQgYXBwcm92ZS5mcm9tX3VzZXIgPT0gTWV0ZW9yLnVzZXJJZCgpIGFuZCAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpIGFuZCBhcHByb3ZlLmp1ZGdlIGlzbnQgJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKCBocmVmLCB0aXRsZSwgdGV4dCApIC0+XG5cdFx0XHQjIFx0cmV0dXJuIFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyN7aHJlZn0nIHRpdGxlPScje3RpdGxlfSc+I3t0ZXh0fTwvYT5cIlxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKVxuXHRcdFx0cmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpXG5cdGlzRGlzdHJpYnV0ZTogKGFwcHJvdmUpIC0+XG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdkaXN0cmlidXRlJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbjogKGFwcHJvdmUpIC0+XG5cdFx0aWYgZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpIGlzIDBcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdkaXN0cmlidXRlJyBhbmQgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSBhbmQgYXBwcm92ZS5qdWRnZSBpc250ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0IyDmtYHnqIvnrqHnkIblkZjlkozns7vnu5/nrqHnkIblkZjvvIzlj6/ku6XmiafooYzku7vkvZXmg4XlhrXkuIvnmoTmlofku7blj5bmtojliIblj5Fcblx0XHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGFwcHJvdmUuaW5zdGFuY2V9LCB7ZmllbGRzOiB7ZmxvdzogMSwgc3BhY2U6IDF9fSlcblx0XHRcdGlmIGlucyBhbmQgaW5zLmZsb3cgYW5kIGlucy5zcGFjZVxuXHRcdFx0XHRpZiBXb3JrZmxvd01hbmFnZXIuaGFzRmxvd0FkbWluUGVybWlzc2lvbihpbnMuZmxvdywgaW5zLnNwYWNlLCBNZXRlb3IudXNlcklkKCkpXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblxuXHRcdFx0aWYgYXBwcm92ZS5mcm9tX3VzZXIgPT0gTWV0ZW9yLnVzZXJJZCgpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cblx0XHRmYWxzZVxuXG5cdGZpbmlzaERhdGVTY2hlbWE6ICgpIC0+XG5cdFx0aWYgU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGZpbmlzaF9kYXRlOiB7XG5cdFx0XHRcdFx0YXV0b2Zvcm06IHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZXRpbWUtbG9jYWxcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b3B0aW9uYWw6IGZhbHNlLFxuXHRcdFx0XHRcdHR5cGU6IERhdGVcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGZpbmlzaF9kYXRlOiB7XG5cdFx0XHRcdFx0YXV0b2Zvcm06IHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyXCJcblx0XHRcdFx0XHRcdHJlYWRvbmx5OiB0cnVlXG5cdFx0XHRcdFx0XHRkYXRlVGltZVBpY2tlck9wdGlvbnM6e1xuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwiLFxuXHRcdFx0XHRcdFx0XHRpZ25vcmVSZWFkb25seTp0cnVlLFxuXHRcdFx0XHRcdFx0XHRsb2NhbGU6IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIiksXG5cdFx0XHRcdFx0XHRcdHdpZGdldFBvc2l0aW9uaW5nOntcblx0XHRcdFx0XHRcdFx0XHRob3Jpem9udGFsOiAncmlnaHQnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9wdGlvbmFsOiBmYWxzZSxcblx0XHRcdFx0XHR0eXBlOiBEYXRlXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cblx0ZmluaXNoRGF0ZVZhbHVlczogKCkgLT5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmluaXNoX2RhdGU6dGhpcy5maW5pc2hfZGF0ZVxuXHRcdH07XG5cblx0IyMjXG4gICAgXHTmraTlh73mlbDnlKjkuo7mjqfliLbmmK/lkKbmmL7npLp0cmFjZXMgdmlld1xuICAgIFx0dHJ1ZTog5pi+56S6dHJhY2VzIHZpZXcs562+5qC45Y6G56iL5oyJ6ZKu54K55Ye75ZCO5piv55u05o6l5a6a5L2N5YiwdHJhY2VzIHZpZXdcbiAgICBcdGZhbHNlOiDkuI3mmL7npLp0cmFjZXMgdmlld++8jOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjizku6VNb2RhbCDmlrnlvI/mmL7npLp0cmFjZXMgdmlld1xuXHQjIyNcblx0c2hvd1RyYWNlc1ZpZXc6IChmb3JtLCBmb3JtX3ZlcnNpb24pLT5cbiNcdFx0cmV0dXJuICEoSW5zdGFuY2VNYW5hZ2VyLmlzVGFibGVTdHlsZShmb3JtKSAmJiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzT3BpbmlvbkZpZWxkKGZvcm0sIGZvcm1fdmVyc2lvbikpXG5cblx0XHRzaG93X21vZGFsX3RyYWNlc19saXN0ID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7c3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSwga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIn0pPy52YWx1ZXMgfHwgZmFsc2VcblxuXHRcdHJldHVybiAhc2hvd19tb2RhbF90cmFjZXNfbGlzdFxuXG5cdGdldEluc3RhbmNlU3RhdGVUZXh0OiAoaW5zdGFuY2VfaWQpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXG5cdFx0aW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VfaWR9LCB7ZmllbGRzOiB7c3RhdGU6IDEsIGlzX3JlYWQ6IDF9fSlcblx0XHRpZiBub3QgaW5zXG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfZGVsZXRlZCcsIHt9LCBsb2NhbGUpXG5cblx0XHR0ZXh0ID0gJydcblx0XHRpZiBpbnMuc3RhdGUgaXMgJ2NvbXBsZXRlZCdcblx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdjb21wbGV0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdGVsc2UgaWYgaW5zLnN0YXRlIGlzICdwZW5kaW5nJ1xuXHRcdFx0dGV4dCA9IFRBUGkxOG4uX18oJ3BlbmRpbmcnLCB7fSwgbG9jYWxlKVxuXHRcdGVsc2UgaWYgaW5zLnN0YXRlIGlzICdkcmFmdCdcblx0XHRcdGlmIGlucy5pc19yZWFkXG5cdFx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3JlYWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0ZXh0ID0gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV9ub3RfeWV0X2hhbmRsZWQnLCB7fSwgbG9jYWxlKVxuXG5cdFx0cmV0dXJuIHRleHRcblxuXHRnZXRJbnN0YW5jZVN0YXRlQ29sb3I6IChpbnN0YW5jZV9pZCktPlxuXHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlX2lkfSwge2ZpZWxkczoge3N0YXRlOiAxLCBpc19yZWFkOiAxfX0pXG5cdFx0aWYgbm90IGluc1xuXHRcdFx0cmV0dXJuIFwiXCJcblxuXHRcdGNsYSA9ICcnXG5cdFx0aWYgaW5zLnN0YXRlIGlzICdkcmFmdCdcblx0XHRcdGlmIGlucy5pc19yZWFkXG5cdFx0XHRcdGNsYSA9ICdibHVlJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjbGEgPSAncmVkJ1xuXHRcdHJldHVybiBjbGFcblxuXHRmaXJzdFRyYWNlOiAoaW5kZXgpLT5cblx0XHRyZXR1cm4gaW5kZXggaXMgMFxuXG5cdGxhc3RfZGlzdHJpYnV0ZV9mcm9tOiAoaW5zdGFuY2VfaWQpLT5cblx0XHRpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZV9pZCwgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOiB7JGV4aXN0czogdHJ1ZX19LHtmaWVsZHM6e2NyZWF0ZWQ6IDEsIGNyZWF0ZWRfYnk6IDF9fSlcblx0XHRpZiBpbnNcblx0XHRcdGRpc19pbmZvID0ge31cblx0XHRcdHVzZXIgPSB7fVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdHVzZXIgPSBVVWZsb3dfYXBpLmdldE5hbWVGb3JVc2VyKGlucy5jcmVhdGVkX2J5KVxuXHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogaW5zLmNyZWF0ZWRfYnl9LCB7ZmllbGRzOiB7bmFtZTogMX19KVxuXG5cdFx0XHRpZiB1c2VyLm5hbWVcblx0XHRcdFx0ZGlzX2luZm8uZnJvbV91c2VyID0gdXNlci5faWRcblx0XHRcdFx0ZGlzX2luZm8uZnJvbV91c2VyX25hbWUgPSB1c2VyLm5hbWVcblx0XHRcdFx0ZGlzX2luZm8uY3JlYXRlZCA9IGlucy5jcmVhdGVkXG5cblx0XHRcdGlmIG5vdCBfLmlzRW1wdHkoZGlzX2luZm8pXG5cdFx0XHRcdHJldHVybiBkaXNfaW5mb1xuXHRcdHJldHVyblxuXG5cdGlzQ0NPckRpc3RyaWJ1dGVPckZvcndhcmRUZXJtaW5hdGVkOiAoYXBwcm92ZSktPlxuXHRcdGlmIChhcHByb3ZlLnR5cGUgaXMgJ2NjJyBvciBhcHByb3ZlLnR5cGUgaXMgJ2Rpc3RyaWJ1dGUnIG9yIGFwcHJvdmUudHlwZSBpcyAnZm9yd2FyZCcpIGFuZCBhcHByb3ZlLmp1ZGdlIGlzICd0ZXJtaW5hdGVkJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRqdWRnZVRlcm1pbmF0ZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBqdWRnZSBpcyAndGVybWluYXRlZCdcblxuXHRpbnN0YW5jZUV4aXN0czogKGluc3RhbmNlX2lkKS0+XG5cdFx0cmV0dXJuICEhZGIuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2VfaWQpLmNvdW50KClcblxuXHRhZ2VudERlc2NyaXB0aW9uOiAodXNlck5hbWUpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogdXNlck5hbWV9LCBsb2NhbGUpXG5cdFxuXHR0cmFjZU5hbWU6IChpbnN0YW5jZV9pZCwgdHJhY2VJZCktPlxuXHRcdHJldHVybiBfLmZpbmQoZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQsIHtmaWVsZHM6IHt0cmFjZXM6IDF9fSk/LnRyYWNlcywgKHRyYWNlKS0+XG5cdFx0XHRcdFx0cmV0dXJuIHRyYWNlLl9pZCA9PSAgdHJhY2VJZFxuXHRcdCk/Lm5hbWVcblxuXHRvYmplY3RVcmw6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpLT5cblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKVxuXG5cdGhhbmRsZXJEb2M6IChoYW5kbGVySWQpLT5cblx0XHR1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ud29ya2Zsb3c/LnVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm9cblx0XHRpZiAhdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyBvciAhdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mby5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpXG5cdFx0XHRyZXR1cm5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBVVWZsb3dfYXBpLmdldENvbnRhY3RJbmZvRm9yVXNlcihoYW5kbGVySWQsIFNlc3Npb24uZ2V0KCdzcGFjZUlkJykpXG5cdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdHJldHVybiBkYi51c2Vycy5maW5kT25lKGhhbmRsZXJJZClcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuZGF0ZUZvcm1hdCA9IChkYXRlKS0+XG5cdFx0aWYgZGF0ZVxuXHRcdFx0dXRjT2Zmc2V0ID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnV0Y09mZnNldFxuXHRcdFx0cmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKGRhdGUsIHV0Y09mZnNldCk7XG5cblx0VHJhY2VzVGVtcGxhdGUuaGVscGVycy5fdCA9IChrZXkpLT5cblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXG5cdFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuc2hvd0RlbGV0ZUJ1dHRvbiA9IChhcHByb3ZlZCkgLT5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblRyYWNlc1RlbXBsYXRlLmV2ZW50cyA9XG5cdCdjbGljayAuY2MtYXBwcm92ZS1yZW1vdmUnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cdFx0aWYgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgKiAxICE9IDFcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMVxuXHRcdFx0JChcImlcIixldmVudC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcyhcImZhLXNwaW5cIilcblx0XHRcdGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpXG5cdFx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0XHQjIENBTEwg5Yig6ZmkYXBwcm92ZeWHveaVsOOAglxuXHRcdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRNZXRlb3IuY2FsbCAnY2NfcmVtb3ZlJywgaW5zdGFuY2VJZCwgYXBwcm92ZUlkLCAoZXJyLCByZXN1bHQpIC0+XG5cdFx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0XHRpZiBlcnJcblx0XHRcdFx0XHR0b2FzdHIuZXJyb3IgZXJyXG5cdFx0XHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgPSAwXG5cdFx0XHRcdFx0JChcImlcIixldmVudC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcyhcImZhLXNwaW5cIilcblx0XHRcdFx0aWYgcmVzdWx0ID09IHRydWVcblx0XHRcdFx0XHR0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwicmVtb3ZlX2NjX2FwcHJvdmVcIikpO1xuXHRcdFx0XHRcdGlmICQoXCIuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsXCIpLmxlbmd0aFxuXHRcdFx0XHRcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0cmV0dXJuXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1jYy1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0IyAjIENBTEwg5Yig6ZmkYXBwcm92ZeWHveaVsOOAglxuXHRcdCMgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0IyBNZXRlb3IuY2FsbCAnY2NfcmVtb3ZlJywgaW5zdGFuY2VJZCwgYXBwcm92ZUlkLCAoZXJyLCByZXN1bHQpIC0+XG5cdFx0IyBcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdCMgXHRpZiBlcnJcblx0XHQjIFx0XHR0b2FzdHIuZXJyb3IgZXJyXG5cdFx0IyBcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0IyBcdFx0dG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcInJlbW92ZV9jY19hcHByb3ZlXCIpKTtcblx0XHQjIFx0XHRNb2RhbC5oaWRlIFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCJcblx0XHQjIFx0cmV0dXJuXG5cdFx0IyByZXR1cm5cblx0XHRNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZVxuXHRcdE1vZGFsLnNob3cgJ2NhbmNlbF9jY19tb2RhbCdcblxuXHQnY2xpY2sgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyBQQ+S4iumTvuaOpeWFgeiuuOebtOaOpeeCueW8gO+8jOS4jeWGjeaJk+W8gOetvuaJueWOhueoi+ivpue7hlxuXHRcdHVubGVzcyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoXG5cdFx0XHRNb2RhbC5zaG93IFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXNcblxuXHQndGFwaG9sZCAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIOaJi+acuuS4iumVv+aMieaJk+W8gOetvuaJueWOhueoi+ivpue7hu+8jOWmguaenOaYr+mTvuaOpemVv+aMieaJk+W8gOWQjuS4gOaUvuaJi+eql+WPo+WwseWPiOWFs+aOieS6hu+8jOaJgOS7peS4jeiuqemTvuaOpeaJk+W8gOetvuaJueWOhueoi+ivpue7hlxuXHRcdHVubGVzcyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoXG5cdFx0XHRNb2RhbC5zaG93IFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXNcblxuXHQnY2xpY2sgLmFwcHJvdmUtaXRlbSBhLmJ0bi1saW5rLC5hcHByb3ZlLWRlc2NyaXB0aW9uIGEuYnRuLWxpbmssLmFwcHJvdmUtaXRlbS1kaXN0cmlidXRlIGEuYnRuLWxpbmsnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMg5omL5py65LiK54K55Ye76ZO+5o6l77yM5by55Ye65paw56qX5Y+j77yM5LiN5pSv5oyB77yM5Zug5Li6YW5kcm9pZOS4iuS8muW8ueWHuueZu+W9leeVjOmdolxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0dXNlcklkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQ/LnRhcmdldF91c2VyX2lkXG5cdFx0XHRDcmVhdG9yLm9wZW5TYWZlT2JqZWN0VXJsKCd1c2VycycsIHVzZXJJZClcblxuXHQndGFwZW5kIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMg5LiK6L+w6ZW/5oyJ5omT5byAYXBwcm92Zeivpue7hueql+WPo+eahOS6i+S7tnRhcGhvbGTkvJrop6blj5HmiZPlvIDnqpflj6PlkI7nmoR0b3VjaGVuZOS6i+S7tu+8jOmAoOaIkOmVv+aMieaJk+W8gOeql+WPo+WQjuS4gOaUvuaJi+eql+WPo+WwseWPiOWFs+aOieS6hlxuXHRcdCMg6L+Z6YeM5Y+q6IO96YCa6L+H6Zi75q2idGFwZW5k5LqL5Lu2KOS4jeWPr+S7peeUqHRvdWNoZW5k5LqL5Lu277yM5Zug5Li65Lya5b2x5ZONdGFwaG9sZOWKn+iDve+8jOmAoOaIkOayoeaciemVv+aMieaViOaenOaXtuS5n+S8muinpuWPkXRhcGhvbGTkuovku7Yp5YaS5rOh5p2l6YG/5YWN6Zeu6aKY44CCXG5cdFx0IyDpk77mjqXlhYHorrjnm7TmjqXngrnlvIBcblx0XHR1bmxlc3MgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aFxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdCdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0dHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlXG5cdFx0IyBDQUxMIOWIoOmZpGFwcHJvdmXlh73mlbDjgIJcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHRNZXRlb3IuY2FsbCAnZm9yd2FyZF9yZW1vdmUnLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIChlcnIsIHJlc3VsdCkgLT5cblx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0aWYgZXJyXG5cdFx0XHRcdHRvYXN0ci5lcnJvciBUQVBpMThuLl9fKGVyci5yZWFzb24pXG5cdFx0XHRpZiByZXN1bHQgPT0gdHJ1ZVxuXHRcdFx0XHR0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwiaW5zdGFuY2VfYXBwcm92ZV9mb3J3YXJkX3JlbW92ZV9zdWNjZXNzXCIpKTtcblx0XHRcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0XHRyZXR1cm5cblx0XHRyZXR1cm5cblxuXHQnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWZvcndhcmQtaW5zdGFuY2UtbG9vayc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0Zm9yd2FyZF9zcGFjZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmZvcndhcmRzcGFjZVxuXHRcdGZvcndhcmRfaW5zdGFuY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkaW5zdGFuY2Vcblx0XHRTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgZm9yd2FyZF9zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBmb3J3YXJkX2luc3RhbmNlKSlcblxuXHQnY2xpY2sgLmJ0bi1tb2RpZmljYXRpb24nXHQ6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0dGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuXHRcdHVubGVzcyBTdGVlZG9zLmlzQW5kcm9pZE9ySU9TKClcblx0XHRcdFRyYWNrZXIuYWZ0ZXJGbHVzaCAtPlxuXHRcdFx0XHQjIOaYvuekuuaXpeW/l+eahOaXtuWAmeaKiua7muWKqOadoeW+gOS4i+enu+eCue+8jOiuqeaXpeacn+aOp+S7tuaYvuekuuWHuuS4gOmDqOWIhu+8jOS7pemBv+WFjeeUqOaIt+eci+S4jeWIsOaXpeacn+aOp+S7tlxuXHRcdFx0XHQkKFwiI2luc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbCAjZmluaXNoX2lucHV0XCIpLm9uIFwiZHAuc2hvd1wiLCAoKSAtPlxuXHRcdFx0XHRcdCQoXCIubW9kYWwtYm9keVwiKS5zY3JvbGxUb3AoMTAwKVxuXG5cdCdjbGljayAuYnRuLWNhbmNlbEJ1dCcgOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXG5cdFx0dGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuXG5cdCdjbGljayAuYnRuLXNhdmVCdXQnIDogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKVxuXG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0dHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlXG5cdFx0b3Bpbmlvbl9pbnB1dCA9ICQoJyNvcGluaW9uX2lucHV0JykudmFsKClcblx0XHRmaW5pc2hfaW5wdXQgPSBBdXRvRm9ybS5nZXRGaWVsZFZhbHVlKFwiZmluaXNoX2RhdGVcIiwgXCJmaW5pc2hEYXRlQXV0b0Zvcm1cIilcblxuXHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKVxuXHRcdE1ldGVvci5jYWxsICdjaGFuZ2VfYXBwcm92ZV9pbmZvJywgaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBvcGluaW9uX2lucHV0LCBmaW5pc2hfaW5wdXQsIChlcnIsIHJlc3VsdCktPlxuXHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRpZiBlcnJcblx0XHRcdFx0dG9hc3RyLmVycm9yIFRBUGkxOG4uX18oZXJyLnJlYXNvbilcblx0XHRcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0XHRcdHRvYXN0ci5zdWNjZXNzKHQoXCJpbnN0YW5jZV9hcHByb3ZlX21vZGFsX21vZGlmaWNhdGlvbnNhdmVcIikpXG5cdFx0XHRcdE1vZGFsLmhpZGUgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIlxuXHRcdFx0cmV0dXJuXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1kaXN0cmlidXRlLWFwcHJvdmUtcmVtb3ZlJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZVxuXHRcdE1vZGFsLnNob3cgJ2NhbmNlbF9kaXN0cmlidXRlX21vZGFsJ1xuIiwidmFyIG1hcmtlZDtcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuVHJhY2VzVGVtcGxhdGUuaGVscGVycyA9IHtcbiAgdHJhY2VTaG93U2lnbkltYWdlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPT0gZmFsc2UgJiYgTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPT0gJ2ZhbHNlJztcbiAgfSxcbiAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbihhKSB7XG4gICAgaWYgKGEpIHtcbiAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA8IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgdW5lbXB0eTogZnVuY3Rpb24oYSkge1xuICAgIGlmIChhKSB7XG4gICAgICByZXR1cm4gYS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBhcHBlbmQ6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSArIGI7XG4gIH0sXG4gIGRhdGVGb3JtYXQ6IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpICYmIChkYXRlICE9IG51bGwgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiB2b2lkIDApID09PSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTS1ERCBISDptbScpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgIH1cbiAgfSxcbiAgZ2V0U3RlcE5hbWU6IGZ1bmN0aW9uKHN0ZXBJZCkge1xuICAgIHZhciBzdGVwO1xuICAgIHN0ZXAgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VTdGVwKHN0ZXBJZCk7XG4gICAgaWYgKHN0ZXApIHtcbiAgICAgIHJldHVybiBzdGVwLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBzaG93RGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIGlmIChhcHByb3ZlZCAmJiBhcHByb3ZlZC50eXBlID09PSAnY2MnICYmIGFwcHJvdmVkLmZyb21fdXNlciA9PT0gTWV0ZW9yLnVzZXJJZCgpICYmIGFwcHJvdmVkLmlzX2ZpbmlzaGVkICE9PSB0cnVlICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbjogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICB2YXIgYXBwcm92ZV9hZG1pbnMsIGlzU2hvdywgcmVmLCByZWYxLCByZWYyO1xuICAgIGFwcHJvdmVfYWRtaW5zID0gKHJlZiA9IE1ldGVvci5zZXR0aW5ncykgIT0gbnVsbCA/IChyZWYxID0gcmVmW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjIgPSByZWYxLndvcmtmbG93KSAhPSBudWxsID8gcmVmMi5hcHByb3ZlX2FkbWlucyA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBpZiAoYXBwcm92ZV9hZG1pbnMgIT0gbnVsbCA/IGFwcHJvdmVfYWRtaW5zLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgaXNTaG93ID0gYXBwcm92ZV9hZG1pbnMgIT0gbnVsbCA/IGFwcHJvdmVfYWRtaW5zLmNvbnRhaW5zKE1ldGVvci51c2VySWQoKSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIGlmICghaXNTaG93KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlZC5oYW5kbGVyID09PSBNZXRlb3IudXNlcklkKCk7XG4gIH0sXG4gIGlzRWRpdGluZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkuaXNfZWRpdGluZykgIT0gbnVsbCA/IHJlZi5nZXQoKSA6IHZvaWQgMDtcbiAgfSxcbiAgaXNTaG93RGVzY3JpcHRpb246IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoVHJhY2VzVGVtcGxhdGUuaGVscGVycy5pc1Nob3dNb2RpZmljYXRpb25CdXR0b24oYXBwcm92ZWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICgocmVmID0gYXBwcm92ZWQuZGVzY3JpcHRpb24pICE9IG51bGwgPyByZWYudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoIDogdm9pZCAwKSA+IDA7XG4gIH0sXG4gIGlzQ0M6IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgaWYgKGFwcHJvdmVkICYmIGFwcHJvdmVkLnR5cGUgPT09ICdjYycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGdldEFwcHJvdmVTdGF0dXNJY29uOiBmdW5jdGlvbihhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIHtcbiAgICB2YXIgYXBwcm92ZVN0YXR1c0ljb247XG4gICAgaWYgKGF1dG9TdWJtaXR0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnaW9uIGlvbi1hbmRyb2lkLWFsYXJtLWNsb2NrJztcbiAgICB9XG4gICAgYXBwcm92ZVN0YXR1c0ljb24gPSB2b2lkIDA7XG4gICAgc3dpdGNoIChhcHByb3ZlSnVkZ2UpIHtcbiAgICAgIGNhc2UgJ2FwcHJvdmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jaGVja21hcmstcm91bmQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlamVjdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jbG9zZS1yb3VuZCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVybWluYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLWJhbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhc3NpZ25lZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYW5kcm9pZC1jb250YWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxvY2F0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFycm93LXNocmluayc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmV0cmlldmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtdW5kbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlU3RhdHVzSWNvbjtcbiAgfSxcbiAgZ2V0QXBwcm92ZVN0YXR1c1RleHQ6IGZ1bmN0aW9uKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkge1xuICAgIHZhciBhcHByb3ZlU3RhdHVzVGV4dCwgbG9jYWxlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgICBpZiAobG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpO1xuICAgIH1cbiAgICBpZiAoYXV0b1N1Ym1pdHRlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfdGltZW91dF9hdXRvX3N1Ym1pdHRlZCcsIHt9LCBsb2NhbGUpO1xuICAgIH1cbiAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKGFwcHJvdmVKdWRnZSkge1xuICAgICAgY2FzZSAnYXBwcm92ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIGFwcHJvdmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVqZWN0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlamVjdGVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVybWluYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlYXNzaWduZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYXNzaWduZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxvY2F0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlbG9jYXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JldHJpZXZlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0cmlldmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmV0dXJuZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHVybmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhZGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFkZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVTdGF0dXNUZXh0O1xuICB9LFxuICBnZXRBcHByb3ZlSnVkZ2VDbGFzczogZnVuY3Rpb24oYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSB7XG4gICAgaWYgKGF1dG9TdWJtaXR0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnYXV0b1N1Ym1pdHRlZCc7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlSnVkZ2U7XG4gIH0sXG4gIF90OiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuICB9LFxuICBteUFwcHJvdmVEZXNjcmlwdGlvbjogZnVuY3Rpb24oYXBwcm92ZUlkKSB7XG4gICAgdmFyIG15QXBwcm92ZSwgcmVmLCByZWYxO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICBteUFwcHJvdmUgPSAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLm15QXBwcm92ZSkgIT0gbnVsbCA/IHJlZjEuZ2V0KCkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChteUFwcHJvdmUgJiYgbXlBcHByb3ZlLmlkID09PSBhcHByb3ZlSWQpIHtcbiAgICAgICAgICBpZiAoIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIChteUFwcHJvdmUgIT0gbnVsbCA/IG15QXBwcm92ZS5kZXNjcmlwdGlvbiA6IHZvaWQgMCkgfHwgXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgaXNGb3J3YXJkOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIGlmIChhcHByb3ZlZCAmJiBhcHByb3ZlZC50eXBlID09PSAnZm9yd2FyZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNob3dGb3J3YXJkRGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGRiLmluc3RhbmNlcy5maW5kKGFwcHJvdmUuZm9yd2FyZF9pbnN0YW5jZSkuY291bnQoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT09ICdmb3J3YXJkJyAmJiBhcHByb3ZlLmZyb21fdXNlciA9PT0gTWV0ZW9yLnVzZXJJZCgpICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgJiYgYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBtYXJrRG93blRvSHRtbDogZnVuY3Rpb24obWFya0Rvd25TdHJpbmcpIHtcbiAgICBpZiAobWFya0Rvd25TdHJpbmcpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgbWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpO1xuICAgIH1cbiAgfSxcbiAgaXNEaXN0cmlidXRlOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09PSAnZGlzdHJpYnV0ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNob3dEaXN0cmlidXRlRGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgJiYgYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogYXBwcm92ZS5pbnN0YW5jZVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmbG93OiAxLFxuICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGlucyAmJiBpbnMuZmxvdyAmJiBpbnMuc3BhY2UpIHtcbiAgICAgICAgaWYgKFdvcmtmbG93TWFuYWdlci5oYXNGbG93QWRtaW5QZXJtaXNzaW9uKGlucy5mbG93LCBpbnMuc3BhY2UsIE1ldGVvci51c2VySWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFwcHJvdmUuZnJvbV91c2VyID09PSBNZXRlb3IudXNlcklkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZmluaXNoRGF0ZVNjaGVtYTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKFN0ZWVkb3MuaXNBbmRyb2lkT3JJT1MoKSkge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoe1xuICAgICAgICBmaW5pc2hfZGF0ZToge1xuICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICB0eXBlOiBcImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBEYXRlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG4gICAgICAgIGZpbmlzaF9kYXRlOiB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyXCIsXG4gICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGVUaW1lUGlja2VyT3B0aW9uczoge1xuICAgICAgICAgICAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwiLFxuICAgICAgICAgICAgICBpZ25vcmVSZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgbG9jYWxlOiBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpLFxuICAgICAgICAgICAgICB3aWRnZXRQb3NpdGlvbmluZzoge1xuICAgICAgICAgICAgICAgIGhvcml6b250YWw6ICdyaWdodCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IERhdGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBmaW5pc2hEYXRlVmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmluaXNoX2RhdGU6IHRoaXMuZmluaXNoX2RhdGVcbiAgICB9O1xuICB9LFxuXG4gIC8qXG4gICAgIFx05q2k5Ye95pWw55So5LqO5o6n5Yi25piv5ZCm5pi+56S6dHJhY2VzIHZpZXdcbiAgICAgXHR0cnVlOiDmmL7npLp0cmFjZXMgdmlldyznrb7moLjljobnqIvmjInpkq7ngrnlh7vlkI7mmK/nm7TmjqXlrprkvY3liLB0cmFjZXMgdmlld1xuICAgICBcdGZhbHNlOiDkuI3mmL7npLp0cmFjZXMgdmlld++8jOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjizku6VNb2RhbCDmlrnlvI/mmL7npLp0cmFjZXMgdmlld1xuICAgKi9cbiAgc2hvd1RyYWNlc1ZpZXc6IGZ1bmN0aW9uKGZvcm0sIGZvcm1fdmVyc2lvbikge1xuICAgIHZhciByZWYsIHNob3dfbW9kYWxfdHJhY2VzX2xpc3Q7XG4gICAgc2hvd19tb2RhbF90cmFjZXNfbGlzdCA9ICgocmVmID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7XG4gICAgICBzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLFxuICAgICAga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIlxuICAgIH0pKSAhPSBudWxsID8gcmVmLnZhbHVlcyA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgcmV0dXJuICFzaG93X21vZGFsX3RyYWNlc19saXN0O1xuICB9LFxuICBnZXRJbnN0YW5jZVN0YXRlVGV4dDogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICB2YXIgaW5zLCBsb2NhbGUsIHRleHQ7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VfaWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgc3RhdGU6IDEsXG4gICAgICAgIGlzX3JlYWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWlucykge1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2RlbGV0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICB9XG4gICAgdGV4dCA9ICcnO1xuICAgIGlmIChpbnMuc3RhdGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICB0ZXh0ID0gVEFQaTE4bi5fXygnY29tcGxldGVkJywge30sIGxvY2FsZSk7XG4gICAgfSBlbHNlIGlmIChpbnMuc3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgdGV4dCA9IFRBUGkxOG4uX18oJ3BlbmRpbmcnLCB7fSwgbG9jYWxlKTtcbiAgICB9IGVsc2UgaWYgKGlucy5zdGF0ZSA9PT0gJ2RyYWZ0Jykge1xuICAgICAgaWYgKGlucy5pc19yZWFkKSB7XG4gICAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3JlYWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX25vdF95ZXRfaGFuZGxlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfSxcbiAgZ2V0SW5zdGFuY2VTdGF0ZUNvbG9yOiBmdW5jdGlvbihpbnN0YW5jZV9pZCkge1xuICAgIHZhciBjbGEsIGlucztcbiAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlX2lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHN0YXRlOiAxLFxuICAgICAgICBpc19yZWFkOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFpbnMpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjbGEgPSAnJztcbiAgICBpZiAoaW5zLnN0YXRlID09PSAnZHJhZnQnKSB7XG4gICAgICBpZiAoaW5zLmlzX3JlYWQpIHtcbiAgICAgICAgY2xhID0gJ2JsdWUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhID0gJ3JlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGE7XG4gIH0sXG4gIGZpcnN0VHJhY2U6IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICB9LFxuICBsYXN0X2Rpc3RyaWJ1dGVfZnJvbTogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICB2YXIgZGlzX2luZm8sIGlucywgdXNlcjtcbiAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlX2lkLFxuICAgICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOiB7XG4gICAgICAgICRleGlzdHM6IHRydWVcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgY3JlYXRlZDogMSxcbiAgICAgICAgY3JlYXRlZF9ieTogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpbnMpIHtcbiAgICAgIGRpc19pbmZvID0ge307XG4gICAgICB1c2VyID0ge307XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHVzZXIgPSBVVWZsb3dfYXBpLmdldE5hbWVGb3JVc2VyKGlucy5jcmVhdGVkX2J5KTtcbiAgICAgIH0gZWxzZSBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgICBfaWQ6IGlucy5jcmVhdGVkX2J5XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXIubmFtZSkge1xuICAgICAgICBkaXNfaW5mby5mcm9tX3VzZXIgPSB1c2VyLl9pZDtcbiAgICAgICAgZGlzX2luZm8uZnJvbV91c2VyX25hbWUgPSB1c2VyLm5hbWU7XG4gICAgICAgIGRpc19pbmZvLmNyZWF0ZWQgPSBpbnMuY3JlYXRlZDtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KGRpc19pbmZvKSkge1xuICAgICAgICByZXR1cm4gZGlzX2luZm87XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZDogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIGlmICgoYXBwcm92ZS50eXBlID09PSAnY2MnIHx8IGFwcHJvdmUudHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnIHx8IGFwcHJvdmUudHlwZSA9PT0gJ2ZvcndhcmQnKSAmJiBhcHByb3ZlLmp1ZGdlID09PSAndGVybWluYXRlZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGp1ZGdlVGVybWluYXRlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4ganVkZ2UgPT09ICd0ZXJtaW5hdGVkJztcbiAgfSxcbiAgaW5zdGFuY2VFeGlzdHM6IGZ1bmN0aW9uKGluc3RhbmNlX2lkKSB7XG4gICAgcmV0dXJuICEhZGIuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2VfaWQpLmNvdW50KCk7XG4gIH0sXG4gIGFnZW50RGVzY3JpcHRpb246IGZ1bmN0aW9uKHVzZXJOYW1lKSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgaWYgKGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAnemgtY24nKSB7XG4gICAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgIHVzZXJOYW1lOiB1c2VyTmFtZVxuICAgIH0sIGxvY2FsZSk7XG4gIH0sXG4gIHRyYWNlTmFtZTogZnVuY3Rpb24oaW5zdGFuY2VfaWQsIHRyYWNlSWQpIHtcbiAgICB2YXIgcmVmLCByZWYxO1xuICAgIHJldHVybiAocmVmID0gXy5maW5kKChyZWYxID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQsIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICB0cmFjZXM6IDFcbiAgICAgIH1cbiAgICB9KSkgIT0gbnVsbCA/IHJlZjEudHJhY2VzIDogdm9pZCAwLCBmdW5jdGlvbih0cmFjZSkge1xuICAgICAgcmV0dXJuIHRyYWNlLl9pZCA9PT0gdHJhY2VJZDtcbiAgICB9KSkgIT0gbnVsbCA/IHJlZi5uYW1lIDogdm9pZCAwO1xuICB9LFxuICBvYmplY3RVcmw6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpO1xuICB9LFxuICBoYW5kbGVyRG9jOiBmdW5jdGlvbihoYW5kbGVySWQpIHtcbiAgICB2YXIgcmVmLCByZWYxLCB1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvO1xuICAgIHVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjEgPSByZWYud29ya2Zsb3cpICE9IG51bGwgPyByZWYxLnVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgaWYgKCF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIHx8ICF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIFVVZmxvd19hcGkuZ2V0Q29udGFjdEluZm9Gb3JVc2VyKGhhbmRsZXJJZCwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKSk7XG4gICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBkYi51c2Vycy5maW5kT25lKGhhbmRsZXJJZCk7XG4gICAgfVxuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgdXRjT2Zmc2V0O1xuICAgIGlmIChkYXRlKSB7XG4gICAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0O1xuICAgICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKGRhdGUsIHV0Y09mZnNldCk7XG4gICAgfVxuICB9O1xuICBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLl90ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG4gIH07XG4gIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuc2hvd0RlbGV0ZUJ1dHRvbiA9IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG5UcmFjZXNUZW1wbGF0ZS5ldmVudHMgPSB7XG4gICdjbGljayAuY2MtYXBwcm92ZS1yZW1vdmUnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBpbnN0YW5jZUlkO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyAqIDEgIT09IDEpIHtcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMTtcbiAgICAgICQoXCJpXCIsIGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKFwiZmEtc3BpblwiKTtcbiAgICAgIGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpO1xuICAgICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIE1ldGVvci5jYWxsKCdjY19yZW1vdmUnLCBpbnN0YW5jZUlkLCBhcHByb3ZlSWQsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnIpO1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMDtcbiAgICAgICAgICAkKFwiaVwiLCBldmVudC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcyhcImZhLXNwaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJyZW1vdmVfY2NfYXBwcm92ZVwiKSk7XG4gICAgICAgICAgaWYgKCQoXCIuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsXCIpLmxlbmd0aCkge1xuICAgICAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1jYy1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGluc3RhbmNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICBNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZTtcbiAgICByZXR1cm4gTW9kYWwuc2hvdygnY2FuY2VsX2NjX21vZGFsJyk7XG4gIH0sXG4gICdjbGljayAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gTW9kYWwuc2hvdyhcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiLCB0aGlzKTtcbiAgICB9XG4gIH0sXG4gICd0YXBob2xkIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBpZiAoISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBNb2RhbC5zaG93KFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5hcHByb3ZlLWl0ZW0gYS5idG4tbGluaywuYXBwcm92ZS1kZXNjcmlwdGlvbiBhLmJ0bi1saW5rLC5hcHByb3ZlLWl0ZW0tZGlzdHJpYnV0ZSBhLmJ0bi1saW5rJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIHJlZiwgdXNlcklkO1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIHVzZXJJZCA9IChyZWYgPSBldmVudC50YXJnZXQuZGF0YXNldCkgIT0gbnVsbCA/IHJlZi50YXJnZXRfdXNlcl9pZCA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBDcmVhdG9yLm9wZW5TYWZlT2JqZWN0VXJsKCd1c2VycycsIHVzZXJJZCk7XG4gICAgfVxuICB9LFxuICAndGFwZW5kIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBpZiAoISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGluc3RhbmNlSWQsIHRyYWNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICB0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2U7XG4gICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgIE1ldGVvci5jYWxsKCdmb3J3YXJkX3JlbW92ZScsIGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdG9hc3RyLmVycm9yKFRBUGkxOG4uX18oZXJyLnJlYXNvbikpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwiaW5zdGFuY2VfYXBwcm92ZV9mb3J3YXJkX3JlbW92ZV9zdWNjZXNzXCIpKTtcbiAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1mb3J3YXJkLWluc3RhbmNlLWxvb2snOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgZm9yd2FyZF9pbnN0YW5jZSwgZm9yd2FyZF9zcGFjZTtcbiAgICBmb3J3YXJkX3NwYWNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZm9yd2FyZHNwYWNlO1xuICAgIGZvcndhcmRfaW5zdGFuY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkaW5zdGFuY2U7XG4gICAgcmV0dXJuIFN0ZWVkb3Mub3BlbldpbmRvdyhTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBmb3J3YXJkX3NwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGZvcndhcmRfaW5zdGFuY2UpKTtcbiAgfSxcbiAgJ2NsaWNrIC5idG4tbW9kaWZpY2F0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuICAgIGlmICghU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpKSB7XG4gICAgICByZXR1cm4gVHJhY2tlci5hZnRlckZsdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJChcIiNpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWwgI2ZpbmlzaF9pbnB1dFwiKS5vbihcImRwLnNob3dcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCIubW9kYWwtYm9keVwiKS5zY3JvbGxUb3AoMTAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuYnRuLWNhbmNlbEJ1dCc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSk7XG4gIH0sXG4gICdjbGljayAuYnRuLXNhdmVCdXQnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBmaW5pc2hfaW5wdXQsIGluc3RhbmNlSWQsIG9waW5pb25faW5wdXQsIHRyYWNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICB0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2U7XG4gICAgb3Bpbmlvbl9pbnB1dCA9ICQoJyNvcGluaW9uX2lucHV0JykudmFsKCk7XG4gICAgZmluaXNoX2lucHV0ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShcImZpbmlzaF9kYXRlXCIsIFwiZmluaXNoRGF0ZUF1dG9Gb3JtXCIpO1xuICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKTtcbiAgICByZXR1cm4gTWV0ZW9yLmNhbGwoJ2NoYW5nZV9hcHByb3ZlX2luZm8nLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIG9waW5pb25faW5wdXQsIGZpbmlzaF9pbnB1dCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdG9hc3RyLmVycm9yKFRBUGkxOG4uX18oZXJyLnJlYXNvbikpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0b2FzdHIuc3VjY2Vzcyh0KFwiaW5zdGFuY2VfYXBwcm92ZV9tb2RhbF9tb2RpZmljYXRpb25zYXZlXCIpKTtcbiAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1kaXN0cmlidXRlLWFwcHJvdmUtcmVtb3ZlJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgTW9kYWwuYWxsb3dNdWx0aXBsZSA9IHRydWU7XG4gICAgcmV0dXJuIE1vZGFsLnNob3coJ2NhbmNlbF9kaXN0cmlidXRlX21vZGFsJyk7XG4gIH1cbn07XG4iLCJSZWxhdGVkSW5zdGFuY2VzLmhlbHBlcnMgPVxuXHRzaG93UmVsYXRlZEluc3RhY2VzOiAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdGlmIGlucz8ucmVsYXRlZF9pbnN0YW5jZXMgJiYgXy5pc0FycmF5KGlucz8ucmVsYXRlZF9pbnN0YW5jZXMpXG5cdFx0XHRpZiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXN9fSwge2ZpZWxkczoge3NwYWNlOiAxLCBuYW1lOiAxfX0pLmNvdW50KCkgPiAwXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRyZWxhdGVkX2luc3RhY2VzOiAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdGlmIGlucz8ucmVsYXRlZF9pbnN0YW5jZXMgJiYgXy5pc0FycmF5KGlucz8ucmVsYXRlZF9pbnN0YW5jZXMpXG5cdFx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbjogaW5zLnJlbGF0ZWRfaW5zdGFuY2VzfX0sIHtmaWVsZHM6IHtzcGFjZTogMSwgbmFtZTogMX19KS5mZXRjaCgpXG5cblx0cmVsYXRlZF9pbnN0YWNlX3VybDogKGlucykgLT5cblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpXG5cdFx0XHRyZXR1cm4gJydcblxuXHRcdGFic29sdXRlID0gZmFsc2VcblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0YWJzb2x1dGUgPSB0aGlzLmFic29sdXRlXG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitpbnMuc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIraW5zLnNwYWNlK1wiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJylcblxuXHRfdDogKGtleSktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXHRcdGVsc2Vcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSlcblxuXHRzaG93X2RlbGV0ZTogKCktPlxuXHRcdGlmICFNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09IFwiZHJhZnRcIiB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpXG5cdFx0XHRcdGlmIGN1cnJlbnRfc3RlcFxuXHRcdFx0XHRcdGlmIChjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZSIsIlJlbGF0ZWRJbnN0YW5jZXMuaGVscGVycyA9IHtcbiAgc2hvd1JlbGF0ZWRJbnN0YWNlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKChpbnMgIT0gbnVsbCA/IGlucy5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMCkgJiYgXy5pc0FycmF5KGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSkge1xuICAgICAgaWYgKGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmNvdW50KCkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICByZWxhdGVkX2luc3RhY2VzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnMgPSB0aGlzLmluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAoKGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSAmJiBfLmlzQXJyYXkoaW5zICE9IG51bGwgPyBpbnMucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDApKSB7XG4gICAgICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlucy5yZWxhdGVkX2luc3RhbmNlc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gIH0sXG4gIHJlbGF0ZWRfaW5zdGFjZV91cmw6IGZ1bmN0aW9uKGlucykge1xuICAgIHZhciBhYnNvbHV0ZTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGU7XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgaW5zLnNwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGlucy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgfVxuICB9LFxuICBfdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcbiAgICB9XG4gIH0sXG4gIHNob3dfZGVsZXRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3VycmVudF9zdGVwO1xuICAgIGlmICghTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gXCJkcmFmdFwiIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgICAgICBpZiAoY3VycmVudF9zdGVwKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCJSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzID1cblx0c2hvd1JlbGF0ZWRSZWNvcmRzOiAoKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0aWYgIWluc1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuICFfLmlzRW1wdHkoaW5zLnJlY29yZF9pZHMpXG5cdHJlbGF0ZWRSZWNvcmRVcmw6ICgpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKVxuXHRcdFx0cmV0dXJuICcnXG5cblx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cdFx0XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0XHRhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGVcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XG5cdFx0b2JqY2V0TmFtZSA9IGlucy5yZWNvcmRfaWRzWzBdLm9cblx0XHRpZCA9IGlucy5yZWNvcmRfaWRzWzBdLmlkc1swXVxuXG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcHAvLS8je29iamNldE5hbWV9L3ZpZXcvI3tpZH1cIilcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcC8tLyN7b2JqY2V0TmFtZX0vdmlldy8je2lkfVwiKSIsIlJlbGF0ZWRSZWNvcmRzLmhlbHBlcnMgPSB7XG4gIHNob3dSZWxhdGVkUmVjb3JkczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKCFpbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFfLmlzRW1wdHkoaW5zLnJlY29yZF9pZHMpO1xuICB9LFxuICByZWxhdGVkUmVjb3JkVXJsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYWJzb2x1dGUsIGlkLCBpbnMsIG9iamNldE5hbWU7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICAgIGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgfVxuICAgIG9iamNldE5hbWUgPSBpbnMucmVjb3JkX2lkc1swXS5vO1xuICAgIGlkID0gaW5zLnJlY29yZF9pZHNbMF0uaWRzWzBdO1xuICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcImFwcC8tL1wiICsgb2JqY2V0TmFtZSArIFwiL3ZpZXcvXCIgKyBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiYXBwLy0vXCIgKyBvYmpjZXROYW1lICsgXCIvdmlldy9cIiArIGlkKTtcbiAgICB9XG4gIH1cbn07XG4iLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxNToyOToyMlxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuLy8gSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS93b3JrZmxvdy9nZXRTcGFjZVVzZXJzXCIsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuLy8gICB2YXJcbi8vICAgICB1c2VySWRzID0gcmVxLmJvZHkudXNlcklkcyxcbi8vICAgICBzcGFjZUlkID0gcmVxLnF1ZXJ5LnNwYWNlSWQsXG4vLyAgICAgc3BhY2VVc2VycyA9IFtdXG4vLyAgIDtcblxuLy8gICBpZiAoIXVzZXJJZHMgfHwgIXNwYWNlSWQpIHtcbi8vICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgICBjb2RlOiAyMDAsXG4vLyAgICAgICBkYXRhOiB7XG4vLyAgICAgICAgICdlcnJvcnMnOiAn57y65bCR5Y+C5pWwJ1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG5cbi8vICAgc3BhY2VVc2VycyA9IFdvcmtmbG93TWFuYWdlci5nZXRVc2VycyhzcGFjZUlkLCB1c2VySWRzKTtcblxuLy8gICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgY29kZTogMjAwLFxuLy8gICAgIGRhdGE6IHtcbi8vICAgICAgICdzcGFjZVVzZXJzJzogc3BhY2VVc2Vyc1xuLy8gICAgIH1cbi8vICAgfSk7XG4vLyB9KVxuXG5cbiAgXG4gICIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDE1OjIzOjE0XG4gKiBARGVzY3JpcHRpb246IFxuICovXG4vLyBKc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL3dvcmtmbG93L2dldEZvcm11bGFVc2VyT2JqZWN0c1wiLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbi8vICAgdmFyXG4vLyAgICAgdXNlcklkcyA9IHJlcS5ib2R5LnVzZXJJZHMsXG4vLyAgICAgc3BhY2VJZCA9IHJlcS5xdWVyeS5zcGFjZUlkLFxuLy8gICAgIHNwYWNlVXNlcnMgPSBbXVxuLy8gICA7XG5cbi8vICAgaWYgKCF1c2VySWRzIHx8ICFzcGFjZUlkKSB7XG4vLyAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gICAgICAgY29kZTogMjAwLFxuLy8gICAgICAgZGF0YToge1xuLy8gICAgICAgICAnZXJyb3JzJzogJ+e8uuWwkeWPguaVsCdcbi8vICAgICAgIH1cbi8vICAgICB9KTtcbi8vICAgfVxuXG4vLyAgIHZhciB1c2VycyA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhVXNlck9iamVjdChzcGFjZUlkLCB1c2VySWRzKTtcblxuLy8gICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgY29kZTogMjAwLFxuLy8gICAgIGRhdGE6IHtcbi8vICAgICAgICdzcGFjZVVzZXJzJzogdXNlcnNcbi8vICAgICB9XG4vLyAgIH0pO1xuLy8gfSlcblxuXG4gIFxuICAiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxNTozODo1NFxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuLy8gSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS93b3JrZmxvdy9pbml0X2Zvcm11bGFfdmFsdWVzXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4vLyBcdHZhclxuLy8gXHRcdGZpZWxkcyA9IHJlcS5ib2R5LmZpZWxkcyxcbi8vIFx0XHRhdXRvRm9ybURvYyA9IHJlcS5ib2R5LmF1dG9Gb3JtRG9jLFxuLy8gXHRcdGFwcHJvdmVyID0gcmVxLmJvZHkuYXBwcm92ZXIsXG4vLyBcdFx0YXBwbGljYW50ID0gcmVxLmJvZHkuYXBwbGljYW50LFxuXG4vLyBcdFx0c3BhY2VJZCA9IHJlcS5xdWVyeS5zcGFjZUlkLFxuXG4vLyBcdFx0c3BhY2VVc2VycyA9IFtdO1xuXG4vLyBcdGlmICghZmllbGRzIHx8ICFzcGFjZUlkIHx8ICFhdXRvRm9ybURvYyB8fCAhYXBwcm92ZXIgfHwgIWFwcGxpY2FudCkge1xuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHtcbi8vIFx0XHRcdFx0J2Vycm9ycyc6ICfnvLrlsJHlj4LmlbAnXG4vLyBcdFx0XHR9XG4vLyBcdFx0fSk7XG4vLyBcdFx0cmV0dXJuO1xuLy8gXHR9XG5cbi8vIFx0Zm9ybXVsYV92YWx1ZXMgPSBGb3JtX2Zvcm11bGEuaW5pdF9mb3JtdWxhX3ZhbHVlcyhmaWVsZHMsIGF1dG9Gb3JtRG9jLCBhcHByb3ZlciwgYXBwbGljYW50LCBzcGFjZUlkKTtcblxuLy8gXHRKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyBcdFx0Y29kZTogMjAwLFxuLy8gXHRcdGRhdGE6IHtcbi8vIFx0XHRcdCdmb3JtdWxhX3ZhbHVlcyc6IGZvcm11bGFfdmFsdWVzXG4vLyBcdFx0fVxuLy8gXHR9KTtcbi8vIH0pXG4iLCIvLyBKc29uUm91dGVzLmFkZCgncG9zdCcsICcvYXBpL3dvcmtmbG93L2ZvcndhcmQnLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbi8vIFx0dHJ5IHtcbi8vIFx0XHR2YXIgY3VycmVudF91c2VyX2luZm8gPSB1dWZsb3dNYW5hZ2VyLmNoZWNrX2F1dGhvcml6YXRpb24ocmVxKTtcbi8vIFx0XHR2YXIgY3VycmVudF91c2VyX2lkID0gY3VycmVudF91c2VyX2luZm8uX2lkO1xuXG4vLyBcdFx0dmFyIGhhc2hEYXRhID0gcmVxLmJvZHk7XG4vLyBcdFx0dmFyIGluc3RhbmNlX2lkID0gaGFzaERhdGEuaW5zdGFuY2VfaWQ7XG4vLyBcdFx0dmFyIHNwYWNlX2lkID0gaGFzaERhdGEuc3BhY2VfaWQ7XG4vLyBcdFx0dmFyIGZsb3dfaWQgPSBoYXNoRGF0YS5mbG93X2lkO1xuLy8gXHRcdHZhciBoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQgPSBoYXNoRGF0YS5oYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQ7XG4vLyBcdFx0dmFyIGRlc2NyaXB0aW9uID0gaGFzaERhdGEuZGVzY3JpcHRpb247XG4vLyBcdFx0dmFyIGlzRm9yd2FyZEF0dGFjaG1lbnRzID0gaGFzaERhdGEuaXNGb3J3YXJkQXR0YWNobWVudHM7XG4vLyBcdFx0dmFyIHNlbGVjdGVkVXNlcnMgPSBoYXNoRGF0YS5zZWxlY3RlZFVzZXJzO1xuLy8gXHRcdHZhciBhY3Rpb25fdHlwZSA9IGhhc2hEYXRhLmFjdGlvbl90eXBlO1xuLy8gXHRcdHZhciByZWxhdGVkID0gaGFzaERhdGEucmVsYXRlZDtcbi8vIFx0XHR2YXIgZnJvbV9hcHByb3ZlX2lkID0gaGFzaERhdGEuZnJvbV9hcHByb3ZlX2lkO1xuXG4vLyBcdFx0Y2hlY2soaW5zdGFuY2VfaWQsIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soc3BhY2VfaWQsIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soZmxvd19pZCwgU3RyaW5nKTtcbi8vIFx0XHRjaGVjayhoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQsIEJvb2xlYW4pO1xuLy8gXHRcdGNoZWNrKGRlc2NyaXB0aW9uLCBTdHJpbmcpO1xuLy8gXHRcdGNoZWNrKGlzRm9yd2FyZEF0dGFjaG1lbnRzLCBCb29sZWFuKTtcbi8vIFx0XHRjaGVjayhzZWxlY3RlZFVzZXJzLCBBcnJheSk7XG4vLyBcdFx0Y2hlY2soYWN0aW9uX3R5cGUsIE1hdGNoLk9uZU9mKCdmb3J3YXJkJywgJ2Rpc3RyaWJ1dGUnKSk7XG5cbi8vIFx0XHRpZiAoYWN0aW9uX3R5cGUgPT0gXCJkaXN0cmlidXRlXCIpXG4vLyBcdFx0XHRjaGVjayhmcm9tX2FwcHJvdmVfaWQsIFN0cmluZyk7XG5cbi8vIFx0XHR2YXIgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQpO1xuLy8gXHRcdHZhciBvbGRfc3BhY2VfaWQgPSBpbnMuc3BhY2U7XG5cbi8vIFx0XHR2YXIgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoZmxvd19pZCk7XG5cbi8vIFx0XHR2YXIgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZV9pZCk7XG5cbi8vIFx0XHRpZiAoIWlucyB8fCAhZmxvdyB8fCAhc3BhY2UpIHtcbi8vIFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ3BhcmFtcyBlcnJvciEnLCAncmVjb3JkIG5vdCBleGlzdHMhJyk7XG4vLyBcdFx0fVxuXG4vLyBcdFx0dmFyIGZvcndhcmRfdXNlcnMgPSBuZXcgQXJyYXk7XG4vLyBcdFx0aWYgKF8uaXNFbXB0eShzZWxlY3RlZFVzZXJzKSkge1xuLy8gXHRcdFx0Zm9yd2FyZF91c2VycyA9IFtjdXJyZW50X3VzZXJfaWRdO1xuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRmb3J3YXJkX3VzZXJzID0gc2VsZWN0ZWRVc2Vycztcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyDmoKHpqozliIblj5Hlr7nosaHmmK/lkKbmnInliIblj5HmtYHnqIvnmoTmj5DkuqTmnYPpmZBcbi8vIFx0XHR2YXIgbm9fcGVybWlzc2lvbl91c2VyX2lkcyA9IG5ldyBBcnJheSgpO1xuLy8gXHRcdF8uZWFjaChmb3J3YXJkX3VzZXJzLCBmdW5jdGlvbiAodWlkKSB7XG4vLyBcdFx0XHR2YXIgcGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uTWFuYWdlci5nZXRGbG93UGVybWlzc2lvbnMoZmxvd19pZCwgdWlkKTtcbi8vIFx0XHRcdGlmICghcGVybWlzc2lvbnMuaW5jbHVkZXMoXCJhZGRcIikpIHtcbi8vIFx0XHRcdFx0Ly8gdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLor6XnlLPor7fkurrmsqHmnInmj5DkuqTmraTnlLPor7fljZXnmoTmnYPpmZDjgIJcIilcbi8vIFx0XHRcdFx0bm9fcGVybWlzc2lvbl91c2VyX2lkcy5wdXNoKHVpZCk7XG4vLyBcdFx0XHR9XG4vLyBcdFx0fSlcbi8vIFx0XHRpZiAoIV8uaXNFbXB0eShub19wZXJtaXNzaW9uX3VzZXJfaWRzKSkge1xuLy8gXHRcdFx0dmFyIG5vX3Blcm1pc3Npb25fdXNlcnNfbmFtZSA9IG5ldyBBcnJheSgpO1xuLy8gXHRcdFx0ZGIudXNlcnMuZmluZCh7XG4vLyBcdFx0XHRcdF9pZDoge1xuLy8gXHRcdFx0XHRcdCRpbjogbm9fcGVybWlzc2lvbl91c2VyX2lkc1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRcdG5hbWU6IDFcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSkuZm9yRWFjaChmdW5jdGlvbiAodSkge1xuLy8gXHRcdFx0XHRub19wZXJtaXNzaW9uX3VzZXJzX25hbWUucHVzaCh1Lm5hbWUpO1xuLy8gXHRcdFx0fSk7XG4vLyBcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdub19wZXJtaXNzaW9uJywgXCLor6Xmj5DkuqTkurrmsqHmnInmj5DkuqTmraTnlLPor7fljZXnmoTmnYPpmZDjgIJcIiwgbm9fcGVybWlzc2lvbl91c2Vyc19uYW1lLmpvaW4oJywnKSlcbi8vIFx0XHR9XG5cbi8vIFx0XHR2YXIgbmV3X2luc19pZHMgPSBuZXcgQXJyYXk7XG5cbi8vIFx0XHR2YXIgY3VycmVudF90cmFjZSA9IG51bGw7XG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09IFwiZGlzdHJpYnV0ZVwiKSB7XG4vLyBcdFx0XHRfLmVhY2goaW5zLnRyYWNlcywgZnVuY3Rpb24gKHQpIHtcbi8vIFx0XHRcdFx0aWYgKCFjdXJyZW50X3RyYWNlKSB7XG4vLyBcdFx0XHRcdFx0Xy5lYWNoKHQuYXBwcm92ZXMsIGZ1bmN0aW9uIChhKSB7XG4vLyBcdFx0XHRcdFx0XHRpZiAoIWN1cnJlbnRfdHJhY2UpIHtcbi8vIFx0XHRcdFx0XHRcdFx0aWYgKGEuX2lkID09IGZyb21fYXBwcm92ZV9pZClcbi8vIFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50X3RyYWNlID0gdDtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KVxuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRjdXJyZW50X3RyYWNlID0gXy5sYXN0KGlucy50cmFjZXMpO1xuLy8gXHRcdH1cbi8vIFx0XHR2YXIgY3VycmVudF90cmFjZV9pZCA9IGN1cnJlbnRfdHJhY2UuX2lkO1xuLy8gXHRcdHZhciBmb3J3YXJkX2FwcHJvdmVzID0gW107XG4vLyBcdFx0dmFyIGZyb21fdXNlcl9uYW1lID0gZGIudXNlcnMuZmluZE9uZShjdXJyZW50X3VzZXJfaWQsIHtcbi8vIFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRuYW1lOiAxXG4vLyBcdFx0XHR9XG4vLyBcdFx0fSkubmFtZVxuLy8gXHRcdHZhciBzZXRfb2JqID0gbmV3IE9iamVjdDtcblxuLy8gXHRcdC8vIOiuoeeul3ZhbHVlc1xuLy8gXHRcdHZhciBvbGRfdmFsdWVzID0gaW5zLnZhbHVlcyxcbi8vIFx0XHRcdG5ld192YWx1ZXMgPSB7fTtcbi8vIFx0XHR2YXIgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoZmxvdy5mb3JtKTtcbi8vIFx0XHR2YXIgZmllbGRzID0gZm9ybS5jdXJyZW50LmZpZWxkcyB8fCBbXTtcblxuLy8gXHRcdHZhciBvbGRfZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zLmZvcm0pO1xuLy8gXHRcdHZhciBvbGRfZm9ybV92ZXJzaW9uID0gaW5zLmZvcm1fdmVyc2lvbixcbi8vIFx0XHRcdG9sZF9maWVsZHMgPSBbXSxcbi8vIFx0XHRcdGNvbW1vbl9maWVsZHMgPSBbXTtcblxuLy8gXHRcdHZhciBzZWxlY3RfdG9faW5wdXRfZmllbGRzID0gW107XG5cbi8vIFx0XHRpZiAob2xkX2Zvcm0uY3VycmVudC5faWQgPT0gb2xkX2Zvcm1fdmVyc2lvbikge1xuLy8gXHRcdFx0b2xkX2ZpZWxkcyA9IG9sZF9mb3JtLmN1cnJlbnQuZmllbGRzO1xuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRpZiAob2xkX2Zvcm0uaGlzdG9yeXMpIHtcbi8vIFx0XHRcdFx0b2xkX2Zvcm0uaGlzdG9yeXMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuLy8gXHRcdFx0XHRcdGlmIChoLl9pZCA9PSBvbGRfZm9ybV92ZXJzaW9uKVxuLy8gXHRcdFx0XHRcdFx0b2xkX2ZpZWxkcyA9IGguZmllbGRzO1xuLy8gXHRcdFx0XHR9KVxuLy8gXHRcdFx0fVxuLy8gXHRcdH1cblxuLy8gXHRcdGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuLy8gXHRcdFx0dmFyIGV4aXN0c19maWVsZCA9IF8uZmluZChvbGRfZmllbGRzLCBmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRyZXR1cm4gZi50eXBlID09IGZpZWxkLnR5cGUgJiYgZi5jb2RlID09IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0aWYgKGV4aXN0c19maWVsZClcbi8vIFx0XHRcdFx0Y29tbW9uX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbi8vIFx0XHRcdHZhciBzZWxlY3RfaW5wdXRfZmllbGQgPSBfLmZpbmQob2xkX2ZpZWxkcywgZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0cmV0dXJuIGYudHlwZSA9PSAnc2VsZWN0JyAmJiBmaWVsZC50eXBlID09ICdpbnB1dCcgJiYgZi5jb2RlID09IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0aWYgKHNlbGVjdF9pbnB1dF9maWVsZClcbi8vIFx0XHRcdFx0c2VsZWN0X3RvX2lucHV0X2ZpZWxkcy5wdXNoKHNlbGVjdF9pbnB1dF9maWVsZCk7XG4vLyBcdFx0fSlcblxuLy8gXHRcdHNlbGVjdF90b19pbnB1dF9maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbi8vIFx0XHRcdGlmIChvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdKSB7XG4vLyBcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0gPSBvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdO1xuLy8gXHRcdFx0fVxuLy8gXHRcdH0pXG5cbi8vIFx0XHRjb21tb25fZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4vLyBcdFx0XHRpZiAoZmllbGQudHlwZSA9PSAnc2VjdGlvbicpIHtcbi8vIFx0XHRcdFx0aWYgKGZpZWxkLmZpZWxkcykge1xuLy8gXHRcdFx0XHRcdGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdFx0XHQvLyDot6jlt6XkvZzljLrovazlj5HkuI3lpI3liLbpgInkurrpgInnu4Rcbi8vIFx0XHRcdFx0XHRcdGlmIChbJ2dyb3VwJywgJ3VzZXInXS5pbmNsdWRlcyhmLnR5cGUpICYmIG9sZF9zcGFjZV9pZCAhPSBzcGFjZV9pZCkge1xuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHR2YXIga2V5ID0gZi5jb2RlO1xuLy8gXHRcdFx0XHRcdFx0dmFyIG9sZF92ID0gb2xkX3ZhbHVlc1trZXldO1xuLy8gXHRcdFx0XHRcdFx0aWYgKG9sZF92KSB7XG4vLyBcdFx0XHRcdFx0XHRcdHZhciBmaWVsZE9wdGlvbnMgPSBmLm9wdGlvbnMgJiYgZi5vcHRpb25zLnNwbGl0ICYmIGYub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHRcdFx0aWYgKGYudHlwZSA9PSAnc2VsZWN0JyB8fCBmLnR5cGUgPT0gJ3JhZGlvJykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRpZighc2VsZWN0ZWRPcHRpb24pe1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ211bHRpU2VsZWN0Jykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBvbGRfbXVsdGlTZWxlY3RlZCA9IG9sZF92LnNwbGl0KCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIG5ld19tdWx0aVNlbGVjdGVkID0gXy5pbnRlcnNlY3Rpb24oZmllbGRPcHRpb25zLm1hcChmdW5jdGlvbihuKXsgcmV0dXJuIG4udmFsdWU7IH0pLCBvbGRfbXVsdGlTZWxlY3RlZCk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0b2xkX3YgPSBuZXdfbXVsdGlTZWxlY3RlZC5qb2luKCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0XHRuZXdfdmFsdWVzW2tleV0gPSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gJ3RhYmxlJykge1xuLy8gXHRcdFx0XHRpZiAoIV8uaXNFbXB0eShvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdKSkge1xuLy8gXHRcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0gPSBuZXcgQXJyYXk7XG4vLyBcdFx0XHRcdFx0b2xkX3ZhbHVlc1tmaWVsZC5jb2RlXS5mb3JFYWNoKGZ1bmN0aW9uIChvbGRfdGFibGVfcm93X3ZhbHVlcykge1xuLy8gXHRcdFx0XHRcdFx0dmFyIG5ld190YWJsZV9yb3dfdmFsdWVzID0ge307XG5cbi8vIFx0XHRcdFx0XHRcdGlmICghXy5pc0VtcHR5KGZpZWxkLmZpZWxkcykpIHtcbi8vIFx0XHRcdFx0XHRcdFx0ZmllbGQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHQvLyDot6jlt6XkvZzljLrovazlj5HkuI3lpI3liLbpgInkurrpgInnu4Rcbi8vIFx0XHRcdFx0XHRcdFx0XHRpZiAoWydncm91cCcsICd1c2VyJ10uaW5jbHVkZXMoZi50eXBlKSAmJiBvbGRfc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIGtleSA9IGYuY29kZTtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgb2xkX3YgPSBvbGRfdGFibGVfcm93X3ZhbHVlc1trZXldO1xuLy8gXHRcdFx0XHRcdFx0XHRcdGlmIChvbGRfdikge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGZpZWxkT3B0aW9ucyA9IGYub3B0aW9ucyAmJiBmLm9wdGlvbnMuc3BsaXQgJiYgZi5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKXtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogaXRlbVNwbGl0c1swXSxcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ3NlbGVjdCcgfHwgZi50eXBlID09ICdyYWRpbycpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdGlmKCFzZWxlY3RlZE9wdGlvbil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ211bHRpU2VsZWN0Jykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgb2xkX211bHRpU2VsZWN0ZWQgPSBvbGRfdi5zcGxpdCgnLCcpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgbmV3X211bHRpU2VsZWN0ZWQgPSBfLmludGVyc2VjdGlvbihmaWVsZE9wdGlvbnMubWFwKGZ1bmN0aW9uKG4peyByZXR1cm4gbi52YWx1ZTsgfSksIG9sZF9tdWx0aVNlbGVjdGVkKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkX3YgPSBuZXdfbXVsdGlTZWxlY3RlZC5qb2luKCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdG5ld190YWJsZV9yb3dfdmFsdWVzW2tleV0gPSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdGlmIChvbGRfdGFibGVfcm93X3ZhbHVlcy5faWQpIHtcbi8vIFx0XHRcdFx0XHRcdFx0bmV3X3RhYmxlX3Jvd192YWx1ZXMuX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cjtcbi8vIFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0aWYgKCFfLmlzRW1wdHkobmV3X3RhYmxlX3Jvd192YWx1ZXMpKSB7XG4vLyBcdFx0XHRcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0ucHVzaChuZXdfdGFibGVfcm93X3ZhbHVlcyk7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdFx0Ly8g6Leo5bel5L2c5Yy66L2s5Y+R5LiN5aSN5Yi26YCJ5Lq66YCJ57uEXG4vLyBcdFx0XHRcdGlmIChbJ2dyb3VwJywgJ3VzZXInXS5pbmNsdWRlcyhmaWVsZC50eXBlKSAmJiBvbGRfc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHtcbi8vIFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdFx0dmFyIGtleSA9IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHRcdHZhciBvbGRfdiA9IG9sZF92YWx1ZXNba2V5XTtcbi8vIFx0XHRcdFx0aWYgKG9sZF92KSB7XG4vLyBcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHR2YXIgZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucyAmJiBmaWVsZC5vcHRpb25zLnNwbGl0ICYmIGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuLy8gXHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdHJldHVybiB7XG4vLyBcdFx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuLy8gXHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT0gJ3NlbGVjdCcgfHwgZmllbGQudHlwZSA9PSAncmFkaW8nKSB7XG4vLyBcdFx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0aWYoIXNlbGVjdGVkT3B0aW9uKXtcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdGlmIChmaWVsZC50eXBlID09ICdtdWx0aVNlbGVjdCcpIHtcbi8vIFx0XHRcdFx0XHRcdHZhciBvbGRfbXVsdGlTZWxlY3RlZCA9IG9sZF92LnNwbGl0KCcsJyk7XG4vLyBcdFx0XHRcdFx0XHR2YXIgbmV3X211bHRpU2VsZWN0ZWQgPSBfLmludGVyc2VjdGlvbihmaWVsZE9wdGlvbnMubWFwKGZ1bmN0aW9uKG4peyByZXR1cm4gbi52YWx1ZTsgfSksIG9sZF9tdWx0aVNlbGVjdGVkKTtcbi8vIFx0XHRcdFx0XHRcdG9sZF92ID0gbmV3X211bHRpU2VsZWN0ZWQuam9pbignLCcpO1xuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdG5ld192YWx1ZXNba2V5XSA9IG9sZF92O1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHR9KVxuXG4vLyBcdFx0Ly/lpoLmnpzmmK/liIblj5HvvIzliJl2YWx1ZeS4reeahHJlY29yZF9uZWVk44CBRk9ORFNJROS4jemcgOimgeWIhuWPkeWIsOaWsOeUs+ivt+WNleS4rVxuLy8gXHRcdGlmIChhY3Rpb25fdHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnKSB7XG4vLyBcdFx0XHRkZWxldGUgbmV3X3ZhbHVlcy5yZWNvcmRfbmVlZDtcbi8vIFx0XHRcdGRlbGV0ZSBuZXdfdmFsdWVzLkZPTkRTSUQ7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8g6K6h566X55Sz6K+35Y2V5qCH6aKYXG4vLyBcdFx0dmFyIGluc3RhbmNlX25hbWUgPSBcIlwiO1xuLy8gXHRcdHZhciBuYW1lX2ZvcnVtbGEgPSBmb3JtLmN1cnJlbnQubmFtZV9mb3J1bWxhO1xuLy8gXHRcdGlmIChuYW1lX2ZvcnVtbGEpIHtcbi8vIFx0XHRcdHRyeSB7XG4vLyBcdFx0XHRcdHZhciBpc2NyaXB0ID0gbmFtZV9mb3J1bWxhLnJlcGxhY2UoL1xcey9nLCBcIihuZXdfdmFsdWVzWydcIikucmVwbGFjZSgvXFx9L2csIFwiJ10gfHwgJycpXCIpO1xuLy8gXHRcdFx0XHR2YXIgcmV2ID0gZXZhbChpc2NyaXB0KTtcbi8vIFx0XHRcdFx0aW5zdGFuY2VfbmFtZSA9IHJldiB8fCBmbG93Lm5hbWU7XG4vLyBcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuLy8gXHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdjYWN1bGF0ZV9pbnN0YW5jZV9uYW1lJywgXCLorqHnrpfnlLPor7fljZXmoIfpopjlh7rplJnor7fmo4Dmn6XooajljZXmoIfpopjohJrmnKzjgIJcIik7XG4vLyBcdFx0XHR9XG4vLyBcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdGluc3RhbmNlX25hbWUgPSBmbG93Lm5hbWU7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8gaW5zdGFuY2XkuK3orrDlvZXlvZPliY3mraXpqqTlkI3np7AgIzEzMTRcbi8vIFx0XHR2YXIgc3RhcnRfc3RlcCA9IF8uZmluZChmbG93LmN1cnJlbnQuc3RlcHMsIGZ1bmN0aW9uIChzdGVwKSB7XG4vLyBcdFx0XHRyZXR1cm4gc3RlcC5zdGVwX3R5cGUgPT0gJ3N0YXJ0Jztcbi8vIFx0XHR9KVxuXG4vLyBcdFx0Ly8g5rWB56iL6L2s5Y+R5Yqf6IO95L+u5pS55Li677yM5byA5aeL6IqC54K55pyJ57yW6L6R5p2D6ZmQ55qE5a2X5q6155qE5YC86L+b6KGM5aSN5Yi277yM5peg57yW6L6R5p2D6ZmQ55qE5a2X5q615YC85LiN6L+b6KGM5aSN5Yi2ICMzNzQ4XG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09PSAnZm9yd2FyZCcpIHtcbi8vIFx0XHRcdG5ld192YWx1ZXMgPSB1dWZsb3dNYW5hZ2VyLmdldEFwcHJvdmVWYWx1ZXMobmV3X3ZhbHVlcywgc3RhcnRfc3RlcC5wZXJtaXNzaW9ucywgZmxvdy5mb3JtLCBmbG93LmN1cnJlbnQuZm9ybV92ZXJzaW9uKTtcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyDmlrDlu7rnlLPor7fljZXml7bvvIxpbnN0YW5jZXPorrDlvZXmtYHnqIvlkI3np7DjgIHmtYHnqIvliIbnsbvlkI3np7AgIzEzMTNcbi8vIFx0XHR2YXIgY2F0ZWdvcnlfbmFtZSA9IFwiXCI7XG4vLyBcdFx0aWYgKGZvcm0uY2F0ZWdvcnkpIHtcbi8vIFx0XHRcdHZhciBjYXRlZ29yeSA9IHV1Zmxvd01hbmFnZXIuZ2V0Q2F0ZWdvcnkoZm9ybS5jYXRlZ29yeSk7XG4vLyBcdFx0XHRpZiAoY2F0ZWdvcnkpXG4vLyBcdFx0XHRcdGNhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5uYW1lO1xuLy8gXHRcdH1cblxuLy8gXHRcdF8uZWFjaChmb3J3YXJkX3VzZXJzLCBmdW5jdGlvbiAodXNlcl9pZCkge1xuXG4vLyBcdFx0XHR2YXIgdXNlcl9pbmZvID0gZGIudXNlcnMuZmluZE9uZSh1c2VyX2lkKTtcblxuLy8gXHRcdFx0dmFyIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbi8vIFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHR1c2VyOiB1c2VyX2lkXG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRcdG9yZ2FuaXphdGlvbjogMVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KTtcbi8vIFx0XHRcdHZhciBzcGFjZV91c2VyX29yZ19pbmZvID0gZGIub3JnYW5pemF0aW9ucy5maW5kT25lKHtcbi8vIFx0XHRcdFx0X2lkOiBzcGFjZV91c2VyLm9yZ2FuaXphdGlvblxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHRmaWVsZHM6IHtcbi8vIFx0XHRcdFx0XHRuYW1lOiAxLFxuLy8gXHRcdFx0XHRcdGZ1bGxuYW1lOiAxXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pO1xuXG4vLyBcdFx0XHR2YXIgbm93ID0gbmV3IERhdGUoKTtcbi8vIFx0XHRcdHZhciBpbnNfb2JqID0ge307XG5cbi8vIFx0XHRcdHZhciBhZ2VudCA9IHV1Zmxvd01hbmFnZXIuZ2V0QWdlbnQoc3BhY2VfaWQsIHVzZXJfaWQpO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfaWQgPSB1c2VyX2lkO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfaW5mbyA9IHVzZXJfaW5mbztcbi8vIFx0XHRcdHZhciBoYW5kbGVyX3NwYWNlX3VzZXIgPSBzcGFjZV91c2VyO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfb3JnX2luZm8gPSBzcGFjZV91c2VyX29yZ19pbmZvO1xuLy8gXHRcdFx0aWYgKGFnZW50KSB7XG4vLyBcdFx0XHRcdGhhbmRsZXJfaWQgPSBhZ2VudDtcbi8vIFx0XHRcdFx0aGFuZGxlcl9pbmZvID0gZGIudXNlcnMuZmluZE9uZShhZ2VudCk7XG4vLyBcdFx0XHRcdGhhbmRsZXJfc3BhY2VfdXNlciA9IHV1Zmxvd01hbmFnZXIuZ2V0U3BhY2VVc2VyKHNwYWNlX2lkLCBhZ2VudCk7XG4vLyBcdFx0XHRcdGhhbmRsZXJfb3JnX2luZm8gPSB1dWZsb3dNYW5hZ2VyLmdldFNwYWNlVXNlck9yZ0luZm8oaGFuZGxlcl9zcGFjZV91c2VyKTtcbi8vIFx0XHRcdH1cbi8vIFx0XHRcdGluc19vYmouX2lkID0gZGIuaW5zdGFuY2VzLl9tYWtlTmV3SUQoKTtcbi8vIFx0XHRcdGluc19vYmouc3BhY2UgPSBzcGFjZV9pZDtcbi8vIFx0XHRcdGluc19vYmouZmxvdyA9IGZsb3dfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudC5faWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmZvcm0gPSBmbG93LmZvcm07XG4vLyBcdFx0XHRpbnNfb2JqLmZvcm1fdmVyc2lvbiA9IGZsb3cuY3VycmVudC5mb3JtX3ZlcnNpb247XG4vLyBcdFx0XHRpbnNfb2JqLm5hbWUgPSBpbnN0YW5jZV9uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5zdWJtaXR0ZXIgPSBoYW5kbGVyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5zdWJtaXR0ZXJfbmFtZSA9IGhhbmRsZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnQgPSB1c2VyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfbmFtZSA9IHVzZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uID0gc3BhY2VfdXNlci5vcmdhbml6YXRpb247XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZSA9IHNwYWNlX3VzZXJfb3JnX2luZm8ubmFtZTtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IHNwYWNlX3VzZXJfb3JnX2luZm8uZnVsbG5hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLnN0YXRlID0gXCJkcmFmdFwiO1xuLy8gXHRcdFx0aW5zX29iai5jb2RlID0gXCJcIjtcbi8vIFx0XHRcdGluc19vYmouaXNfYXJjaGl2ZWQgPSBmYWxzZTtcbi8vIFx0XHRcdGluc19vYmouaXNfZGVsZXRlZCA9IGZhbHNlO1xuLy8gXHRcdFx0aW5zX29iai5jcmVhdGVkID0gbm93O1xuLy8gXHRcdFx0aW5zX29iai5jcmVhdGVkX2J5ID0gY3VycmVudF91c2VyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5tb2RpZmllZCA9IG5vdztcbi8vIFx0XHRcdGluc19vYmoubW9kaWZpZWRfYnkgPSBjdXJyZW50X3VzZXJfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmluYm94X3VzZXJzID0gW2hhbmRsZXJfaWRdO1xuLy8gXHRcdFx0aW5zX29iai52YWx1ZXMgPSBuZXdfdmFsdWVzO1xuLy8gXHRcdFx0aWYgKGFjdGlvbl90eXBlID09ICdkaXN0cmlidXRlJykge1xuLy8gXHRcdFx0XHQvLyDop6PlhrPlpJrmrKHliIblj5HnnIvkuI3liLDmraPmlofjgIHpmYTku7bpl67pophcbi8vIFx0XHRcdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UpIHtcbi8vIFx0XHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSA9IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2U7XG4vLyBcdFx0XHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgPSBpbnN0YW5jZV9pZDtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcbi8vIFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzLnB1c2goaW5zdGFuY2VfaWQpO1xuXG4vLyBcdFx0XHRcdGlmIChyZWxhdGVkKSB7XG4vLyBcdFx0XHRcdFx0aW5zX29iai5yZWxhdGVkX2luc3RhbmNlcyA9IFtpbnN0YW5jZV9pZF1cbi8vIFx0XHRcdFx0fVxuXG4vLyBcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbl90eXBlID09ICdmb3J3YXJkJykge1xuLy8gXHRcdFx0XHRpbnNfb2JqLmZvcndhcmRfZnJvbV9pbnN0YW5jZSA9IGluc3RhbmNlX2lkXG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdC8vIOaWsOW7ulRyYWNlXG4vLyBcdFx0XHR2YXIgdHJhY2Vfb2JqID0ge307XG4vLyBcdFx0XHR0cmFjZV9vYmouX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cjtcbi8vIFx0XHRcdHRyYWNlX29iai5pbnN0YW5jZSA9IGluc19vYmouX2lkO1xuLy8gXHRcdFx0dHJhY2Vfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG5cbi8vIFx0XHRcdC8vIOW9k+WJjeacgOaWsOeJiGZsb3fkuK3lvIDlp4voioLngrnnmoRzdGVwX2lkXG4vLyBcdFx0XHR2YXIgc3RlcF9pZCwgc3RlcF9uYW1lLCBjYW5fZWRpdF9tYWluX2F0dGFjaCwgY2FuX2VkaXRfbm9ybWFsX2F0dGFjaDtcbi8vIFx0XHRcdGZsb3cuY3VycmVudC5zdGVwcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGVwKSB7XG4vLyBcdFx0XHRcdGlmIChzdGVwLnN0ZXBfdHlwZSA9PSBcInN0YXJ0XCIpIHtcbi8vIFx0XHRcdFx0XHRzdGVwX2lkID0gc3RlcC5faWQ7XG4vLyBcdFx0XHRcdFx0c3RlcF9uYW1lID0gc3RlcC5uYW1lO1xuLy8gXHRcdFx0XHRcdGNhbl9lZGl0X21haW5fYXR0YWNoID0gc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaDtcbi8vIFx0XHRcdFx0XHRjYW5fZWRpdF9ub3JtYWxfYXR0YWNoID0gc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoO1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0dHJhY2Vfb2JqLnN0ZXAgPSBzdGVwX2lkO1xuLy8gXHRcdFx0dHJhY2Vfb2JqLnN0YXJ0X2RhdGUgPSBub3c7XG4vLyBcdFx0XHR0cmFjZV9vYmoubmFtZSA9IHN0ZXBfbmFtZTtcblxuLy8gXHRcdFx0Ly8g5paw5bu6QXBwcm92ZVxuLy8gXHRcdFx0dmFyIGFwcHJfb2JqID0ge307XG4vLyBcdFx0XHRhcHByX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuLy8gXHRcdFx0YXBwcl9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLnRyYWNlID0gdHJhY2Vfb2JqLl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG4vLyBcdFx0XHRhcHByX29iai51c2VyID0gdXNlcl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLnVzZXJfbmFtZSA9IHVzZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlciA9IGhhbmRsZXJfaWQ7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX25hbWUgPSBoYW5kbGVyX2luZm8ubmFtZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uID0gaGFuZGxlcl9zcGFjZV91c2VyLm9yZ2FuaXphdGlvbjtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUgPSBoYW5kbGVyX29yZ19pbmZvLm5hbWU7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IGhhbmRsZXJfb3JnX2luZm8uZnVsbG5hbWU7XG4vLyBcdFx0XHRhcHByX29iai50eXBlID0gXCJkcmFmdFwiO1xuLy8gXHRcdFx0YXBwcl9vYmouc3RhcnRfZGF0ZSA9IG5vdztcbi8vIFx0XHRcdGFwcHJfb2JqLnJlYWRfZGF0ZSA9IG5vdztcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX3JlYWQgPSBmYWxzZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX2Vycm9yID0gZmFsc2U7XG5cbi8vIFx0XHRcdGFwcHJfb2JqLnZhbHVlcyA9IG5ld192YWx1ZXM7XG5cbi8vIFx0XHRcdGlmIChhZ2VudCkge1xuLy8gXHRcdFx0XHRhcHByX29iai5hZ2VudCA9IGFnZW50O1xuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHR0cmFjZV9vYmouYXBwcm92ZXMgPSBbYXBwcl9vYmpdO1xuLy8gXHRcdFx0aW5zX29iai50cmFjZXMgPSBbdHJhY2Vfb2JqXTtcblxuLy8gXHRcdFx0aWYgKGZsb3cuYXV0b19yZW1pbmQgPT0gdHJ1ZSlcbi8vIFx0XHRcdFx0aW5zX29iai5hdXRvX3JlbWluZCA9IHRydWU7XG5cbi8vIFx0XHRcdGluc19vYmouY3VycmVudF9zdGVwX25hbWUgPSBzdGFydF9zdGVwLm5hbWU7XG5cbi8vIFx0XHRcdGluc19vYmouZmxvd19uYW1lID0gZmxvdy5uYW1lO1xuLy8gXHRcdFx0aWYgKGNhdGVnb3J5X25hbWUpIHtcbi8vIFx0XHRcdFx0aW5zX29iai5jYXRlZ29yeV9uYW1lID0gY2F0ZWdvcnkubmFtZTtcbi8vIFx0XHRcdFx0aW5zX29iai5jYXRlZ29yeSA9IGNhdGVnb3J5Ll9pZDtcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0bmV3X2luc19pZCA9IGRiLmluc3RhbmNlcy5pbnNlcnQoaW5zX29iaik7XG5cbi8vIFx0XHRcdC8vIOWkjeWItumZhOS7tlxuLy8gXHRcdFx0dmFyIGNvbGxlY3Rpb24gPSBjZnMuaW5zdGFuY2VzO1xuXG4vLyBcdFx0XHQvL+WwhuWOn+ihqOWNleWGheWuueWtmOWCqOS4uuesrOS4gOS4qumZhOS7tlxuLy8gXHRcdFx0aWYgKGhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudCkge1xuLy8gXHRcdFx0XHQvLyB0cnkge1xuXG4vLyBcdFx0XHRcdGluc3RhbmNlSHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlcl9pbmZvLCBzcGFjZV9pZCwgaW5zLCB7XG4vLyBcdFx0XHRcdFx0YWJzb2x1dGU6IHRydWUsXG4vLyBcdFx0XHRcdFx0c2hvd1RyYWNlOiB0cnVlXG4vLyBcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdHZhciBpbnN0YW5jZUZpbGUgPSBuZXcgRlMuRmlsZSgpO1xuLy8gXHRcdFx0XHRpbnN0YW5jZUZpbGUuYXR0YWNoRGF0YShCdWZmZXIuZnJvbShpbnN0YW5jZUh0bWwsIFwidXRmLThcIiksIHtcbi8vIFx0XHRcdFx0XHR0eXBlOiBcInRleHQvaHRtbFwiXG4vLyBcdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnJvcikge1xuLy8gXHRcdFx0XHRcdGlmIChlcnJvcikge1xuLy8gXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnJvci5lcnJvciwgZXJyb3IucmVhc29uKTtcbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRpbnN0YW5jZUZpbGUubmFtZShpbnMubmFtZSArIFwiLmh0bWxcIik7XG4vLyBcdFx0XHRcdFx0aW5zdGFuY2VGaWxlLnNpemUoaW5zdGFuY2VIdG1sLmxlbmd0aCk7XG5cbi8vIFx0XHRcdFx0XHR2YXIgbWV0YWRhdGEgPSB7XG4vLyBcdFx0XHRcdFx0XHRvd25lcjogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHRcdG93bmVyX25hbWU6IHVzZXJfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHRcdFx0aW5zdGFuY2U6IG5ld19pbnNfaWQsXG4vLyBcdFx0XHRcdFx0XHRhcHByb3ZlOiBhcHByX29iai5faWQsXG4vLyBcdFx0XHRcdFx0XHRjdXJyZW50OiB0cnVlXG4vLyBcdFx0XHRcdFx0fTtcbi8vIFx0XHRcdFx0XHRpbnN0YW5jZUZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbi8vIFx0XHRcdFx0XHR2YXIgZmlsZU9iaiA9IGNvbGxlY3Rpb24uaW5zZXJ0KGluc3RhbmNlRmlsZSk7XG4vLyBcdFx0XHRcdFx0ZmlsZU9iai51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0JHNldDoge1xuLy8gXHRcdFx0XHRcdFx0XHQnbWV0YWRhdGEucGFyZW50JzogZmlsZU9iai5faWRcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9KVxuXG4vLyBcdFx0XHRcdC8vIH0gY2F0Y2ggKGUpIHtcbi8vIFx0XHRcdFx0Ly8gICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4vLyBcdFx0XHRcdC8vIH1cbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0aWYgKGlzRm9yd2FyZEF0dGFjaG1lbnRzICYmIGFjdGlvbl90eXBlID09ICdmb3J3YXJkJykge1xuLy8gXHRcdFx0XHR2YXIgZmlsZXMgPSBjb2xsZWN0aW9uLmZpbmQoe1xuLy8gXHRcdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZVxuLy8gXHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0ZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRcdC8vIOWIpOaWreaWsOeahOa1geeoi+W8gOWni+iKgueCueaYr+WQpuaciee8lui+keato+aWh+WSjOe8lui+kemZhOS7tuadg+mZkFxuLy8gXHRcdFx0XHRcdGlmIChmLm1ldGFkYXRhLm1haW4gPT0gdHJ1ZSkge1xuLy8gXHRcdFx0XHRcdFx0aWYgKGNhbl9lZGl0X21haW5fYXR0YWNoICE9IHRydWUgJiYgY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCAhPSB0cnVlKVxuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdFx0XHRcdGlmIChjYW5fZWRpdF9ub3JtYWxfYXR0YWNoICE9IHRydWUpXG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHR2YXIgbmV3RmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4vLyBcdFx0XHRcdFx0bmV3RmlsZS5hdHRhY2hEYXRhKGYuY3JlYXRlUmVhZFN0cmVhbSgnaW5zdGFuY2VzJyksIHtcbi8vIFx0XHRcdFx0XHRcdHR5cGU6IGYub3JpZ2luYWwudHlwZVxuLy8gXHRcdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnIpIHtcbi8vIFx0XHRcdFx0XHRcdGlmIChlcnIpIHtcbi8vIFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnIuZXJyb3IsIGVyci5yZWFzb24pO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0bmV3RmlsZS5uYW1lKGYubmFtZSgpKTtcbi8vIFx0XHRcdFx0XHRcdG5ld0ZpbGUuc2l6ZShmLnNpemUoKSk7XG4vLyBcdFx0XHRcdFx0XHR2YXIgbWV0YWRhdGEgPSB7XG4vLyBcdFx0XHRcdFx0XHRcdG93bmVyOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRvd25lcl9uYW1lOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRpbnN0YW5jZTogbmV3X2luc19pZCxcbi8vIFx0XHRcdFx0XHRcdFx0YXBwcm92ZTogYXBwcl9vYmouX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRjdXJyZW50OiB0cnVlXG4vLyBcdFx0XHRcdFx0XHR9O1xuLy8gXHRcdFx0XHRcdFx0aWYgKGYubWV0YWRhdGEubWFpbiA9PSB0cnVlICYmIGNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUpIHtcbi8vIFx0XHRcdFx0XHRcdFx0bWV0YWRhdGEubWFpbiA9IHRydWU7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRuZXdGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4vLyBcdFx0XHRcdFx0XHR2YXIgZmlsZU9iaiA9IGNvbGxlY3Rpb24uaW5zZXJ0KG5ld0ZpbGUpO1xuLy8gXHRcdFx0XHRcdFx0ZmlsZU9iai51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0XHQkc2V0OiB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0J21ldGFkYXRhLnBhcmVudCc6IGZpbGVPYmouX2lkXG4vLyBcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdFx0fSlcblxuLy8gXHRcdFx0XHR9KVxuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHRpZiAoYWN0aW9uX3R5cGUgPT09ICdkaXN0cmlidXRlJykge1xuLy8gXHRcdFx0XHQvLyDnu5nlvZPliY3nmoTnlLPor7fljZXlop7liqDliIblj5HorrDlvZVcbi8vIFx0XHRcdFx0dmFyIGFwcHIgPSB7XG4vLyBcdFx0XHRcdFx0J19pZCc6IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHIsXG4vLyBcdFx0XHRcdFx0J2luc3RhbmNlJzogaW5zdGFuY2VfaWQsXG4vLyBcdFx0XHRcdFx0J3RyYWNlJzogY3VycmVudF90cmFjZV9pZCxcbi8vIFx0XHRcdFx0XHQnaXNfZmluaXNoZWQnOiB0cnVlLFxuLy8gXHRcdFx0XHRcdCd1c2VyJzogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHQndXNlcl9uYW1lJzogdXNlcl9pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXInOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyX25hbWUnOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb24nOiBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbixcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZSc6IHNwYWNlX3VzZXJfb3JnX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUnOiBzcGFjZV91c2VyX29yZ19pbmZvLmZ1bGxuYW1lLFxuLy8gXHRcdFx0XHRcdCd0eXBlJzogYWN0aW9uX3R5cGUsXG4vLyBcdFx0XHRcdFx0J3N0YXJ0X2RhdGUnOiBuZXcgRGF0ZSgpLFxuLy8gXHRcdFx0XHRcdCdmaW5pc2hfZGF0ZSc6IG5ldyBEYXRlKCksXG4vLyBcdFx0XHRcdFx0J2lzX3JlYWQnOiBmYWxzZSxcbi8vIFx0XHRcdFx0XHQnanVkZ2UnOiAnc3VibWl0dGVkJyxcbi8vIFx0XHRcdFx0XHQnZnJvbV91c2VyJzogY3VycmVudF91c2VyX2lkLFxuLy8gXHRcdFx0XHRcdCdmcm9tX3VzZXJfbmFtZSc6IGZyb21fdXNlcl9uYW1lLFxuLy8gXHRcdFx0XHRcdCdmb3J3YXJkX3NwYWNlJzogc3BhY2VfaWQsXG4vLyBcdFx0XHRcdFx0J2ZvcndhcmRfaW5zdGFuY2UnOiBuZXdfaW5zX2lkLFxuLy8gXHRcdFx0XHRcdCdkZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9uLFxuLy8gXHRcdFx0XHRcdCdmcm9tX2FwcHJvdmVfaWQnOiBmcm9tX2FwcHJvdmVfaWRcbi8vIFx0XHRcdFx0fTtcblxuLy8gXHRcdFx0XHRmb3J3YXJkX2FwcHJvdmVzLnB1c2goYXBwcik7XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdG5ld19pbnNfaWRzLnB1c2gobmV3X2luc19pZCk7XG4vLyBcdFx0XHRwdXNoTWFuYWdlci5zZW5kX21lc3NhZ2VfdG9fc3BlY2lmeVVzZXIoXCJjdXJyZW50X3VzZXJcIiwgdXNlcl9pZCk7XG4vLyBcdFx0fSlcblxuLy8gXHRcdGlmICghXy5pc0VtcHR5KGZvcndhcmRfYXBwcm92ZXMpKSB7XG4vLyBcdFx0XHRzZXRfb2JqLm1vZGlmaWVkID0gbmV3IERhdGUoKTtcbi8vIFx0XHRcdHNldF9vYmoubW9kaWZpZWRfYnkgPSBjdXJyZW50X3VzZXJfaWQ7XG4vLyBcdFx0XHR2YXIgciA9IGRiLmluc3RhbmNlcy51cGRhdGUoe1xuLy8gXHRcdFx0XHRfaWQ6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcInRyYWNlcy5faWRcIjogY3VycmVudF90cmFjZV9pZFxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHQkc2V0OiBzZXRfb2JqLFxuLy8gXHRcdFx0XHQkYWRkVG9TZXQ6IHtcbi8vIFx0XHRcdFx0XHQndHJhY2VzLiQuYXBwcm92ZXMnOiB7XG4vLyBcdFx0XHRcdFx0XHQkZWFjaDogZm9yd2FyZF9hcHByb3Zlc1xuLy8gXHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSk7XG4vLyBcdFx0fVxuXG5cbi8vIFx0XHRpZiAocikge1xuLy8gXHRcdFx0Xy5lYWNoKGN1cnJlbnRfdHJhY2UuYXBwcm92ZXMsIGZ1bmN0aW9uIChhLCBpZHgpIHtcbi8vIFx0XHRcdFx0aWYgKGEuX2lkID09IGZyb21fYXBwcm92ZV9pZCkge1xuLy8gXHRcdFx0XHRcdHZhciB1cGRhdGVfcmVhZCA9IHt9O1xuLy8gXHRcdFx0XHRcdHVwZGF0ZV9yZWFkW1widHJhY2VzLiQuYXBwcm92ZXMuXCIgKyBpZHggKyBcIi5yZWFkX2RhdGVcIl0gPSBuZXcgRGF0ZSgpO1xuLy8gXHRcdFx0XHRcdGRiLmluc3RhbmNlcy51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0X2lkOiBpbnN0YW5jZV9pZCxcbi8vIFx0XHRcdFx0XHRcdFwidHJhY2VzLl9pZFwiOiBjdXJyZW50X3RyYWNlX2lkXG4vLyBcdFx0XHRcdFx0fSwge1xuLy8gXHRcdFx0XHRcdFx0JHNldDogdXBkYXRlX3JlYWRcbi8vIFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSlcblxuLy8gXHRcdH1cblxuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHsgbmV3X2luc19pZHM6IG5ld19pbnNfaWRzIH1cbi8vIFx0XHR9KVxuLy8gXHR9IGNhdGNoIChlKSB7XG4vLyBcdFx0Y29uc29sZS5lcnJvcihlLnN0YWNrKVxuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHtcbi8vIFx0XHRcdFx0ZXJyb3JzOiBbZV1cbi8vIFx0XHRcdH1cbi8vIFx0XHR9KVxuLy8gXHR9XG5cbi8vIH0pIiwiaWYgcHJvY2Vzcy5lbnYuQ1JFQVRPUl9OT0RFX0VOViA9PSAnZGV2ZWxvcG1lbnQnXG4gICAgSnNvblJvdXRlcy5hZGQgJ3Bvc3QnLCAnL3Rlc3Qvd2ViaG9vaycsIChyZXEsIHJlcywgbmV4dCkgLT5cbiAgICAgICAgdHJ5XG5cbiAgICAgICAgICAgIGhhc2hEYXRhID0gcmVxLmJvZHlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nICdhY3Rpb246ICcsIGhhc2hEYXRhLmFjdGlvblxuICAgICAgICAgICAgY29uc29sZS5sb2cgJ2Zyb21fdXNlcjogJywgaGFzaERhdGEuZnJvbV91c2VyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndG9fdXNlcnM6ICcsIGhhc2hEYXRhLnRvX3VzZXJzXG5cblxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogMjAwXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9XG4gICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgICAgICBjb2RlOiAyMDBcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVycm9yczogW3tlcnJvck1lc3NhZ2U6IGUubWVzc2FnZX1dIH0iLCJpZiAocHJvY2Vzcy5lbnYuQ1JFQVRPUl9OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICBKc29uUm91dGVzLmFkZCgncG9zdCcsICcvdGVzdC93ZWJob29rJywgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgICB2YXIgZSwgaGFzaERhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2hEYXRhID0gcmVxLmJvZHk7XG4gICAgICBjb25zb2xlLmxvZygnYWN0aW9uOiAnLCBoYXNoRGF0YS5hY3Rpb24pO1xuICAgICAgY29uc29sZS5sb2coJ2Zyb21fdXNlcjogJywgaGFzaERhdGEuZnJvbV91c2VyKTtcbiAgICAgIGNvbnNvbGUubG9nKCd0b191c2VyczogJywgaGFzaERhdGEudG9fdXNlcnMpO1xuICAgICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogMjAwLFxuICAgICAgICBkYXRhOiB7fVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGUgPSBlcnJvcjtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0c2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZTogKGluc19pZCwgc3RlcF9hcHByb3ZlLCBzdGVwc0FwcHJvdmVzT3B0aW9ucyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdHNldF9pbnN0YW5jZV9za2lwX3N0ZXBzOiAoaW5zX2lkLCBzdGVwSWQsIGFjdGlvbiktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2luc3RhbmNlX3NraXBfc3RlcHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE4OjU5XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXG5cdGdldF9pbnN0YW5jZV9kYXRhOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIGZvcm1DYWNoZWQsIGZsb3dDYWNoZWQpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9pbnN0YW5jZV9kYXRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fVxuXG59KTtcbiIsImNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cblx0ZHJhZnRfc2F2ZV9pbnN0YW5jZTogZnVuY3Rpb24gKGlucykge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZHJhZnRfc2F2ZV9pbnN0YW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0aW5ib3hfc2F2ZV9pbnN0YW5jZTogZnVuY3Rpb24gKGFwcHJvdmUpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluYm94X3NhdmVfaW5zdGFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG5cbn0pIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIzLTAxLTEzIDE3OjM1OjEzXG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjMtMDMtMTEgMTA6NTE6MjlcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbmNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cdGNjX2RvOiBmdW5jdGlvbiAoYXBwcm92ZSwgY2NfdXNlcl9pZHMsIGRlc2NyaXB0aW9uKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19kby5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2NfcmVhZDogZnVuY3Rpb24gKGFwcHJvdmUpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3JlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3N1Ym1pdDogZnVuY3Rpb24gKGluc19pZCwgZGVzY3JpcHRpb24sIG15QXBwcm92ZSwgY2NIYXNFZGl0UGVybWlzc2lvbikge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2Nfc3VibWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjY19yZW1vdmU6IGZ1bmN0aW9uIChpbnN0YW5jZUlkLCBhcHByb3ZlSWQpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0YmF0Y2hfY2FuY2VsX2NjOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIGFwcHJvdmVfaWRzKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5iYXRjaF9jYW5jZWxfY2MuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3NhdmU6IGZ1bmN0aW9uIChpbnNfaWQsIGRlc2NyaXB0aW9uLCBteUFwcHJvdmUsIGNjSGFzRWRpdFBlcm1pc3Npb24pIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3NhdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG59KSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE4OjM4XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXHQvLyDmlLnkuLrpgJrov4dhcGnosIPnlKhcblx0Zm9yd2FyZF9pbnN0YW5jZTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBzcGFjZV9pZCwgZmxvd19pZCwgaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50LCBkZXNjcmlwdGlvbiwgaXNGb3J3YXJkQXR0YWNobWVudHMsIHNlbGVjdGVkVXNlcnMsIGFjdGlvbl90eXBlLCByZWxhdGVkLCBmcm9tX2FwcHJvdmVfaWQpIHtcblx0XHRpZiAoIXRoaXMudXNlcklkKVxuXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignbm90LWF1dGhvcml6ZWQnKTtcblxuXHRcdHJldHVybjtcblx0fSxcblxuXG5cdGZvcndhcmRfcmVtb3ZlOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIHRyYWNlX2lkLCBhcHByb3ZlX2lkKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5mb3J3YXJkX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2FuY2VsRGlzdHJpYnV0ZTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBhcHByb3ZlX2lkcykge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2FuY2VsRGlzdHJpYnV0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cblxuXG59KSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE3OjU0XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuICAgIGNmc19pbnN0YW5jZXNfcmVtb3ZlOiBmdW5jdGlvbiAoZmlsZV9pZCkge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNmc19pbnN0YW5jZXNfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudDogZnVuY3Rpb24gKGZpbGVfaWQpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jZnNfaW5zdGFuY2VzX3NldF9jdXJyZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc19sb2NrOiBmdW5jdGlvbiAoZmlsZV9pZCwgdXNlcl9pZCwgdXNlcl9uYW1lKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc19sb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc191bmxvY2s6IGZ1bmN0aW9uIChmaWxlX2lkKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc191bmxvY2suYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZF9zcGFjZV9pbnN0YW5jZV9hdHRhY2htZW50c190b19kaXNrOiBmdW5jdGlvbiAoc3BhY2VJZCwgY2ZzUmVjb3JkSWRzKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuZG93bmxvYWRfc3BhY2VfaW5zdGFuY2VfYXR0YWNobWVudHNfdG9fZGlzay5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfVxufSkiLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0c2V0X2FwcHJvdmVfaGF2ZV9yZWFkOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2FwcHJvdmVfaGF2ZV9yZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHRjaGFuZ2VfYXBwcm92ZV9pbmZvOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBkZXNjcmlwdGlvbiwgZmluaXNoX2RhdGUpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jaGFuZ2VfYXBwcm92ZV9pbmZvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHR1cGRhdGVfYXBwcm92ZV9zaWduOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBzaWduX2ZpZWxkX2NvZGUsIGRlc2NyaXB0aW9uLCBzaWduX3R5cGUsIGxhc3RTaWduQXBwcm92ZSktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlX2FwcHJvdmVfc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblxuXHR1cGRhdGVfc2lnbl9zaG93OiAob2JqcywgbXlBcHByb3ZlX2lkKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlX3NpZ25fc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0aW5zdGFuY2VfcmV0dXJuOiAoYXBwcm92ZSwgcmVhc29uKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5pbnN0YW5jZV9yZXR1cm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRpbnN0YW5jZV9yZW1pbmQ6IChyZW1pbmRfdXNlcnMsIHJlbWluZF9jb3VudCwgcmVtaW5kX2RlYWRsaW5lLCBpbnN0YW5jZV9pZCwgYWN0aW9uX3R5cGVzLCB0cmFjZV9pZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaW5zdGFuY2VfcmVtaW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRuZXh0X3N0ZXBfdXNlcnNfbm90X2ZvdW5kOiAoZGVhbF90eXBlLCBzdGVwX25hbWUsIHBhcmFtcykgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLm5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbl9ldmFsID0gcmVxdWlyZSgnZXZhbCcpXG5cbk1ldGVvci5tZXRob2RzXG5cdGluc3RhbmNlTnVtYmVyQnVpbGRlcjogKHNwYWNlSWQsIG5hbWUpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluc3RhbmNlTnVtYmVyQnVpbGRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Y2hlY2tfbWFpbl9hdHRhY2g6IChpbnNfaWQsIG5hbWUpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNoZWNrX21haW5fYXR0YWNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRyZW1vdmVfcmVsYXRlZDogKGluc19pZCwgcmVfaW5zX2lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5yZW1vdmVfcmVsYXRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0dXBkYXRlX2luc3RhbmNlX3JlbGF0ZWQ6IChpbnNfaWQsIHJlbGF0ZWRfaW5zdGFuY2VzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVfaW5zdGFuY2VfcmVsYXRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0dXBkYXRlRmxvd1Bvc2l0aW9uOiAoZGF0YSkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZUZsb3dQb3NpdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0dXBkYXRlRmxvd1JvbGU6IChkYXRhKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlRmxvd1JvbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRzdGFydF9mbG93OiAoc3BhY2UsIGZsb3dJZCwgc3RhcnQpIC0+XG5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnN0YXJ0X2Zsb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Z2V0X2luc3RhbmNlX3RyYWNlczogKGluc19pZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2luc3RhbmNlX3RyYWNlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdCdnZXRfYmF0Y2hfaW5zdGFuY2VzJzogKHNwYWNlLCBjYXRlZ29yeUlkLCBmbG93SWRzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfYmF0Y2hfaW5zdGFuY2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHQnZ2V0X2JhdGNoX2luc3RhbmNlc19jb3VudCc6IChzcGFjZSwgY2F0ZWdvcnlJZCwgZmxvd0lkcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2JhdGNoX2luc3RhbmNlc19jb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0J2dldF9teV9hcHByb3Zlcyc6IChpbnN0YW5jZUlkcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X215X2FwcHJvdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXG5cblxuXG5cblxuXG5cblxuXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Y2hhbmdlX2Zsb3dfc3RhdGU6IChmbG93cykgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNoYW5nZV9mbG93X3N0YXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXG5cblxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cblx0aGlkZV9pbnN0YW5jZTogKGluc0lkLCBpc19oaWRkZW4pIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5oaWRlX2luc3RhbmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRnZXRJbnN0YW5jZVZhbHVlczogKGluc0lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRJbnN0YW5jZVZhbHVlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwiQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpXG5cbmdldEluc3RhbmNlUmVhZE9ubHkgPSAocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpIC0+XG5cblx0dXNlciA9IFN0ZWVkb3MuZ2V0QVBJTG9naW5Vc2VyKHJlcSwgcmVzKVxuXG5cdGlmIHJlcT8ucXVlcnk/LmFjY2Vzc190b2tlblxuXHRcdHVzZXJJZCA9IFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuKHJlcS5xdWVyeS5hY2Nlc3NfdG9rZW4pXG5cdFx0aWYgdXNlcklkXG5cdFx0XHR1c2VyID0gTWV0ZW9yLnVzZXJzLmZpbmRPbmUoe19pZDogdXNlcklkfSlcblxuXHRzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZVxuXG5cdGluc3RhbmNlSWQgPSByZXEucGFyYW1zLmluc3RhbmNlX2lkXG5cblx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZUlkfSk7XG5cblx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7X2lkOiBzcGFjZUlkfSk7XG5cblx0aGlkZV90cmFjZXMgPSByZXEucXVlcnk/LmhpZGVfdHJhY2VzXG5cblx0aWYgIW9wdGlvbnNcblx0XHRvcHRpb25zID0ge3Nob3dUcmFjZTogdHJ1ZX1cblx0ZWxzZVxuXHRcdG9wdGlvbnMuc2hvd1RyYWNlID0gdHJ1ZVxuXG5cdGlmIGhpZGVfdHJhY2VzIGlzIFwiMVwiXG5cdFx0aWYgb3B0aW9uc1xuXHRcdFx0b3B0aW9ucy5zaG93VHJhY2UgPSBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdG9wdGlvbnMgPSB7c2hvd1RyYWNlOiBmYWxzZX1cblxuXHRpZiAhb3B0aW9ucy5zaG93QXR0YWNobWVudHNcblx0XHRvcHRpb25zLnNob3dBdHRhY2htZW50cyA9IHRydWVcblxuXHRpZiAhc3BhY2Vcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZVwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aWYgICFpbnN0YW5jZVxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGluc3RhbmNlXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRpZiAhdXNlclxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWRcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGlmIGluc3RhbmNlLnNwYWNlICE9IHNwYWNlSWRcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZSBvciBpbnN0YW5jZVwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblxuXG5cdHNwYWNlVXNlckNvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7IHVzZXI6IHVzZXIuX2lkLCBzcGFjZTogc3BhY2VJZCB9KS5jb3VudCgpXG5cblx0aWYgc3BhY2VVc2VyQ291bnQgaXMgMFxuXHRcdGlmICFzcGFjZVxuXHRcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc2FwY2VVc2VyXCIsXG5cdFx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0XHRyZXR1cm47XG5cblx0I+agoemqjHVzZXLmmK/lkKblr7lpbnN0YW5jZeacieafpeeci+adg+mZkFxuXHRfaGFzUGVybWlzc2lvbiA9IFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIGluc3RhbmNlKVxuXG5cdGlmICFfaGFzUGVybWlzc2lvbiAgJiYgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlXG5cdFx0X3BhcmVudF9pbnN0YW5jZXMgPSBfLnVuaW9uKFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VdLCBpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIHx8IFtdKVxuXG5cdFx0X2hhc1Blcm1pc3Npb24gPSBfLmZpbmQgX3BhcmVudF9pbnN0YW5jZXMsIChfcGFyZW50X2lkKS0+XG5cdFx0XHRfcGFyZW50X2lucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6X3BhcmVudF9pZH0sIHtmaWVsZHM6IHt0cmFjZXM6IDB9fSlcblxuXHRcdFx0cmV0dXJuIFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIF9wYXJlbnRfaW5zKVxuXG5cdGlmICFfaGFzUGVybWlzc2lvblxuXHRcdF9sb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSh1c2VyLl9pZCwgdHJ1ZSlcblx0XHRlcnJvciA9IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9wZXJtaXNzaW9uc19lcnJvclwiLCB7fSwgX2xvY2FsZSlcblx0XHRyZXMuY2hhcnNldCA9IFwidXRmLThcIlxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IGVycm9yLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXHRkYXRhQnVmID0gbmV3IEJ1ZmZlcihodG1sKTtcblx0cmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKVxuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LXJhbmdlJywgXCJieXRlcyAwLSN7ZGF0YUJ1Zi5sZW5ndGggLSAxfS8je2RhdGFCdWYubGVuZ3RofVwiKVxuXHRyZXMuc3RhdHVzQ29kZSA9IDIwMFxuXHRyZXMuZW5kKGh0bWwpXG5cbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZFwiLCBnZXRJbnN0YW5jZVJlYWRPbmx5XG5cbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZC86aW5zdGFuY2VfbmFtZVwiLCAocmVxLCByZXMsIG5leHQpLT5cblx0cmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcpO1xuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQ7ZmlsZW5hbWU9JytlbmNvZGVVUkkocmVxLnBhcmFtcy5pbnN0YW5jZV9uYW1lKSk7XG5cdHJlcy5zZXRIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJycpXG5cblx0b3B0aW9ucyA9IHthYnNvbHV0ZTogdHJ1ZX1cblxuXHRyZXR1cm4gZ2V0SW5zdGFuY2VSZWFkT25seShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucylcbiMjI1xuXHTojrflj5bnlLPor7fljZXliJfooajvvJpcbiAgICBmaW5hbF9kZWNpc2lvbu+8muWuoeaJuee7k+aenFxuICAgIHN0YXRlOiDnlLPor7fljZXnirbmgIFcbiMjI1xuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L2luc3RhbmNlc1wiLCAocmVxLCByZXMsIG5leHQpIC0+XG5cblx0aWYgIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcylcblx0XHRyZXR1cm4gO1xuXG5cdHVzZXJfaWQgPSByZXEudXNlcklkXG5cblx0c3BhY2VJZCA9IHJlcS5oZWFkZXJzW1wieC1zcGFjZS1pZFwiXVxuXG5cdGlmIG5vdCBzcGFjZUlkXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1TcGFjZS1JZFwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0Zmxvd0lkID0gcmVxLnF1ZXJ5Py5mbG93SWRcblxuXHRpZiAhZmxvd0lkXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMCxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgZmxvd0lkXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRxdWVyeSA9IHt9XG5cblx0cmV0X3N5bmNfdG9rZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuXG5cdGZsb3dJZHMgPSBmbG93SWQuc3BsaXQoXCIsXCIpXG5cblxuXHRmbG93cyA9IGRiLmZsb3dzLmZpbmQoe19pZDogeyRpbjogZmxvd0lkc319KS5mZXRjaCgpXG5cblx0aSA9IDBcblx0d2hpbGUgaSA8IGZsb3dzLmxlbmd0aFxuXHRcdGYgPSBmbG93c1tpXVxuXHRcdHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3NwYWNlOiBmLnNwYWNlLCB1c2VyOiB1c2VyX2lkfSlcblx0XHRpZiAhc3BhY2VVc2VyXG5cdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdGRhdGE6XG5cdFx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyAje2YuX2lkfVwiLFxuXHRcdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdFx0cmV0dXJuO1xuXHRcdGVsc2VcblxuXHQjXHTmmK/lkKblt6XkvZzljLrnrqHnkIblkZhcblx0XHRpZiAhU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcl9pZClcblx0XHRcdHNwYWNlVXNlck9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuXHRcdFx0XHRfaWQ6IHtcblx0XHRcdFx0XHQkaW46IHNwYWNlVXNlci5vcmdhbml6YXRpb25zXG5cdFx0XHRcdH1cblx0XHRcdH0pLmZldGNoKCk7XG5cblx0XHRcdGlmICFXb3JrZmxvd01hbmFnZXIuY2FuTW9uaXRvcihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpICYmICFXb3JrZmxvd01hbmFnZXIuY2FuQWRtaW4oZiwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zKVxuXHRcdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyAje2YuX2lkfVwiLFxuXHRcdFx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0XHRcdHJldHVybjtcblx0XHRpKytcblxuXG5cdHF1ZXJ5LmZsb3cgPSB7JGluOiBmbG93SWRzfVxuXG5cdHF1ZXJ5LnNwYWNlID0gc3BhY2VJZFxuXG5cdGlmIHJlcS5xdWVyeT8uc3luY190b2tlblxuXHRcdHN5bmNfdG9rZW4gPSBuZXcgRGF0ZShOdW1iZXIocmVxLnF1ZXJ5LnN5bmNfdG9rZW4pKVxuXHRcdHF1ZXJ5Lm1vZGlmaWVkID0geyRndDogc3luY190b2tlbn1cblxuXHRpZiByZXEucXVlcnk/LmZpbmFsX2RlY2lzaW9uXG5cdFx0cXVlcnkuZmluYWxfZGVjaXNpb24gPSB7JGluIDogcmVxLnF1ZXJ5LmZpbmFsX2RlY2lzaW9uLnNwbGl0KFwiLFwiKX1cblx0ZWxzZVxuXHRcdHF1ZXJ5LmZpbmFsX2RlY2lzaW9uID0geyRuaW46IFtcInRlcm1pbmF0ZWRcIiwgXCJyZWplY3RlZFwiXX1cblxuXHRpZiByZXEucXVlcnk/LnN0YXRlXG5cdFx0cXVlcnkuc3RhdGUgPSB7JGluOiByZXEucXVlcnkuc3RhdGUuc3BsaXQoXCIsXCIpfVxuXHRlbHNlXG5cdFx0cXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiXG5cbiNcdOacgOWkmui/lOWbnjUwMOadoeaVsOaNrlxuXHRpbnN0YW5jZXMgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge2ZpZWxkczoge2luYm94X3VlcnM6IDAsIGNjX3VzZXJzOiAwLCBvdXRib3hfdXNlcnM6IDAsIHRyYWNlczogMCwgYXR0YWNobWVudHM6IDB9LCBza2lwOiAwLCBsaW1pdDogNTAwfSkuZmV0Y2goKVxuXHRpbnN0YW5jZXMuZm9yRWFjaCAoaW5zdGFuY2UpLT5cblxuXHRcdGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHsnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnN0YW5jZS5faWQsJ21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLCBcIm1ldGFkYXRhLmlzX3ByaXZhdGVcIjogeyRuZTogdHJ1ZX19LCB7ZmllbGRzOiB7Y29waWVzOiAwfX0pLmZldGNoKClcblxuXHRcdGluc3RhbmNlLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHNcblxuXG5cdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiAyMDAsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcInN0YXR1c1wiOiBcInN1Y2Nlc3NcIixcblx0XHRcdFx0XCJzeW5jX3Rva2VuXCI6IHJldF9zeW5jX3Rva2VuXG5cdFx0XHRcdFwiZGF0YVwiOiBpbnN0YW5jZXNcblx0cmV0dXJuO1xuIiwidmFyIENvb2tpZXMsIGdldEluc3RhbmNlUmVhZE9ubHk7XG5cbkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKTtcblxuZ2V0SW5zdGFuY2VSZWFkT25seSA9IGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0LCBvcHRpb25zKSB7XG4gIHZhciBfaGFzUGVybWlzc2lvbiwgX2xvY2FsZSwgX3BhcmVudF9pbnN0YW5jZXMsIGRhdGFCdWYsIGVycm9yLCBoaWRlX3RyYWNlcywgaHRtbCwgaW5zdGFuY2UsIGluc3RhbmNlSWQsIHJlZiwgcmVmMSwgc3BhY2UsIHNwYWNlSWQsIHNwYWNlVXNlckNvdW50LCB1c2VyLCB1c2VySWQ7XG4gIHVzZXIgPSBTdGVlZG9zLmdldEFQSUxvZ2luVXNlcihyZXEsIHJlcyk7XG4gIGlmIChyZXEgIT0gbnVsbCA/IChyZWYgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYuYWNjZXNzX3Rva2VuIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgdXNlcklkID0gU3RlZWRvcy5nZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4ocmVxLnF1ZXJ5LmFjY2Vzc190b2tlbik7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZTtcbiAgaW5zdGFuY2VJZCA9IHJlcS5wYXJhbXMuaW5zdGFuY2VfaWQ7XG4gIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KTtcbiAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7XG4gICAgX2lkOiBzcGFjZUlkXG4gIH0pO1xuICBoaWRlX3RyYWNlcyA9IChyZWYxID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMS5oaWRlX3RyYWNlcyA6IHZvaWQgMDtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHNob3dUcmFjZTogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucy5zaG93VHJhY2UgPSB0cnVlO1xuICB9XG4gIGlmIChoaWRlX3RyYWNlcyA9PT0gXCIxXCIpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgb3B0aW9ucy5zaG93VHJhY2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgc2hvd1RyYWNlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvcHRpb25zLnNob3dBdHRhY2htZW50cykge1xuICAgIG9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgfVxuICBpZiAoIXNwYWNlKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGluc3RhbmNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXVzZXIpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZFwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGluc3RhbmNlLnNwYWNlICE9PSBzcGFjZUlkKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlIG9yIGluc3RhbmNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBzcGFjZVVzZXJDb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgIHVzZXI6IHVzZXIuX2lkLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0pLmNvdW50KCk7XG4gIGlmIChzcGFjZVVzZXJDb3VudCA9PT0gMCkge1xuICAgIGlmICghc3BhY2UpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAxLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzYXBjZVVzZXJcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIF9oYXNQZXJtaXNzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmhhc0luc3RhbmNlUGVybWlzc2lvbnModXNlciwgaW5zdGFuY2UpO1xuICBpZiAoIV9oYXNQZXJtaXNzaW9uICYmIGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuICAgIF9wYXJlbnRfaW5zdGFuY2VzID0gXy51bmlvbihbaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlXSwgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcyB8fCBbXSk7XG4gICAgX2hhc1Blcm1pc3Npb24gPSBfLmZpbmQoX3BhcmVudF9pbnN0YW5jZXMsIGZ1bmN0aW9uKF9wYXJlbnRfaWQpIHtcbiAgICAgIHZhciBfcGFyZW50X2lucztcbiAgICAgIF9wYXJlbnRfaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IF9wYXJlbnRfaWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgdHJhY2VzOiAwXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIF9wYXJlbnRfaW5zKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoIV9oYXNQZXJtaXNzaW9uKSB7XG4gICAgX2xvY2FsZSA9IFN0ZWVkb3MubG9jYWxlKHVzZXIuX2lkLCB0cnVlKTtcbiAgICBlcnJvciA9IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9wZXJtaXNzaW9uc19lcnJvclwiLCB7fSwgX2xvY2FsZSk7XG4gICAgcmVzLmNoYXJzZXQgPSBcInV0Zi04XCI7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IGVycm9yLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbCk7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtXCIgKyAoZGF0YUJ1Zi5sZW5ndGggLSAxKSArIFwiL1wiICsgZGF0YUJ1Zi5sZW5ndGgpO1xuICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgcmV0dXJuIHJlcy5lbmQoaHRtbCk7XG59O1xuXG5Kc29uUm91dGVzLmFkZChcImdldFwiLCBcIi93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9yZWFkb25seS86aW5zdGFuY2VfaWRcIiwgZ2V0SW5zdGFuY2VSZWFkT25seSk7XG5cbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZC86aW5zdGFuY2VfbmFtZVwiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgb3B0aW9ucztcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcpO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQ7ZmlsZW5hbWU9JyArIGVuY29kZVVSSShyZXEucGFyYW1zLmluc3RhbmNlX25hbWUpKTtcbiAgcmVzLnNldEhlYWRlcignVHJhbnNmZXItRW5jb2RpbmcnLCAnJyk7XG4gIG9wdGlvbnMgPSB7XG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfTtcbiAgcmV0dXJuIGdldEluc3RhbmNlUmVhZE9ubHkocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpO1xufSk7XG5cblxuLypcblx06I635Y+W55Sz6K+35Y2V5YiX6KGo77yaXG4gICAgZmluYWxfZGVjaXNpb27vvJrlrqHmibnnu5PmnpxcbiAgICBzdGF0ZTog55Sz6K+35Y2V54q25oCBXG4gKi9cblxuSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L2luc3RhbmNlc1wiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZiwgZmxvd0lkLCBmbG93SWRzLCBmbG93cywgaSwgaW5zdGFuY2VzLCBxdWVyeSwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZXRfc3luY190b2tlbiwgc3BhY2VJZCwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zLCBzeW5jX3Rva2VuLCB1c2VyX2lkO1xuICBpZiAoIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdXNlcl9pZCA9IHJlcS51c2VySWQ7XG4gIHNwYWNlSWQgPSByZXEuaGVhZGVyc1tcIngtc3BhY2UtaWRcIl07XG4gIGlmICghc3BhY2VJZCkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLVNwYWNlLUlkXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBmbG93SWQgPSAocmVmID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmLmZsb3dJZCA6IHZvaWQgMDtcbiAgaWYgKCFmbG93SWQpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgZmxvd0lkXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBxdWVyeSA9IHt9O1xuICByZXRfc3luY190b2tlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBmbG93SWRzID0gZmxvd0lkLnNwbGl0KFwiLFwiKTtcbiAgZmxvd3MgPSBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogZmxvd0lkc1xuICAgIH1cbiAgfSkuZmV0Y2goKTtcbiAgaSA9IDA7XG4gIHdoaWxlIChpIDwgZmxvd3MubGVuZ3RoKSB7XG4gICAgZiA9IGZsb3dzW2ldO1xuICAgIHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IGYuc3BhY2UsXG4gICAgICB1c2VyOiB1c2VyX2lkXG4gICAgfSk7XG4gICAgaWYgKCFzcGFjZVVzZXIpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAxLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyBcIiArIGYuX2lkLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuXG4gICAgfVxuICAgIGlmICghU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcl9pZCkpIHtcbiAgICAgIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IHNwYWNlVXNlci5vcmdhbml6YXRpb25zXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgICBpZiAoIVdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGYsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucykgJiYgIVdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpKSB7XG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyBcIiArIGYuX2lkLFxuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpKys7XG4gIH1cbiAgcXVlcnkuZmxvdyA9IHtcbiAgICAkaW46IGZsb3dJZHNcbiAgfTtcbiAgcXVlcnkuc3BhY2UgPSBzcGFjZUlkO1xuICBpZiAoKHJlZjEgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYxLnN5bmNfdG9rZW4gOiB2b2lkIDApIHtcbiAgICBzeW5jX3Rva2VuID0gbmV3IERhdGUoTnVtYmVyKHJlcS5xdWVyeS5zeW5jX3Rva2VuKSk7XG4gICAgcXVlcnkubW9kaWZpZWQgPSB7XG4gICAgICAkZ3Q6IHN5bmNfdG9rZW5cbiAgICB9O1xuICB9XG4gIGlmICgocmVmMiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjIuZmluYWxfZGVjaXNpb24gOiB2b2lkIDApIHtcbiAgICBxdWVyeS5maW5hbF9kZWNpc2lvbiA9IHtcbiAgICAgICRpbjogcmVxLnF1ZXJ5LmZpbmFsX2RlY2lzaW9uLnNwbGl0KFwiLFwiKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkuZmluYWxfZGVjaXNpb24gPSB7XG4gICAgICAkbmluOiBbXCJ0ZXJtaW5hdGVkXCIsIFwicmVqZWN0ZWRcIl1cbiAgICB9O1xuICB9XG4gIGlmICgocmVmMyA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjMuc3RhdGUgOiB2b2lkIDApIHtcbiAgICBxdWVyeS5zdGF0ZSA9IHtcbiAgICAgICRpbjogcmVxLnF1ZXJ5LnN0YXRlLnNwbGl0KFwiLFwiKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiO1xuICB9XG4gIGluc3RhbmNlcyA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBpbmJveF91ZXJzOiAwLFxuICAgICAgY2NfdXNlcnM6IDAsXG4gICAgICBvdXRib3hfdXNlcnM6IDAsXG4gICAgICB0cmFjZXM6IDAsXG4gICAgICBhdHRhY2htZW50czogMFxuICAgIH0sXG4gICAgc2tpcDogMCxcbiAgICBsaW1pdDogNTAwXG4gIH0pLmZldGNoKCk7XG4gIGluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzO1xuICAgIGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICdtZXRhZGF0YS5pbnN0YW5jZSc6IGluc3RhbmNlLl9pZCxcbiAgICAgICdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcbiAgICAgIFwibWV0YWRhdGEuaXNfcHJpdmF0ZVwiOiB7XG4gICAgICAgICRuZTogdHJ1ZVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBjb3BpZXM6IDBcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIHJldHVybiBpbnN0YW5jZS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzO1xuICB9KTtcbiAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgIGNvZGU6IDIwMCxcbiAgICBkYXRhOiB7XG4gICAgICBcInN0YXR1c1wiOiBcInN1Y2Nlc3NcIixcbiAgICAgIFwic3luY190b2tlblwiOiByZXRfc3luY190b2tlbixcbiAgICAgIFwiZGF0YVwiOiBpbnN0YW5jZXNcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJcbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3N0ZWVkb3MtY3NzXCIsIChyZXEsIHJlcywgbmV4dCktPlxuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9jc3MnKTtcblx0YWxsQ3NzID0gV2ViQXBwLmdldFJlZnJlc2hhYmxlQXNzZXRzKClcblxuXHRhbGxDc3NMaW5rID0gXCJcIlxuXG5cdGFsbENzcy5mb3JFYWNoIChjc3MpIC0+XG5cdFx0aWYgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWFxuXHRcdFx0cm9vdFVybCA9IF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxcblx0XHRcdGlmIHJvb3RVcmwuZW5kc1dpdGgoXCIvXCIpXG5cdFx0XHRcdGNzc0hyZWYgPSByb290VXJsLnJlcGxhY2UoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIFwiL1wiLCBcIlwiKSArIGNzcy51cmxcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYLCBcIlwiKSArIGNzcy51cmxcblx0XHRlbHNlXG5cdFx0XHRjc3NIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKGNzcy51cmwpXG5cdFx0YWxsQ3NzTGluayArPSBcIkBpbXBvcnQgdXJsKCN7Y3NzSHJlZn0pO1wiXG5cblx0cmVzLnN0YXR1c0NvZGUgPSAyMDBcblx0cmVzLmVuZChhbGxDc3NMaW5rKSIsIkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL3N0ZWVkb3MtY3NzXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBhbGxDc3MsIGFsbENzc0xpbms7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2NzcycpO1xuICBhbGxDc3MgPSBXZWJBcHAuZ2V0UmVmcmVzaGFibGVBc3NldHMoKTtcbiAgYWxsQ3NzTGluayA9IFwiXCI7XG4gIGFsbENzcy5mb3JFYWNoKGZ1bmN0aW9uKGNzcykge1xuICAgIHZhciBjc3NIcmVmLCByb290VXJsO1xuICAgIGlmIChfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYKSB7XG4gICAgICByb290VXJsID0gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTDtcbiAgICAgIGlmIChyb290VXJsLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBjc3NIcmVmID0gcm9vdFVybC5yZXBsYWNlKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVggKyBcIi9cIiwgXCJcIikgKyBjc3MudXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYLCBcIlwiKSArIGNzcy51cmw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoY3NzLnVybCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxDc3NMaW5rICs9IFwiQGltcG9ydCB1cmwoXCIgKyBjc3NIcmVmICsgXCIpO1wiO1xuICB9KTtcbiAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gIHJldHVybiByZXMuZW5kKGFsbENzc0xpbmspO1xufSk7XG4iLCJKc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvZHJhZnQvOmZsb3dcIiwgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXHRpZiAhU3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrKHJlcSwgcmVzKVxuXHRcdHJldHVyblxuXG5cdHVzZXJfaWQgPSByZXEudXNlcklkXG5cblx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoeyBfaWQ6IHVzZXJfaWQgfSlcblxuXHRzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZVxuXG5cdGZsb3dJZCA9IHJlcS5wYXJhbXMuZmxvd1xuXG5cdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoeyBfaWQ6IHNwYWNlSWQgfSlcblxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7IF9pZDogZmxvd0lkIH0sIHsgZmllbGRzOiB7IG5hbWU6IDEsICdjdXJyZW50Ll9pZCc6IDEsIGZvcm06IDEgfSB9KVxuXG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHsgX2lkOiBmbG93LmZvcm0gfSwgeyBmaWVsZHM6IHsgJ2N1cnJlbnQuX2lkJzogMSB9IH0pXG5cblx0b3B0aW9ucyA9IHtcblx0XHRzaG93VHJhY2U6IGZhbHNlLFxuXHRcdHNob3dBdHRhY2htZW50czogZmFsc2UsXG5cdFx0dGVtcGxhdGVOYW1lOiBcImRlZmF1bHRcIixcblx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0aW5zdGFuY2Vfc3R5bGU6IFwiaW5zdGFuY2UtZGVmYXVsdFwiLFxuXHRcdHBsdWdpbnM6IFwiXCJcIlxuXG5cdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cIklFPWVkZ2UsY2hyb21lPTFcIiAvPlxuXHRcdFx0PG1ldGEgbmFtZT1cImZvcm1hdC1kZXRlY3Rpb25cIiBjb250ZW50PVwidGVsZXBob25lPW5vXCI+XG5cdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwieC1yaW0tYXV0by1tYXRjaFwiIGNvbnRlbnQ9XCJub25lXCI+XG5cdFx0XHQ8dGl0bGU+I3tmbG93Lm5hbWV9PC90aXRsZT5cblx0XHRcdDxtZXRhIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPTAnIG5hbWU9J3ZpZXdwb3J0JyAvPlxuXHRcdFx0PG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aFwiIC8+XG5cblx0XHRcdDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2Nzcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmNzc1wiPlxuXG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9sb2NhbGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci56aC1DTi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBjaGFyc2V0PVwiVVRGLThcIj48L3NjcmlwdD5cblxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIvcGx1Z2lucy90b2FzdHIvdG9hc3RyLm1pbi5jc3NcIj5cblx0XHRcdDxzY3JpcHQgc3JjPVwiL3BsdWdpbnMvdG9hc3RyL3RvYXN0ci5taW4uanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIi9qcy93b3JrZmxvd19jbGllbnQuY3NzXCI+XG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9qcy93b3JrZmxvd19jbGllbnQuanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XCJcIlwiXG5cdH1cblxuXHRpbnN0YW5jZSA9IHtcblx0XHRmbG93OiBmbG93Ll9pZCxcblx0XHRmbG93X3ZlcnNpb246IGZsb3cuY3VycmVudC5faWQsXG5cdFx0Zm9ybTogZm9ybS5faWQsXG5cdFx0Zm9ybV92ZXJzaW9uOiBmb3JtLmN1cnJlbnQuX2lkLFxuXHRcdHZhbHVlczoge30sXG5cdFx0bmFtZTogZmxvdy5uYW1lLFxuXHRcdHNwYWNlOiBzcGFjZUlkXG5cdH1cblxuXHRodG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cblx0ZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbClcblxuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKVxuXG5cdHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtI3tkYXRhQnVmLmxlbmd0aCAtIDF9LyN7ZGF0YUJ1Zi5sZW5ndGh9XCIpXG5cblx0cmVzLnN0YXR1c0NvZGUgPSAyMDBcblxuXHRyZXMuZW5kKGh0bWwpXG4iLCJKc29uUm91dGVzLmFkZChcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvZHJhZnQvOmZsb3dcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGRhdGFCdWYsIGZsb3csIGZsb3dJZCwgZm9ybSwgaHRtbCwgaW5zdGFuY2UsIG9wdGlvbnMsIHNwYWNlLCBzcGFjZUlkLCB1c2VyLCB1c2VyX2lkO1xuICBpZiAoIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdXNlcl9pZCA9IHJlcS51c2VySWQ7XG4gIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICBfaWQ6IHVzZXJfaWRcbiAgfSk7XG4gIHNwYWNlSWQgPSByZXEucGFyYW1zLnNwYWNlO1xuICBmbG93SWQgPSByZXEucGFyYW1zLmZsb3c7XG4gIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoe1xuICAgIF9pZDogc3BhY2VJZFxuICB9KTtcbiAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgIF9pZDogZmxvd0lkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICAnY3VycmVudC5faWQnOiAxLFxuICAgICAgZm9ybTogMVxuICAgIH1cbiAgfSk7XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICBfaWQ6IGZsb3cuZm9ybVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICAnY3VycmVudC5faWQnOiAxXG4gICAgfVxuICB9KTtcbiAgb3B0aW9ucyA9IHtcbiAgICBzaG93VHJhY2U6IGZhbHNlLFxuICAgIHNob3dBdHRhY2htZW50czogZmFsc2UsXG4gICAgdGVtcGxhdGVOYW1lOiBcImRlZmF1bHRcIixcbiAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgaW5zdGFuY2Vfc3R5bGU6IFwiaW5zdGFuY2UtZGVmYXVsdFwiLFxuICAgIHBsdWdpbnM6IFwiXFxuPG1ldGEgaHR0cC1lcXVpdj1cXFwiWC1VQS1Db21wYXRpYmxlXFxcIiBjb250ZW50PVxcXCJJRT1lZGdlLGNocm9tZT0xXFxcIiAvPlxcbjxtZXRhIG5hbWU9XFxcImZvcm1hdC1kZXRlY3Rpb25cXFwiIGNvbnRlbnQ9XFxcInRlbGVwaG9uZT1ub1xcXCI+XFxuPG1ldGEgaHR0cC1lcXVpdj1cXFwieC1yaW0tYXV0by1tYXRjaFxcXCIgY29udGVudD1cXFwibm9uZVxcXCI+XFxuPHRpdGxlPlwiICsgZmxvdy5uYW1lICsgXCI8L3RpdGxlPlxcbjxtZXRhIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPTAnIG5hbWU9J3ZpZXdwb3J0JyAvPlxcbjxtZXRhIG5hbWU9XFxcInZpZXdwb3J0XFxcIiBjb250ZW50PVxcXCJ3aWR0aD1kZXZpY2Utd2lkdGhcXFwiIC8+XFxuXFxuPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgaHJlZj1cXFwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2Nzcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmNzc1xcXCI+XFxuXFxuPHNjcmlwdCBzcmM9XFxcIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgc3JjPVxcXCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvanMvbG9jYWxlcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIuemgtQ04uanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCIgY2hhcnNldD1cXFwiVVRGLThcXFwiPjwvc2NyaXB0PlxcblxcbjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmNzc1xcXCI+XFxuPHNjcmlwdCBzcmM9XFxcIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0PlxcbjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIi9qcy93b3JrZmxvd19jbGllbnQuY3NzXFxcIj5cXG48c2NyaXB0IHNyYz1cXFwiL2pzL3dvcmtmbG93X2NsaWVudC5qc1xcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cIlxuICB9O1xuICBpbnN0YW5jZSA9IHtcbiAgICBmbG93OiBmbG93Ll9pZCxcbiAgICBmbG93X3ZlcnNpb246IGZsb3cuY3VycmVudC5faWQsXG4gICAgZm9ybTogZm9ybS5faWQsXG4gICAgZm9ybV92ZXJzaW9uOiBmb3JtLmN1cnJlbnQuX2lkLFxuICAgIHZhbHVlczoge30sXG4gICAgbmFtZTogZmxvdy5uYW1lLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH07XG4gIGh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIGRhdGFCdWYgPSBuZXcgQnVmZmVyKGh0bWwpO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1yYW5nZScsIFwiYnl0ZXMgMC1cIiArIChkYXRhQnVmLmxlbmd0aCAtIDEpICsgXCIvXCIgKyBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICByZXR1cm4gcmVzLmVuZChodG1sKTtcbn0pO1xuIiwiQXJyYXkucHJvdG90eXBlLmZpbHRlclByb3BlcnR5ID0gZnVuY3Rpb24oaCwgbCl7XG4gICAgdmFyIGcgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odCl7XG4gICAgICAgIHZhciBtID0gdD8gdFtoXTpudWxsO1xuICAgICAgICB2YXIgZCA9IGZhbHNlO1xuICAgICAgICBpZihtIGluc3RhbmNlb2YgQXJyYXkpe1xuICAgICAgICAgICAgZCA9IG0uaW5jbHVkZXMobCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZCA9IChsID09PSB1bmRlZmluZWQpPyBmYWxzZTptPT1sO1xuICAgICAgICB9XG4gICAgICAgIGlmKGQpe1xuICAgICAgICAgICAgZy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGc7XG59O1xuXG5BcnJheS5wcm90b3R5cGUuZ2V0UHJvcGVydHkgPSBmdW5jdGlvbihrKXtcbiAgICB2YXIgdiA9IG5ldyBBcnJheSgpO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0KXtcbiAgICAgICAgdmFyIG0gPSB0PyB0W2tdOm51bGw7XG4gICAgICAgIHYucHVzaChtKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdjtcbn1cblxuQXJyYXkucHJvdG90eXBlLmdldEVhY2ggPSBmdW5jdGlvbihjb2RlKXtcbiAgICB2YXIgcmV2ID0gW107XG4gICAgZm9yKHZhciBpID0gMCA7IGkgPCB0aGlzLmxlbmd0aCA7IGkrKyl7XG4gICAgICAgIHJldi5wdXNoKHRoaXNbaV1bY29kZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV2O1xufTtcblxuQXJyYXkucHJvdG90eXBlLnVuaXEgPSBmdW5jdGlvbigpe1xuICAgIHZhciBhID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGIpeyBcbiAgICAgICAgaWYoYS5pbmRleE9mKGIpIDwgMClcbiAgICAgICAgICAgIHthW2EubGVuZ3RoXSA9IGJ9XG4gICAgfSk7XG4gICAgcmV0dXJuIGE7XG59O1xuXG5Gb3JtX2Zvcm11bGEgPSB7fTtcblxuXG5Gb3JtX2Zvcm11bGEubWl4aW4gPSBmdW5jdGlvbihkZXN0LCBzcmMpe1xuICAgIGZvcih2YXIga2V5IGluIHNyYyl7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn07XG5cblxuRm9ybV9mb3JtdWxhLmhhbmRlclVzZXJPYmplY3QgPSBmdW5jdGlvbih1KXtcblxuICAgIGlmKHUgaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgIHZhciB1c2VyID0ge307XG5cbiAgICAgICAgdXNlci5uYW1lID0gdS5nZXRQcm9wZXJ0eShcIm5hbWVcIilcbiAgICAgICAgdXNlci5vcmdhbml6YXRpb24gPSB7fTtcbiAgICAgICAgdXNlci5vcmdhbml6YXRpb24ubmFtZSA9IHUuZ2V0UHJvcGVydHkoXCJvcmdhbml6YXRpb25cIikuZ2V0UHJvcGVydHkoXCJuYW1lXCIpO1xuICAgICAgICB1c2VyLm9yZ2FuaXphdGlvbi5mdWxsbmFtZSA9IHUuZ2V0UHJvcGVydHkoXCJvcmdhbml6YXRpb25cIikuZ2V0UHJvcGVydHkoXCJmdWxsbmFtZVwiKTtcblxuICAgICAgICB1c2VyLmhyID0gdS5nZXRQcm9wZXJ0eShcImhyXCIpXG5cbiAgICAgICAgdXNlci5zb3J0X25vID0gdS5nZXRQcm9wZXJ0eShcInNvcnRfbm9cIilcblxuXHRcdHVzZXIubW9iaWxlID0gdS5nZXRQcm9wZXJ0eShcIm1vYmlsZVwiKVxuXG5cdFx0dXNlci53b3JrX3Bob25lID0gdS5nZXRQcm9wZXJ0eShcIndvcmtfcGhvbmVcIilcblxuXHRcdHVzZXIucG9zaXRpb24gPSB1LmdldFByb3BlcnR5KFwicG9zaXRpb25cIilcblxuICAgICAgICB2YXIgdXNlclJvbGVzID0gdS5nZXRQcm9wZXJ0eShcInJvbGVzXCIpO1xuICAgICAgICB2YXIgcm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdXNlclJvbGVzLmZvckVhY2goZnVuY3Rpb24oaSl7XG4gICAgICAgICAgICByb2xlcyA9IHJvbGVzLmNvbmNhdChpKTtcbiAgICAgICAgfSk7IFxuICAgICAgICByb2xlcy51bmlxKCk7XG4gICAgICAgIHVzZXIucm9sZXMgPSByb2xlcztcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfWVsc2V7XG4gICAgICAgIHJldHVybiB1O1xuICAgIH1cbn1cblxuRm9ybV9mb3JtdWxhLmhhbmRlck9yZ09iamVjdCA9IGZ1bmN0aW9uKG8pe1xuXG4gICAgaWYobyBpbnN0YW5jZW9mIEFycmF5KXtcbiAgICAgICAgdmFyIG9yZyA9IHt9O1xuXHRcdG9yZy5pZCA9IG8uZ2V0UHJvcGVydHkoXCJfaWRcIik7XG4gICAgICAgIG9yZy5uYW1lID0gby5nZXRQcm9wZXJ0eShcIm5hbWVcIik7XG4gICAgICAgIG9yZy5mdWxsbmFtZSA9IG8uZ2V0UHJvcGVydHkoXCJmdWxsbmFtZVwiKTtcblxuICAgICAgICByZXR1cm4gb3JnO1xuICAgIH1lbHNle1xuICAgICAgICByZXR1cm4gbztcbiAgICB9XG59XG5cblxuXG4vKipcbiAgICAqIOiOt+W+l+WFrOW8j+mcgOimgeeUqOWIsOeahOWIneWni+WAvFxuICAgICog6L6T5YWl77yaZmllbGRzLCB2YWx1ZXMsIGFwcGxpY2FudFxuICAgICog6L6T5Ye677yaX192YWx1ZXNcbioqL1xuRm9ybV9mb3JtdWxhLmluaXRfZm9ybXVsYV92YWx1ZXMgPSBmdW5jdGlvbihmaWVsZHMsIGF1dG9Gb3JtRG9jLCBhcHByb3ZlciwgYXBwbGljYW50LCBzcGFjZUlkKXtcbiAgICB2YXIgX192YWx1ZXMgPSB7fTtcbiAgICAvL+eUs+ivt+WNleS4reWhq+eahOWAvOWkhOeQhlxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoICYmIGF1dG9Gb3JtRG9jKSB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkKXtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgIGlmKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZih0eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICog5bCG6KGo5qC85a2X5q6155qE5YC86L+b6KGM6L2s5o2i5ZCO5Lyg5YWlX192YWx1ZXPkuK1cbiAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZXPkuK3ooajmoLznmoTlgLzmoLzlvI/kuLpcbiAgICAgICAgICAgICAgICAgICAgKiBbe1wiYVwiOjEsXCJiXCI6NH0se1wiYVwiOjIsXCJiXCI6NX0se1wiYVwiOjMsXCJiXCI6Nn1dXG4gICAgICAgICAgICAgICAgICAgICogX192YWx1ZXPpnIDopoHovazljJbkuLrkuIvpnaLmoLzlvI/kuJTlkozkuLvooajnmoTlgLzkuIDmoLfmlL7liLDnrKzkuIDlsYJcbiAgICAgICAgICAgICAgICAgICAgKiB7XCJhXCI6WzEsMiwzXSxcImJcIjpbNCw1LDZdfVxuICAgICAgICAgICAgICAgICAgICAqKi9cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlRmllbGRzID0gZmllbGQuc2ZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlVmFsdWVzID0gYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhVGFibGVWYWx1ZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGVWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy/mjInlhazlvI/nmoTmoLzlvI/ovazmjaLlgLzkuLpfX3RhYmxlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIGlmKHRhYmxlRmllbGRzICYmIHRhYmxlRmllbGRzLmxlbmd0aCAmJiB0YWJsZVZhbHVlcyAmJiB0YWJsZVZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHRhYmxlVmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFUYWJsZVZhbHVlcy5wdXNoKEZvcm1fZm9ybXVsYS5pbml0X2Zvcm11bGFfdmFsdWVzKHRhYmxlRmllbGRzLCB0YWJsZVZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v5oyJ5Li76KGo55qE5qC85byP6L2s5o2iX190YWJsZVZhbHVlc+WKoOWIsFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbih0YWJsZWZpZWxkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlVmFsdWVzW3RhYmxlZmllbGQuY29kZV0gPSBmb3JtdWxhVGFibGVWYWx1ZXMuZ2V0RWFjaCh0YWJsZWZpZWxkLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlcyA9IEZvcm1fZm9ybXVsYS5taXhpbihfX3ZhbHVlcywgX190YWJsZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3VzZXInKXtcbiAgICAgICAgICAgICAgICAgICAgX192YWx1ZXNbZmllbGQuY29kZV0gPSBGb3JtX2Zvcm11bGEuaGFuZGVyVXNlck9iamVjdChXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3RzKHNwYWNlSWQsIGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2dyb3VwJyl7XG4gICAgICAgICAgICAgICAgICAgIF9fdmFsdWVzW2ZpZWxkLmNvZGVdID0gRm9ybV9mb3JtdWxhLmhhbmRlck9yZ09iamVjdChXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYU9yZ09iamVjdHMoYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0pKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnb2RhdGEnKXtcblx0XHRcdFx0XHRfX3ZhbHVlc1tmaWVsZC5jb2RlXSA9IGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdIHx8IHt9XG5cblx0XHRcdFx0fSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mraTlpITkvKBzcGFjZUlk57uZ6YCJ5Lq65o6n5Lu255qE5pen5pWw5o2u6K6h566Xcm9sZXPlkoxvcmdhbml6YXRpb25cbiAgICAgICAgICAgICAgICAgICAgX192YWx1ZXNbZmllbGQuY29kZV0gPSBhdXRvRm9ybURvY1tmaWVsZC5jb2RlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgICAvL+W9k+WJjeWkhOeQhuS6ulxuICAgIF9fdmFsdWVzW1wiYXBwcm92ZXJcIl0gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3Qoc3BhY2VJZCwgYXBwcm92ZXIpO1xuICAgIC8v55Sz6K+35Lq6XG4gICAgX192YWx1ZXNbXCJhcHBsaWNhbnRcIl0gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3Qoc3BhY2VJZCwgYXBwbGljYW50KTtcblxuICAgIHJldHVybiBfX3ZhbHVlcztcbn07XG5cbiIsIk1ldGVvci5wdWJsaXNoICdjYXRlZ29yaWVzJywgKHNwYWNlSWQpIC0+XG5cdGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHJldHVybiBkYi5jYXRlZ29yaWVzLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9LCB7IGZpZWxkczogeyBuYW1lOiAxLCBzcGFjZTogMSwgc29ydF9ubzogMSwgYXBwOiAxIH0gfSkiLCJNZXRlb3IucHVibGlzaCgnY2F0ZWdvcmllcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuY2F0ZWdvcmllcy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBzb3J0X25vOiAxLFxuICAgICAgYXBwOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiXG5NZXRlb3IucHVibGlzaCAnY2ZzX2luc3RhbmNlcycsIChpbnN0YW5jZUlkcyktPlxuXHRjaGVjayhpbnN0YW5jZUlkcywgQXJyYXkpXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBpbnN0YW5jZUlkc1xuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBjZnMuaW5zdGFuY2VzLmZpbmQoeydtZXRhZGF0YS5pbnN0YW5jZSc6IHskaW46IGluc3RhbmNlSWRzfSAsICRvcjogW3snbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHskbmU6IHRydWV9fSx7J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLCBcIm1ldGFkYXRhLm93bmVyXCI6IHRoaXMudXNlcklkfV19KVxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Nmc19pbnN0YW5jZXMnLCBmdW5jdGlvbihpbnN0YW5jZUlkcykge1xuICBjaGVjayhpbnN0YW5jZUlkcywgQXJyYXkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlSWRzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gY2ZzLmluc3RhbmNlcy5maW5kKHtcbiAgICAnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG4gICAgICAkaW46IGluc3RhbmNlSWRzXG4gICAgfSxcbiAgICAkb3I6IFtcbiAgICAgIHtcbiAgICAgICAgJ21ldGFkYXRhLmlzX3ByaXZhdGUnOiB7XG4gICAgICAgICAgJG5lOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgJ21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLFxuICAgICAgICBcIm1ldGFkYXRhLm93bmVyXCI6IHRoaXMudXNlcklkXG4gICAgICB9XG4gICAgXVxuICB9KTtcbn0pO1xuIiwiXG5cbk1ldGVvci5wdWJsaXNoICdmbG93X3Bvc2l0aW9ucycsIChzcGFjZUlkKS0+XG5cdFxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gZGIuZmxvd19wb3NpdGlvbnMuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7cm9sZToxLCB1c2VyczogMSwgb3JnOiAxfX0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfcG9zaXRpb25zJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93X3Bvc2l0aW9ucy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICByb2xlOiAxLFxuICAgICAgdXNlcnM6IDEsXG4gICAgICBvcmc6IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaENvbXBvc2l0ZSAnZmxvd19wb3NpdGlvbnNfdGFidWxhcicsICh0YWJsZU5hbWUsIGlkcywgZmllbGRzKS0+XG5cdGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHRoaXMudW5ibG9jaygpXG5cblx0ZmluZDogLT5cblx0XHR0aGlzLnVuYmxvY2soKVxuXHRcdGRiLmZsb3dfcG9zaXRpb25zLmZpbmQge19pZDogeyRpbjogaWRzfX0sIGZpZWxkczogZmllbGRzXG5cblx0Y2hpbGRyZW46IFtcblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIGZsb3dfcm9sZXNcblx0XHRcdFx0ZGIuZmxvd19yb2xlcy5maW5kIHsgX2lkOiBwb3NpdGlvbi5yb2xlIH0sIGZpZWxkczogbmFtZTogMVxuXHRcdH1cblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIG9yZ2FuaXphdGlvbnNcblx0XHRcdFx0ZGIub3JnYW5pemF0aW9ucy5maW5kIHsgX2lkOiBwb3NpdGlvbi5vcmcgfSwgZmllbGRzOiBmdWxsbmFtZTogMVxuXHRcdH1cblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IHBvc2l0aW9uLnNwYWNlXG5cdFx0XHRcdFx0dXNlcjogJGluOiBwb3NpdGlvbi51c2Vyc1xuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHR1c2VyOiAxXG5cdFx0XHRcdFx0bmFtZTogMVxuXHRcdH1cblx0XSIsIk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlKCdmbG93X3Bvc2l0aW9uc190YWJ1bGFyJywgZnVuY3Rpb24odGFibGVOYW1lLCBpZHMsIGZpZWxkcykge1xuICBjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICB0aGlzLnVuYmxvY2soKTtcbiAgcmV0dXJuIHtcbiAgICBmaW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgcmV0dXJuIGRiLmZsb3dfcG9zaXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlkc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbXG4gICAgICB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLmZsb3dfcm9sZXMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHBvc2l0aW9uLnJvbGVcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHBvc2l0aW9uLm9yZ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBmdWxsbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IHBvc2l0aW9uLnNwYWNlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAkaW46IHBvc2l0aW9uLnVzZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICB1c2VyOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59KTtcbiIsIlxuXG5cdE1ldGVvci5wdWJsaXNoICdmbG93X3JvbGVzJywgKHNwYWNlSWQpLT5cblx0XHRcblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XHRcblx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0XHRyZXR1cm4gZGIuZmxvd19yb2xlcy5maW5kKHtzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtuYW1lOjF9fSk7XG4iLCJNZXRlb3IucHVibGlzaCgnZmxvd19yb2xlcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd19yb2xlcy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dzJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdCMg56ys5LiA5qyh6K6i6ZiF5pe25Yid5aeL5YyW5bel5L2c5Yy6XG5cdGlmIGRiLmZsb3dzLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSkuY291bnQoKSA9PSAwXG5cdFx0ZGIuc3BhY2VzLmNyZWF0ZVRlbXBsYXRlRm9ybUFuZEZsb3coc3BhY2VJZClcblxuXHRyZXR1cm4gZGIuZmxvd3MuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRuYW1lOiAxLFxuXHRcdFx0Zm9ybTogMSxcblx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0cGVybXM6IDEsXG5cdFx0XHRzcGFjZTogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRzb3J0X25vOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlX2Zsb3cnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5mbG93cy5maW5kKHtfaWQ6IGZsb3dJZCwgc3BhY2U6IHNwYWNlSWR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRuYW1lOiAxLFxuXHRcdFx0Zm9ybTogMSxcblx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0cGVybXM6IDEsXG5cdFx0XHRzcGFjZTogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRzb3J0X25vOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuXG5NZXRlb3IucHVibGlzaCAnZmxvd192ZXJzaW9uJywgKHNwYWNlSWQsIGZsb3dJZCwgdmVyc2lvbklkKSAtPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgdmVyc2lvbklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0Rmxvd1ZlcnNpb24gPSAoaWQgLCB2ZXJzaW9uSWQpLT5cblx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkIDogaWR9KTtcblx0XHRpZiBmbG93XG5cdFx0XHRmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnRcblx0XHRcdGZsb3dfdmVyc2lvbi5sYXRlc3QgPSB0cnVlXG5cblx0XHRcdGlmIGZsb3dfdmVyc2lvbi5faWQgIT0gdmVyc2lvbklkXG5cdFx0XHRcdGZsb3dfdmVyc2lvbiA9IGZsb3cuaGlzdG9yeXMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB2ZXJzaW9uSWQpXG5cdFx0XHRcdGZsb3dfdmVyc2lvbi5sYXRlc3QgPSBmYWxzZVxuXG5cdFx0XHRyZXR1cm4gZmxvd192ZXJzaW9uXG5cdGhhbmRsZSA9IGRiLmZsb3dzLmZpbmQoe19pZDogZmxvd0lkfSwge2ZpZWxkczoge19pZDogMSwgXCJjdXJyZW50Lm1vZGlmaWVkXCI6IDF9fSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcblx0fVxuXG5cblx0c2VsZi5hZGRlZChcImZsb3dfdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGbG93VmVyc2lvbihmbG93SWQsIHZlcnNpb25JZCkpO1xuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG5cbk1ldGVvci5wdWJsaXNoICdkaXN0cmlidXRlX29wdGlvbmFsX2Zsb3dzJywgKGZsb3dfaWRzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd19pZHNcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe19pZDogeyRpbjogZmxvd19pZHN9fSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0bmFtZTogMSxcblx0XHRcdGZvcm06IDEsXG5cdFx0XHRzdGF0ZTogMSxcblx0XHRcdHBlcm1zOiAxLFxuXHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3cnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe19pZDogZmxvd0lkLCBzcGFjZTogc3BhY2VJZH0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdHByaW50X3RlbXBsYXRlOiAxLFxuXHRcdFx0aW5zdGFuY2VfdGVtcGxhdGU6IDEsXG5cdFx0XHRldmVudHM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0dXBsb2FkX2FmdGVyX2JlaW5nX2Rpc3RyaWJ1dGVkOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdGFsbG93X3NlbGVjdF9zdGVwOiAxLFxuXHRcdFx0ZW5hYmxlX2FtaXNmb3JtOiAxXG5cdFx0fVxuXHR9KVxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfZmlsZXMnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBjZnMuZmlsZXMuZmluZCh7ICdtZXRhZGF0YS5zcGFjZSc6IHNwYWNlSWQsICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBmbG93SWQgfSlcblxuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgJ2Zsb3dzX3RhYnVsYXInLCAodGFibGVOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHRjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR0aGlzLnVuYmxvY2soKVxuXG5cdGZpbmQ6IC0+XG5cdFx0dGhpcy51bmJsb2NrKClcblx0XHRkYi5mbG93cy5maW5kIHtfaWQ6IHskaW46IGlkc319LCBmaWVsZHM6IGZpZWxkc1xuXG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKGZsb3cpIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IGZsb3cuc3BhY2UsXG5cdFx0XHRcdFx0dXNlcjogZmxvdy5jdXJyZW50Lm1vZGlmaWVkX2J5XG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdHVzZXI6IDFcblx0XHRcdFx0XHRuYW1lOiAxXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaW5kOiAoZmxvdykgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5mb3Jtcy5maW5kIHtcblx0XHRcdFx0XHRzcGFjZTogZmxvdy5zcGFjZSxcblx0XHRcdFx0XHRfaWQ6IGZsb3cuZm9ybVxuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHRfaWQ6IDFcblx0XHRcdFx0XHRuYW1lOiAxLFxuXHRcdFx0XHRcdGNhdGVnb3J5OiAxXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaW5kOiAoZmxvdykgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5jYXRlZ29yaWVzLmZpbmQge1xuXHRcdFx0XHRcdHNwYWNlOiBmbG93LnNwYWNlXG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdF9pZDogMVxuXHRcdFx0XHRcdG5hbWU6IDFcblx0XHR9XG5cdF0iLCJNZXRlb3IucHVibGlzaCgnZmxvd3MnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKGRiLmZsb3dzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0pLmNvdW50KCkgPT09IDApIHtcbiAgICBkYi5zcGFjZXMuY3JlYXRlVGVtcGxhdGVGb3JtQW5kRmxvdyhzcGFjZUlkKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGZvcm06IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHBlcm1zOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBjb21wYW55X2lkOiAxLFxuICAgICAgc29ydF9ubzogMSxcbiAgICAgIGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG4gICAgICBkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZV9mbG93JywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgZm9ybTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgcGVybXM6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBzb3J0X25vOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfdmVyc2lvbicsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCwgdmVyc2lvbklkKSB7XG4gIHZhciBnZXRGbG93VmVyc2lvbiwgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXZlcnNpb25JZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEZsb3dWZXJzaW9uID0gZnVuY3Rpb24oaWQsIHZlcnNpb25JZCkge1xuICAgIHZhciBmbG93LCBmbG93X3ZlcnNpb247XG4gICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpZFxuICAgIH0pO1xuICAgIGlmIChmbG93KSB7XG4gICAgICBmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnQ7XG4gICAgICBmbG93X3ZlcnNpb24ubGF0ZXN0ID0gdHJ1ZTtcbiAgICAgIGlmIChmbG93X3ZlcnNpb24uX2lkICE9PSB2ZXJzaW9uSWQpIHtcbiAgICAgICAgZmxvd192ZXJzaW9uID0gZmxvdy5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZCk7XG4gICAgICAgIGZsb3dfdmVyc2lvbi5sYXRlc3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbG93X3ZlcnNpb247XG4gICAgfVxuICB9O1xuICBoYW5kbGUgPSBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBcImN1cnJlbnQubW9kaWZpZWRcIjogMVxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGZsb3dJZCwgdmVyc2lvbklkKSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZGlzdHJpYnV0ZV9vcHRpb25hbF9mbG93cycsIGZ1bmN0aW9uKGZsb3dfaWRzKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd19pZHMpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogZmxvd19pZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBwZXJtczogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdmbG93JywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBwcmludF90ZW1wbGF0ZTogMSxcbiAgICAgIGluc3RhbmNlX3RlbXBsYXRlOiAxLFxuICAgICAgZXZlbnRzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIHVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZDogMSxcbiAgICAgIGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBhbGxvd19zZWxlY3Rfc3RlcDogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfZmlsZXMnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGNmcy5maWxlcy5maW5kKHtcbiAgICAnbWV0YWRhdGEuc3BhY2UnOiBzcGFjZUlkLFxuICAgICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsXG4gICAgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGZsb3dJZFxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSgnZmxvd3NfdGFidWxhcicsIGZ1bmN0aW9uKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgY2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgdGhpcy51bmJsb2NrKCk7XG4gIHJldHVybiB7XG4gICAgZmluZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpZHNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGlsZHJlbjogW1xuICAgICAge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihmbG93KSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IGZsb3cuc3BhY2UsXG4gICAgICAgICAgICB1c2VyOiBmbG93LmN1cnJlbnQubW9kaWZpZWRfYnlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICAgIHVzZXI6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihmbG93KSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLmZvcm1zLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IGZsb3cuc3BhY2UsXG4gICAgICAgICAgICBfaWQ6IGZsb3cuZm9ybVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGZsb3cpIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuY2F0ZWdvcmllcy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBmbG93LnNwYWNlXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2Zvcm1zJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZvcm1zLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczoge25hbWU6IDEsIGNhdGVnb3J5OiAxLCBzdGF0ZTogMSwgZGVzY3JpcHRpb246IDEsIGluc3RhbmNlX3N0eWxlOiAxLCBhbWlzX3NjaGVtYTogMX19KVxuXG5NZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfZm9ybScsIChzcGFjZUlkLCBmb3JtSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZvcm1zLmZpbmQoe19pZDogZm9ybUlkLCBzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtuYW1lOiAxLCBjYXRlZ29yeTogMSwgc3RhdGU6IDEsIGRlc2NyaXB0aW9uOiAxLCBpbnN0YW5jZV9zdHlsZTogMSwgYW1pc19zY2hlbWE6IDF9fSlcblxuXG5NZXRlb3IucHVibGlzaCAnZm9ybV92ZXJzaW9uJywgKHNwYWNlSWQsIGZvcm1JZCwgdmVyc2lvbklkKSAtPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZvcm1JZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgdmVyc2lvbklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0Rm9ybVZlcnNpb24gPSAoaWQgLCB2ZXJzaW9uSWQpLT5cblx0XHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7X2lkIDogaWR9KTtcblx0XHRpZiAhZm9ybVxuXHRcdFx0cmV0dXJuIHt9XG5cdFx0Zm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50XG5cdFx0Zm9ybV92ZXJzaW9uLmxhdGVzdCA9IHRydWVcblx0XHRpZiBmb3JtX3ZlcnNpb24uX2lkICE9IHZlcnNpb25JZFxuXHRcdFx0Zm9ybV92ZXJzaW9uID0gZm9ybS5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZClcblx0XHRcdGZvcm1fdmVyc2lvbi5sYXRlc3QgPSBmYWxzZVxuXHRcdHJldHVybiBmb3JtX3ZlcnNpb25cblxuXHRoYW5kbGUgPSBkYi5mb3Jtcy5maW5kKHtfaWQ6IGZvcm1JZH0sIHtmaWVsZHM6IHtfaWQ6IDEsIFwiY3VycmVudC5tb2RpZmllZFwiOiAxfX0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdHNlbGYuY2hhbmdlZChcImZvcm1fdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGb3JtVmVyc2lvbihpZCwgdmVyc2lvbklkKSk7XG5cdH1cblxuXHRzZWxmLmFkZGVkKFwiZm9ybV92ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZvcm1WZXJzaW9uKGZvcm1JZCwgdmVyc2lvbklkKSk7XG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKCkiLCJNZXRlb3IucHVibGlzaCgnZm9ybXMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZvcm1zLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBjYXRlZ29yeTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgZGVzY3JpcHRpb246IDEsXG4gICAgICBpbnN0YW5jZV9zdHlsZTogMSxcbiAgICAgIGFtaXNfc2NoZW1hOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnaW5zdGFuY2VfZm9ybScsIGZ1bmN0aW9uKHNwYWNlSWQsIGZvcm1JZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mb3Jtcy5maW5kKHtcbiAgICBfaWQ6IGZvcm1JZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgY2F0ZWdvcnk6IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIGRlc2NyaXB0aW9uOiAxLFxuICAgICAgaW5zdGFuY2Vfc3R5bGU6IDEsXG4gICAgICBhbWlzX3NjaGVtYTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zvcm1fdmVyc2lvbicsIGZ1bmN0aW9uKHNwYWNlSWQsIGZvcm1JZCwgdmVyc2lvbklkKSB7XG4gIHZhciBnZXRGb3JtVmVyc2lvbiwgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZm9ybUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXZlcnNpb25JZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEZvcm1WZXJzaW9uID0gZnVuY3Rpb24oaWQsIHZlcnNpb25JZCkge1xuICAgIHZhciBmb3JtLCBmb3JtX3ZlcnNpb247XG4gICAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpZFxuICAgIH0pO1xuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBmb3JtX3ZlcnNpb24gPSBmb3JtLmN1cnJlbnQ7XG4gICAgZm9ybV92ZXJzaW9uLmxhdGVzdCA9IHRydWU7XG4gICAgaWYgKGZvcm1fdmVyc2lvbi5faWQgIT09IHZlcnNpb25JZCkge1xuICAgICAgZm9ybV92ZXJzaW9uID0gZm9ybS5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZCk7XG4gICAgICBmb3JtX3ZlcnNpb24ubGF0ZXN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gIH07XG4gIGhhbmRsZSA9IGRiLmZvcm1zLmZpbmQoe1xuICAgIF9pZDogZm9ybUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIFwiY3VycmVudC5tb2RpZmllZFwiOiAxXG4gICAgfVxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oaWQsIHZlcnNpb25JZCkpO1xuICAgIH1cbiAgfSk7XG4gIHNlbGYuYWRkZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oZm9ybUlkLCB2ZXJzaW9uSWQpKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfZGF0YScsIChpbnN0YW5jZUlkLCBib3gpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyAoaW5zdGFuY2VJZCAmJiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiBpbnN0YW5jZUlkfSkuY291bnQoKSlcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0bWluaUFwcHJvdmVGaWVsZHMgPSBbJ19pZCcsICdpc19maW5pc2hlZCcsICd1c2VyJywgJ2hhbmRsZXInLCAnaGFuZGxlcl9uYW1lJywgJ3R5cGUnLCAnc3RhcnRfZGF0ZScsICdkZXNjcmlwdGlvbicsXG5cdFx0J2lzX3JlYWQnLCAnanVkZ2UnLCAnZmluaXNoX2RhdGUnLCAnZnJvbV91c2VyX25hbWUnLCAnZnJvbV91c2VyJywgJ2NjX2Rlc2NyaXB0aW9uJywgJ2F1dG9fc3VibWl0dGVkJ11cblxuXHR0cmlnZ2VyQ2hhbmdlRmllbGRzID0gWydmb3JtX3ZlcnNpb24nLCAnZmxvd192ZXJzaW9uJywgJ3JlbGF0ZWRfaW5zdGFuY2VzJywgJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnLCAndmFsdWVzJywgJ2NoYW5nZV90aW1lJ11cblxuXHR0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzID0ge31cblxuXHRpbnN0YW5jZV9maWVsZHNfMCA9IHtcblx0XHRcInJlY29yZF9zeW5jZWRcIjogMCxcblxuI1x0XHRcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvblwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmNvc3RfdGltZVwiOiAwLFxuI1x0XHRcInRyYWNlcy5hcHByb3Zlcy5yZWFkX2RhdGVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5pc19lcnJvclwiOiAwLFxuXHRcdCMgXCJ0cmFjZXMuYXBwcm92ZXMudXNlcl9uYW1lXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuZGVhZGxpbmVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5yZW1pbmRfZGF0ZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZGVkX2NvdW50XCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMubW9kaWZpZWRfYnlcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZFwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmdlb2xvY2F0aW9uXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuY2NfdXNlcnNcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5mcm9tX2FwcHJvdmVfaWRcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy52YWx1ZXNfaGlzdG9yeVwiOiAwXG5cdH1cblxuXHRnZXRNeWFwcHJvdmVNb2RpZmllZCA9ICh0cmFjZXMpLT5cblx0XHRteUFwcHJvdmVNb2RpZmllZHMgPSBuZXcgQXJyYXkoKVxuXG5cdFx0dHJhY2VzPy5mb3JFYWNoICh0cmFjZSktPlxuXHRcdFx0dHJhY2U/LmFwcHJvdmVzPy5mb3JFYWNoIChhcHByb3ZlKS0+XG5cdFx0XHRcdGlmIChhcHByb3ZlLnVzZXIgPT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09IHNlbGYudXNlcklkKVxuXHRcdFx0XHQjICYmICFhcHByb3ZlLmlzX2ZpbmlzaGVkXG4jXHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiYXBwcm92ZVwiLCBhcHByb3ZlLl9pZCwgYXBwcm92ZS5yZWFkX2RhdGUpXG5cblx0XHRcdFx0XHRteUFwcHJvdmVNb2RpZmllZHMucHVzaChhcHByb3ZlLnJlYWRfZGF0ZSlcblxuXHRcdHJldHVybiBteUFwcHJvdmVNb2RpZmllZHNcblxuXG5cdGdldE1pbmlJbnN0YW5jZSA9IChfaW5zdGFuY2VJZCktPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogX2luc3RhbmNlSWR9LCB7ZmllbGRzOiBpbnN0YW5jZV9maWVsZHNfMH0pXG5cblx0XHRpZiBpbnN0YW5jZVxuXG5cdFx0XHR0cmlnZ2VyQ2hhbmdlRmllbGRzLmZvckVhY2ggKGtleSktPlxuXHRcdFx0XHRpZiBrZXkgPT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnXG5cdFx0XHRcdFx0dHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoaW5zdGFuY2UudHJhY2VzKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gaW5zdGFuY2Vba2V5XVxuXG4jXHRcdFx0aGFzT3BpbmlvbkZpZWxkID0gSW5zdGFuY2VTaWduVGV4dC5pbmNsdWRlc09waW5pb25GaWVsZChpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pXG5cblx0XHRcdHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHsgc3BhY2U6IGluc3RhbmNlLnNwYWNlLCBrZXk6IFwic2hvd19tb2RhbF90cmFjZXNfbGlzdFwiIH0sIHsgZmllbGRzOiB7IHZhbHVlczogMSB9IH0pPy52YWx1ZXMgfHwgZmFsc2VcblxuXHRcdFx0aWYgc2hvd19tb2RhbF90cmFjZXNfbGlzdFxuXG5cdFx0XHRcdHRyYWNlcyA9IG5ldyBBcnJheSgpO1xuXG5cdFx0XHRcdGluc3RhbmNlPy50cmFjZXM/LmZvckVhY2ggKHRyYWNlKS0+XG5cdFx0XHRcdFx0X3RyYWNlID0gXy5jbG9uZSh0cmFjZSlcblxuXHRcdFx0XHRcdGFwcHJvdmVzID0gbmV3IEFycmF5KClcblxuXHRcdFx0XHRcdHRyYWNlPy5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSktPlxuXHRcdFx0XHRcdFx0aWYgYXBwcm92ZS50eXBlICE9ICdjYycgfHwgYXBwcm92ZS51c2VyID09IHNlbGYudXNlcklkIHx8IGFwcHJvdmUuaGFuZGxlciA9PSBzZWxmLnVzZXJJZCB8fCAoIV8uaXNFbXB0eShhcHByb3ZlLnNpZ25fZmllbGRfY29kZSkpXG5cdFx0XHRcdFx0XHRcdGFwcHJvdmVzLnB1c2goYXBwcm92ZSlcblxuXHRcdFx0XHRcdF90cmFjZS5hcHByb3ZlcyA9IGFwcHJvdmVzXG5cblx0XHRcdFx0XHR0cmFjZXMucHVzaChfdHJhY2UpXG5cblx0XHRcdFx0aW5zdGFuY2UudHJhY2VzID0gdHJhY2VzO1xuXG5cdFx0cmV0dXJuIGluc3RhbmNlXG5cblxuXHRuZWVkQ2hhbmdlID0gKGNoYW5nZUZpZWxkcyktPlxuXHRcdGlmIGNoYW5nZUZpZWxkc1xuXG5cdFx0XHRfY2hhbmdlID0gZmFsc2VcblxuXHRcdFx0X3JldiA9IF8uZmluZCB0cmlnZ2VyQ2hhbmdlRmllbGRzLCAoa2V5KS0+XG5cdFx0XHRcdF9rZXkgPSBrZXlcblxuXHRcdFx0XHRpZiBrZXkgPT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnXG5cdFx0XHRcdFx0X2tleSA9ICd0cmFjZXMnXG5cblx0XHRcdFx0aWYgXy5oYXMoY2hhbmdlRmllbGRzLCBfa2V5KVxuXG5cdFx0XHRcdFx0aWYga2V5ID09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJ1xuXG5cdFx0XHRcdFx0XHRfbXlfYXBwcm92ZV9tb2RpZmllZHMgPSBnZXRNeWFwcHJvdmVNb2RpZmllZChjaGFuZ2VGaWVsZHMudHJhY2VzKVxuXG4jXHRcdFx0XHRcdFx0Y29uc29sZS5sb2codHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBfbXlfYXBwcm92ZV9tb2RpZmllZHMpXG5cblx0XHRcdFx0XHRcdHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgX215X2FwcHJvdmVfbW9kaWZpZWRzKVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgY2hhbmdlRmllbGRzW2tleV0pXG5cblx0XHRcdGlmIF9yZXZcblx0XHRcdFx0X2NoYW5nZSA9IHRydWVcblxuI1x0XHRcdGNvbnNvbGUubG9nKF9yZXYsIF9jaGFuZ2UpXG5cblx0XHRcdHJldHVybiBfY2hhbmdlXG5cblx0XHRyZXR1cm4gdHJ1ZVxuXHQj5q2k5aSE5LiN6IO95re75YqgZmllbGRz6ZmQ5Yi277yM5ZCm5YiZ5Lya5a+86Ie05pWw5o2u5LiN5a6e5pe2XG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IGluc3RhbmNlSWR9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkLCBmaWVsZHMpLT5cblx0XHRcdGlmKGJveCAhPSAnaW5ib3gnIHx8IG5lZWRDaGFuZ2UoZmllbGRzKSlcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBnZXRNaW5pSW5zdGFuY2UoaWQpKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRpbnN0YW5jZSA9IGdldE1pbmlJbnN0YW5jZShpbnN0YW5jZUlkKVxuXG5cdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaW5zdGFuY2U/Ll9pZCwgaW5zdGFuY2UpO1xuXG5cdHNlbGYucmVhZHkoKTtcblxuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuXG5cbk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZV90cmFjZXMnLCAoaW5zdGFuY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGluc3RhbmNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXNcblxuXHRnZXRJbnN0YW5jZVRyYWNlcyA9IChfaW5zSWQpLT5cblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogX2luc0lkfSwge2ZpZWxkczoge19pZDogMSwgdHJhY2VzOiAxfX0pXG5cblxuXHRoYW5kbGUgPSAgZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogaW5zdGFuY2VJZH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlX3RyYWNlc1wiLCBpbnN0YW5jZUlkLCBnZXRJbnN0YW5jZVRyYWNlcyhpbnN0YW5jZUlkKSk7XG5cdH1cblxuXHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpIiwiTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX2RhdGEnLCBmdW5jdGlvbihpbnN0YW5jZUlkLCBib3gpIHtcbiAgdmFyIGdldE1pbmlJbnN0YW5jZSwgZ2V0TXlhcHByb3ZlTW9kaWZpZWQsIGhhbmRsZSwgaW5zdGFuY2UsIGluc3RhbmNlX2ZpZWxkc18wLCBtaW5pQXBwcm92ZUZpZWxkcywgbmVlZENoYW5nZSwgc2VsZiwgdHJpZ2dlckNoYW5nZUZpZWxkcywgdHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlcztcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCEoaW5zdGFuY2VJZCAmJiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiBpbnN0YW5jZUlkXG4gIH0pLmNvdW50KCkpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgbWluaUFwcHJvdmVGaWVsZHMgPSBbJ19pZCcsICdpc19maW5pc2hlZCcsICd1c2VyJywgJ2hhbmRsZXInLCAnaGFuZGxlcl9uYW1lJywgJ3R5cGUnLCAnc3RhcnRfZGF0ZScsICdkZXNjcmlwdGlvbicsICdpc19yZWFkJywgJ2p1ZGdlJywgJ2ZpbmlzaF9kYXRlJywgJ2Zyb21fdXNlcl9uYW1lJywgJ2Zyb21fdXNlcicsICdjY19kZXNjcmlwdGlvbicsICdhdXRvX3N1Ym1pdHRlZCddO1xuICB0cmlnZ2VyQ2hhbmdlRmllbGRzID0gWydmb3JtX3ZlcnNpb24nLCAnZmxvd192ZXJzaW9uJywgJ3JlbGF0ZWRfaW5zdGFuY2VzJywgJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnLCAndmFsdWVzJywgJ2NoYW5nZV90aW1lJ107XG4gIHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMgPSB7fTtcbiAgaW5zdGFuY2VfZmllbGRzXzAgPSB7XG4gICAgXCJyZWNvcmRfc3luY2VkXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuY29zdF90aW1lXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuaXNfZXJyb3JcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5kZWFkbGluZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZF9kYXRlXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMucmVtaW5kZWRfY291bnRcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZF9ieVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLm1vZGlmaWVkXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuZ2VvbG9jYXRpb25cIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5jY191c2Vyc1wiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmZyb21fYXBwcm92ZV9pZFwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLnZhbHVlc19oaXN0b3J5XCI6IDBcbiAgfTtcbiAgZ2V0TXlhcHByb3ZlTW9kaWZpZWQgPSBmdW5jdGlvbih0cmFjZXMpIHtcbiAgICB2YXIgbXlBcHByb3ZlTW9kaWZpZWRzO1xuICAgIG15QXBwcm92ZU1vZGlmaWVkcyA9IG5ldyBBcnJheSgpO1xuICAgIGlmICh0cmFjZXMgIT0gbnVsbCkge1xuICAgICAgdHJhY2VzLmZvckVhY2goZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgcmV0dXJuIHRyYWNlICE9IG51bGwgPyAocmVmID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwgPyByZWYuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgaWYgKGFwcHJvdmUudXNlciA9PT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09PSBzZWxmLnVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG15QXBwcm92ZU1vZGlmaWVkcy5wdXNoKGFwcHJvdmUucmVhZF9kYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBteUFwcHJvdmVNb2RpZmllZHM7XG4gIH07XG4gIGdldE1pbmlJbnN0YW5jZSA9IGZ1bmN0aW9uKF9pbnN0YW5jZUlkKSB7XG4gICAgdmFyIGluc3RhbmNlLCByZWYsIHJlZjEsIHNob3dfbW9kYWxfdHJhY2VzX2xpc3QsIHRyYWNlcztcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogX2luc3RhbmNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IGluc3RhbmNlX2ZpZWxkc18wXG4gICAgfSk7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlRmllbGRzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBnZXRNeWFwcHJvdmVNb2RpZmllZChpbnN0YW5jZS50cmFjZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBpbnN0YW5jZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSAoKHJlZiA9IGRiLnNwYWNlX3NldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgICBzcGFjZTogaW5zdGFuY2Uuc3BhY2UsXG4gICAgICAgIGtleTogXCJzaG93X21vZGFsX3RyYWNlc19saXN0XCJcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgdmFsdWVzOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSAhPSBudWxsID8gcmVmLnZhbHVlcyA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgICBpZiAoc2hvd19tb2RhbF90cmFjZXNfbGlzdCkge1xuICAgICAgICB0cmFjZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoKHJlZjEgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlZjEuZm9yRWFjaChmdW5jdGlvbih0cmFjZSkge1xuICAgICAgICAgICAgICB2YXIgX3RyYWNlLCBhcHByb3ZlcywgcmVmMjtcbiAgICAgICAgICAgICAgX3RyYWNlID0gXy5jbG9uZSh0cmFjZSk7XG4gICAgICAgICAgICAgIGFwcHJvdmVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgIGlmICh0cmFjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKChyZWYyID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHJlZjIuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHByb3ZlLnR5cGUgIT09ICdjYycgfHwgYXBwcm92ZS51c2VyID09PSBzZWxmLnVzZXJJZCB8fCBhcHByb3ZlLmhhbmRsZXIgPT09IHNlbGYudXNlcklkIHx8ICghXy5pc0VtcHR5KGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwcm92ZXMucHVzaChhcHByb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF90cmFjZS5hcHByb3ZlcyA9IGFwcHJvdmVzO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2VzLnB1c2goX3RyYWNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS50cmFjZXMgPSB0cmFjZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbiAgbmVlZENoYW5nZSA9IGZ1bmN0aW9uKGNoYW5nZUZpZWxkcykge1xuICAgIHZhciBfY2hhbmdlLCBfcmV2O1xuICAgIGlmIChjaGFuZ2VGaWVsZHMpIHtcbiAgICAgIF9jaGFuZ2UgPSBmYWxzZTtcbiAgICAgIF9yZXYgPSBfLmZpbmQodHJpZ2dlckNoYW5nZUZpZWxkcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBfa2V5LCBfbXlfYXBwcm92ZV9tb2RpZmllZHM7XG4gICAgICAgIF9rZXkgPSBrZXk7XG4gICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgIF9rZXkgPSAndHJhY2VzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5oYXMoY2hhbmdlRmllbGRzLCBfa2V5KSkge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgICAgX215X2FwcHJvdmVfbW9kaWZpZWRzID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoY2hhbmdlRmllbGRzLnRyYWNlcyk7XG4gICAgICAgICAgICByZXR1cm4gIV8uaXNFcXVhbCh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIF9teV9hcHByb3ZlX21vZGlmaWVkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgY2hhbmdlRmllbGRzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoX3Jldikge1xuICAgICAgICBfY2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfY2hhbmdlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQsIGZpZWxkcykge1xuICAgICAgaWYgKGJveCAhPT0gJ2luYm94JyB8fCBuZWVkQ2hhbmdlKGZpZWxkcykpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgZ2V0TWluaUluc3RhbmNlKGlkKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZW1vdmVkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG4gICAgfVxuICB9KTtcbiAgaW5zdGFuY2UgPSBnZXRNaW5pSW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaW5zdGFuY2UgIT0gbnVsbCA/IGluc3RhbmNlLl9pZCA6IHZvaWQgMCwgaW5zdGFuY2UpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX3RyYWNlcycsIGZ1bmN0aW9uKGluc3RhbmNlSWQpIHtcbiAgdmFyIGdldEluc3RhbmNlVHJhY2VzLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEluc3RhbmNlVHJhY2VzID0gZnVuY3Rpb24oX2luc0lkKSB7XG4gICAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogX2luc0lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgdHJhY2VzOiAxXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IGluc3RhbmNlSWRcbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJcblx0TWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlc19saXN0JywgKHNwYWNlSWQsIGJveCwgZmxvd0lkKS0+XG5cblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XHRcblx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdFx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cdFx0aWYgYm94ID09IFwiaW5ib3hcIlxuXHRcdFx0cXVlcnkuaW5ib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcblx0XHRlbHNlIGlmIGJveCA9PSBcIm91dGJveFwiXG5cdFx0XHRxdWVyeS5vdXRib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcblx0XHRlbHNlIGlmIGJveCA9PSBcImRyYWZ0XCJcblx0XHRcdHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuXHRcdFx0cXVlcnkuc3RhdGUgPSBcImRyYWZ0XCJcblx0XHRlbHNlIGlmIGJveCA9PSBcInBlbmRpbmdcIlxuXHRcdFx0cXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwicGVuZGluZ1wiXG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0cXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwiY29tcGxldGVkXCJcblx0XHRlbHNlIGlmIGJveCA9PSBcIm1vbml0b3JcIlxuXHRcdFx0cXVlcnkuZmxvdyA9IGZsb3dJZDtcblx0XHRcdHF1ZXJ5LnN0YXRlID0geyRpbjogW1wicGVuZGluZ1wiLFwiY29tcGxldGVkXCJdfTtcblx0XHRlbHNlXG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwibm9uZVwiXG5cblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtmaWVsZHM6IHtuYW1lOjEsIGNyZWF0ZWQ6MSwgZm9ybToxLCBmbG93OiAxLCBzcGFjZToxLCBtb2RpZmllZDoxLCBhcHBsaWNhbnQ6IDEsIGlzX2FyY2hpdmVkOjEsIGZvcm1fdmVyc2lvbjogMSwgZmxvd192ZXJzaW9uOiAxfX0pXG5cbiIsIk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZXNfbGlzdCcsIGZ1bmN0aW9uKHNwYWNlSWQsIGJveCwgZmxvd0lkKSB7XG4gIHZhciBxdWVyeTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBxdWVyeSA9IHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9O1xuICBpZiAoYm94ID09PSBcImluYm94XCIpIHtcbiAgICBxdWVyeS5pbmJveF91c2VycyA9IHRoaXMudXNlcklkO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJvdXRib3hcIikge1xuICAgIHF1ZXJ5Lm91dGJveF91c2VycyA9IHRoaXMudXNlcklkO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJkcmFmdFwiKSB7XG4gICAgcXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG4gICAgcXVlcnkuc3RhdGUgPSBcImRyYWZ0XCI7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcInBlbmRpbmdcIikge1xuICAgIHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJwZW5kaW5nXCI7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgcXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG4gICAgcXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJtb25pdG9yXCIpIHtcbiAgICBxdWVyeS5mbG93ID0gZmxvd0lkO1xuICAgIHF1ZXJ5LnN0YXRlID0ge1xuICAgICAgJGluOiBbXCJwZW5kaW5nXCIsIFwiY29tcGxldGVkXCJdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeS5zdGF0ZSA9IFwibm9uZVwiO1xuICB9XG4gIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGNyZWF0ZWQ6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgZmxvdzogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgbW9kaWZpZWQ6IDEsXG4gICAgICBhcHBsaWNhbnQ6IDEsXG4gICAgICBpc19hcmNoaXZlZDogMSxcbiAgICAgIGZvcm1fdmVyc2lvbjogMSxcbiAgICAgIGZsb3dfdmVyc2lvbjogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsImxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUgPSAoaW5zdGFuY2VpZCwgdXNlcklkLCBkYXRhTWFwLCBjYWxsYmFjayktPlxuXHRvcGVyYXRpb24gPSBbe1xuXHRcdFwiJG1hdGNoXCI6IHtcblx0XHRcdFwiX2lkXCI6IGluc3RhbmNlaWRcblx0XHR9XG5cdH0sIHtcIiRwcm9qZWN0XCI6IHtcIm5hbWVcIjogMSwgXCJfYXBwcm92ZVwiOiBcIiR0cmFjZXMuYXBwcm92ZXNcIn19LCB7XCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJ9LCB7XCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJ9LFxuXHRcdHtcIiRtYXRjaFwiOiB7XCJfYXBwcm92ZS5pc19maW5pc2hlZFwiOiB0cnVlLCAkb3I6W3tcIl9hcHByb3ZlLmhhbmRsZXJcIjogdXNlcklkfSx7XCJfYXBwcm92ZS51c2VyXCI6IHVzZXJJZH1dfX0sXG5cdFx0e1wiJGdyb3VwXCI6IHtcIl9pZFwiOiBcIiRfaWRcIiwgXCJmaW5pc2hfZGF0ZVwiOiB7XCIkbGFzdFwiOiBcIiRfYXBwcm92ZS5maW5pc2hfZGF0ZVwifX19XG5cdF1cblxuXHRkYi5pbnN0YW5jZXMucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShvcGVyYXRpb24pLnRvQXJyYXkgKGVyciwgZGF0YSktPlxuXHRcdGlmIGVyclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGVycilcblxuXHRcdGRhdGEuZm9yRWFjaCAoZG9jKSAtPlxuXHRcdFx0ZGF0YU1hcC5wdXNoIGRvY1xuXG5cdFx0aWYgY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKVxuXHRcdFx0Y2FsbGJhY2soKVxuXHRcdHJldHVyblxuXG5hc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUgPSBNZXRlb3Iud3JhcEFzeW5jKGxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUpXG5cbk1ldGVvci5wdWJsaXNoIFwiaW5zdGFuY2VfdGFidWxhclwiLCAodGFibGVOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0Y2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHRmaWVsZHMuY2NfdXNlcnMgPSAxXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlID0gKHVzZXJJZCwgaW5zdGFuY2VJZCktPlxuXHRcdGRhdGEgPSBbXVxuXHRcdGFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZShpbnN0YW5jZUlkLCB1c2VySWQsIGRhdGEpXG5cdFx0aWYgZGF0YS5sZW5ndGggPiAwXG5cdFx0XHRyZXR1cm4gZGF0YVswXVxuXG5cblx0Z2V0TXlBcHByb3ZlID0gKHVzZXJJZCwgaW5zdGFuY2VJZCktPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VJZH0sIHtmaWVsZHM6IHt0cmFjZXM6IDF9fSlcblx0XHRteUFwcHJvdmUgPSBudWxsXG5cblx0XHRpZiAhaW5zdGFuY2Vcblx0XHRcdHJldHVyblxuXG5cdFx0aWYgIWluc3RhbmNlLnRyYWNlcyB8fCBpbnN0YW5jZS50cmFjZXMubGVuZ3RoIDwgMVxuXHRcdFx0cmV0dXJuXG5cblx0XHRub3RGaW5pc2hlZFRyYWNlcyA9IGluc3RhbmNlLnRyYWNlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKVxuXG5cdFx0aWYgbm90RmluaXNoZWRUcmFjZXMubGVuZ3RoID4gMFxuXHRcdFx0YXBwcm92ZXMgPSBub3RGaW5pc2hlZFRyYWNlc1swXS5hcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKS5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgdXNlcklkKTtcblxuXHRcdFx0aWYgYXBwcm92ZXMubGVuZ3RoID4gMFxuXHRcdFx0XHRhcHByb3ZlID0gYXBwcm92ZXNbMF1cblx0XHRcdFx0bXlBcHByb3ZlID0ge1xuXHRcdFx0XHRcdGlkOiBhcHByb3ZlLl9pZCxcblx0XHRcdFx0XHRpbnN0YW5jZTogYXBwcm92ZS5pbnN0YW5jZSxcblx0XHRcdFx0XHR0cmFjZTogYXBwcm92ZS50cmFjZSxcblx0XHRcdFx0XHRpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWQsXG5cdFx0XHRcdFx0c3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlXG5cdFx0XHRcdFx0YWdlbnQ6IGFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHR1c2VyX25hbWU6IGFwcHJvdmUudXNlcl9uYW1lXG5cdFx0XHRcdH1cblxuXHRcdGlmICFteUFwcHJvdmVcblx0XHRcdGlzX3JlYWQgPSBmYWxzZVxuXHRcdFx0aW5zdGFuY2UudHJhY2VzLmZvckVhY2ggKHRyYWNlKSAtPlxuXHRcdFx0XHR0cmFjZT8uYXBwcm92ZXM/LmZvckVhY2ggKGFwcHJvdmUpIC0+XG5cdFx0XHRcdFx0aWYgYXBwcm92ZS50eXBlID09ICdjYycgYW5kIGFwcHJvdmUudXNlciA9PSB1c2VySWQgYW5kIGFwcHJvdmUuaXNfZmluaXNoZWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdGlmIGFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0XHRcdFx0XHRpc19yZWFkID0gdHJ1ZVxuXHRcdFx0XHRcdFx0bXlBcHByb3ZlID0ge2lkOiBhcHByb3ZlLl9pZCwgaXNfcmVhZDogaXNfcmVhZCwgc3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlLCBhZ2VudDogYXBwcm92ZS5hZ2VudCwgdXNlcl9uYW1lOiBhcHByb3ZlLnVzZXJfbmFtZX1cblxuXHRcdHJldHVybiBteUFwcHJvdmVcblxuXHRnZXRTdGVwQ3VycmVudE5hbWUgPSAoaW5zdGFuY2VJZCkgLT5cblx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlSWR9LCB7ZmllbGRzOiB7XCJ0cmFjZXMubmFtZVwiOiAxLCBcInRyYWNlc1wiOiB7JHNsaWNlOiAtMX19fSlcblx0XHRpZiBpbnN0YW5jZVxuXHRcdFx0c3RlcEN1cnJlbnROYW1lID0gaW5zdGFuY2UudHJhY2VzP1swXT8ubmFtZVxuXG5cdFx0cmV0dXJuIHN0ZXBDdXJyZW50TmFtZVxuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW46IGlkc319LCB7ZmllbGRzOiB7dHJhY2VzOiAwfX0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0bXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRcdG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0XHRpZiBteUFwcHJvdmVcblx0XHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkXG5cdFx0XHRcdGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZVxuXHRcdFx0XHRpZiBteUFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHRpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlXG5cblx0XHRcdGlmIG15TGFzdEZpbmlzaGVkQXBwcm92ZVxuXHRcdFx0XHRpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZVxuXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGluc3RhbmNlLmNjX2NvdW50ID0gaW5zdGFuY2UuY2NfdXNlcnM/Lmxlbmd0aCB8fCAwXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHRyeVxuXHRcdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdpbnN0YW5jZSBvYnNlcnZlQ2hhbmdlcyBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdzZWxmLnVzZXJJZDogJywgc2VsZi51c2VySWQpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygndGFibGVOYW1lOiAnLCB0YWJsZU5hbWUpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnaWRzOiAnLCBKU09OLnN0cmluZ2lmeShpZHMpKTtcblx0XHRcdFx0Y29uc29sZS5sb2coJ215QXBwcm92ZTogJywgSlNPTi5zdHJpbmdpZnkobXlBcHByb3ZlKSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0aWRzLmZvckVhY2ggKGlkKS0+XG5cdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdG15QXBwcm92ZSA9IGdldE15QXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0bXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRpZiBteUFwcHJvdmVcblx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSBteUFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0aW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlXG5cdFx0XHRpZiBteUFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHRpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lXG5cdFx0ZWxzZVxuXHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IHRydWVcblxuXHRcdGlmIG15TGFzdEZpbmlzaGVkQXBwcm92ZVxuXHRcdFx0aW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGVcblxuXHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdGluc3RhbmNlLmNjX2NvdW50ID0gaW5zdGFuY2UuY2NfdXNlcnM/Lmxlbmd0aCB8fCAwXG5cdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcblxuTWV0ZW9yLnB1Ymxpc2ggXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsICh0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHQjIGNvbnNvbGUubG9nKCd0YWJ1bGFyTmFtZTogJywgdGFidWxhck5hbWUpO1xuXHQjIGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuXHQjIGNvbnNvbGUubG9nKCdmaWVsZHM6ICcsIEpTT04uc3RyaW5naWZ5KGZpZWxkcykpO1xuXG5cdGRiLmluc3RhbmNlX3Rhc2tzLmZpbmQoe1xuXHRcdF9pZDoge1xuXHRcdFx0JGluOiBpZHNcblx0XHR9XG5cdH0sIHtcblx0XHRmaWVsZHM6IGZpZWxkc1xuXHR9KVxuXG5NZXRlb3IucHVibGlzaCBcImluc3RhbmNlc190YWJ1bGFyXCIsICh0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHQjIGNvbnNvbGUubG9nKCd0YWJ1bGFyTmFtZTogJywgdGFidWxhck5hbWUpO1xuXHQjIGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuXHQjIGNvbnNvbGUubG9nKCdmaWVsZHM6ICcsIEpTT04uc3RyaW5naWZ5KGZpZWxkcykpO1xuXG5cdGRiLmluc3RhbmNlcy5maW5kKHtcblx0XHRfaWQ6IHtcblx0XHRcdCRpbjogaWRzXG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmllbGRzOiBmaWVsZHNcblx0fSkiLCJ2YXIgYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlLCBsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlO1xuXG5sYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlID0gZnVuY3Rpb24oaW5zdGFuY2VpZCwgdXNlcklkLCBkYXRhTWFwLCBjYWxsYmFjaykge1xuICB2YXIgb3BlcmF0aW9uO1xuICBvcGVyYXRpb24gPSBbXG4gICAge1xuICAgICAgXCIkbWF0Y2hcIjoge1xuICAgICAgICBcIl9pZFwiOiBpbnN0YW5jZWlkXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgXCIkcHJvamVjdFwiOiB7XG4gICAgICAgIFwibmFtZVwiOiAxLFxuICAgICAgICBcIl9hcHByb3ZlXCI6IFwiJHRyYWNlcy5hcHByb3Zlc1wiXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgXCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJcbiAgICB9LCB7XG4gICAgICBcIiR1bndpbmRcIjogXCIkX2FwcHJvdmVcIlxuICAgIH0sIHtcbiAgICAgIFwiJG1hdGNoXCI6IHtcbiAgICAgICAgXCJfYXBwcm92ZS5pc19maW5pc2hlZFwiOiB0cnVlLFxuICAgICAgICAkb3I6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIl9hcHByb3ZlLmhhbmRsZXJcIjogdXNlcklkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCJfYXBwcm92ZS51c2VyXCI6IHVzZXJJZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIFwiJGdyb3VwXCI6IHtcbiAgICAgICAgXCJfaWRcIjogXCIkX2lkXCIsXG4gICAgICAgIFwiZmluaXNoX2RhdGVcIjoge1xuICAgICAgICAgIFwiJGxhc3RcIjogXCIkX2FwcHJvdmUuZmluaXNoX2RhdGVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBdO1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUob3BlcmF0aW9uKS50b0FycmF5KGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7XG4gICAgICByZXR1cm4gZGF0YU1hcC5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgaWYgKGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZSA9IE1ldGVvci53cmFwQXN5bmMobGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZSk7XG5cbk1ldGVvci5wdWJsaXNoKFwiaW5zdGFuY2VfdGFidWxhclwiLCBmdW5jdGlvbih0YWJsZU5hbWUsIGlkcywgZmllbGRzKSB7XG4gIHZhciBnZXRNeUFwcHJvdmUsIGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZSwgZ2V0U3RlcEN1cnJlbnROYW1lLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIGZpZWxkcy5jY191c2VycyA9IDE7XG4gIHNlbGYgPSB0aGlzO1xuICBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBmdW5jdGlvbih1c2VySWQsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgZGF0YTtcbiAgICBkYXRhID0gW107XG4gICAgYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlKGluc3RhbmNlSWQsIHVzZXJJZCwgZGF0YSk7XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRhdGFbMF07XG4gICAgfVxuICB9O1xuICBnZXRNeUFwcHJvdmUgPSBmdW5jdGlvbih1c2VySWQsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgYXBwcm92ZSwgYXBwcm92ZXMsIGluc3RhbmNlLCBpc19yZWFkLCBteUFwcHJvdmUsIG5vdEZpbmlzaGVkVHJhY2VzO1xuICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHRyYWNlczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIG15QXBwcm92ZSA9IG51bGw7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWluc3RhbmNlLnRyYWNlcyB8fCBpbnN0YW5jZS50cmFjZXMubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBub3RGaW5pc2hlZFRyYWNlcyA9IGluc3RhbmNlLnRyYWNlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKTtcbiAgICBpZiAobm90RmluaXNoZWRUcmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwcm92ZXMgPSBub3RGaW5pc2hlZFRyYWNlc1swXS5hcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKS5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgdXNlcklkKTtcbiAgICAgIGlmIChhcHByb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFwcHJvdmUgPSBhcHByb3Zlc1swXTtcbiAgICAgICAgbXlBcHByb3ZlID0ge1xuICAgICAgICAgIGlkOiBhcHByb3ZlLl9pZCxcbiAgICAgICAgICBpbnN0YW5jZTogYXBwcm92ZS5pbnN0YW5jZSxcbiAgICAgICAgICB0cmFjZTogYXBwcm92ZS50cmFjZSxcbiAgICAgICAgICBpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWQsXG4gICAgICAgICAgc3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlLFxuICAgICAgICAgIGFnZW50OiBhcHByb3ZlLmFnZW50LFxuICAgICAgICAgIHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFteUFwcHJvdmUpIHtcbiAgICAgIGlzX3JlYWQgPSBmYWxzZTtcbiAgICAgIGluc3RhbmNlLnRyYWNlcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIHJldHVybiB0cmFjZSAhPSBudWxsID8gKHJlZiA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsID8gcmVmLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgIGlmIChhcHByb3ZlLnR5cGUgPT09ICdjYycgJiYgYXBwcm92ZS51c2VyID09PSB1c2VySWQgJiYgYXBwcm92ZS5pc19maW5pc2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmIChhcHByb3ZlLmlzX3JlYWQpIHtcbiAgICAgICAgICAgICAgaXNfcmVhZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbXlBcHByb3ZlID0ge1xuICAgICAgICAgICAgICBpZDogYXBwcm92ZS5faWQsXG4gICAgICAgICAgICAgIGlzX3JlYWQ6IGlzX3JlYWQsXG4gICAgICAgICAgICAgIHN0YXJ0X2RhdGU6IGFwcHJvdmUuc3RhcnRfZGF0ZSxcbiAgICAgICAgICAgICAgYWdlbnQ6IGFwcHJvdmUuYWdlbnQsXG4gICAgICAgICAgICAgIHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbXlBcHByb3ZlO1xuICB9O1xuICBnZXRTdGVwQ3VycmVudE5hbWUgPSBmdW5jdGlvbihpbnN0YW5jZUlkKSB7XG4gICAgdmFyIGluc3RhbmNlLCByZWYsIHJlZjEsIHN0ZXBDdXJyZW50TmFtZTtcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBcInRyYWNlcy5uYW1lXCI6IDEsXG4gICAgICAgIFwidHJhY2VzXCI6IHtcbiAgICAgICAgICAkc2xpY2U6IC0xXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIHN0ZXBDdXJyZW50TmFtZSA9IChyZWYgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwgPyAocmVmMSA9IHJlZlswXSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBDdXJyZW50TmFtZTtcbiAgfTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHRyYWNlczogMFxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgZXJyb3IsIGluc3RhbmNlLCBteUFwcHJvdmUsIG15TGFzdEZpbmlzaGVkQXBwcm92ZSwgcmVmLCByZWYxO1xuICAgICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogaWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBteUFwcHJvdmUgPSBnZXRNeUFwcHJvdmUoc2VsZi51c2VySWQsIGlkKTtcbiAgICAgIG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpO1xuICAgICAgaWYgKG15QXBwcm92ZSkge1xuICAgICAgICBpbnN0YW5jZS5pc19yZWFkID0gbXlBcHByb3ZlLmlzX3JlYWQ7XG4gICAgICAgIGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZTtcbiAgICAgICAgaWYgKG15QXBwcm92ZS5hZ2VudCkge1xuICAgICAgICAgIGluc3RhbmNlLmFnZW50X3VzZXJfbmFtZSA9IG15QXBwcm92ZS51c2VyX25hbWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG15TGFzdEZpbmlzaGVkQXBwcm92ZSkge1xuICAgICAgICBpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZTtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlLmlzX2NjID0gKChyZWYgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgICAgaW5zdGFuY2UuY2NfY291bnQgPSAoKHJlZjEgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwKSB8fCAwO1xuICAgICAgZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5zdGFuY2Ugb2JzZXJ2ZUNoYW5nZXMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZygnc2VsZi51c2VySWQ6ICcsIHNlbGYudXNlcklkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RhYmxlTmFtZTogJywgdGFibGVOYW1lKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2lkczogJywgSlNPTi5zdHJpbmdpZnkoaWRzKSk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZygnbXlBcHByb3ZlOiAnLCBKU09OLnN0cmluZ2lmeShteUFwcHJvdmUpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcbiAgICB9XG4gIH0pO1xuICBpZHMuZm9yRWFjaChmdW5jdGlvbihpZCkge1xuICAgIHZhciBpbnN0YW5jZSwgbXlBcHByb3ZlLCBteUxhc3RGaW5pc2hlZEFwcHJvdmUsIHJlZiwgcmVmMTtcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IGZpZWxkc1xuICAgIH0pO1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgbXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgaWYgKG15QXBwcm92ZSkge1xuICAgICAgaW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkO1xuICAgICAgaW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlO1xuICAgICAgaWYgKG15QXBwcm92ZS5hZ2VudCkge1xuICAgICAgICBpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5pc19yZWFkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG15TGFzdEZpbmlzaGVkQXBwcm92ZSkge1xuICAgICAgaW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGU7XG4gICAgfVxuICAgIGluc3RhbmNlLmlzX2NjID0gKChyZWYgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgIGluc3RhbmNlLmNjX2NvdW50ID0gKChyZWYxID0gaW5zdGFuY2UuY2NfdXNlcnMpICE9IG51bGwgPyByZWYxLmxlbmd0aCA6IHZvaWQgMCkgfHwgMDtcbiAgICBkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnM7XG4gICAgcmV0dXJuIHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcbiAgfSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaChcImluc3RhbmNlX3Rhc2tzX3RhYnVsYXJcIiwgZnVuY3Rpb24odGFidWxhck5hbWUsIGlkcywgZmllbGRzKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgcmV0dXJuIGRiLmluc3RhbmNlX3Rhc2tzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IGZpZWxkc1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaChcImluc3RhbmNlc190YWJ1bGFyXCIsIGZ1bmN0aW9uKHRhYnVsYXJOYW1lLCBpZHMsIGZpZWxkcykge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBjaGVjayh0YWJ1bGFyTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGlkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczogZmllbGRzXG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnaW5zdGFuY2VzX2RyYWZ0JywgKHNwYWNlSWQpIC0+XG5cdGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe3N0YXRlOlwiZHJhZnRcIixzcGFjZTpzcGFjZUlkLHN1Ym1pdHRlcjp1c2VySWQsJG9yOlt7aW5ib3hfdXNlcnM6IHskZXhpc3RzOmZhbHNlfX0sIHtpbmJveF91c2VyczogW119XX0sIHtmaWVsZHM6IHtfaWQ6IDEsIHN0YXRlOiAxLCBzcGFjZTogMSwgc3VibWl0dGVyOiAxLCBpbmJveF91c2VyczogMSwgbW9kaWZpZWQ6IDEsIG5hbWU6IDF9LCBzb3J0Onttb2RpZmllZDogLTF9fSkiLCJNZXRlb3IucHVibGlzaCgnaW5zdGFuY2VzX2RyYWZ0JywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgdXNlcklkO1xuICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBzdGF0ZTogXCJkcmFmdFwiLFxuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIHN1Ym1pdHRlcjogdXNlcklkLFxuICAgICRvcjogW1xuICAgICAge1xuICAgICAgICBpbmJveF91c2Vyczoge1xuICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgaW5ib3hfdXNlcnM6IFtdXG4gICAgICB9XG4gICAgXVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgc3VibWl0dGVyOiAxLFxuICAgICAgaW5ib3hfdXNlcnM6IDEsXG4gICAgICBtb2RpZmllZDogMSxcbiAgICAgIG5hbWU6IDFcbiAgICB9LFxuICAgIHNvcnQ6IHtcbiAgICAgIG1vZGlmaWVkOiAtMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdkaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzJywgKGluc3RhbmNlX2lkcyktPlxuXHRjaGVjayhpbnN0YW5jZV9pZHMsIEFycmF5KVxuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XG5cdHVubGVzcyBpbnN0YW5jZV9pZHNcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0aWYgXy5pc0VtcHR5KGluc3RhbmNlX2lkcylcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXNcblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpbnN0YW5jZV9pZHN9fSwge2ZpZWxkczoge3N0YXRlOiAxLCB0cmFjZXM6eyRzbGljZTogMX0gfSB9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0YWRkZWQ6IChpZCwgZmllbGRzKS0+XG5cdFx0XHRzZWxmLmFkZGVkKCdpbnN0YW5jZXMnLCBpZCwge3N0YXRlOiBmaWVsZHMuc3RhdGUsIGlzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZH0pXG5cblx0XHRjaGFuZ2VkOiAoaWQsIGZpZWxkcyktPlxuXHRcdFx0aWYgZmllbGRzLnN0YXRlXG5cdFx0XHRcdHNlbGYuY2hhbmdlZCgnaW5zdGFuY2VzJywgaWQsIHtzdGF0ZTogZmllbGRzLnN0YXRlfSlcblx0XHRcdGlmIGZpZWxkcy50cmFjZXNcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge2lzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZH0pXG5cdH1cblxuXHR0aGlzLnJlYWR5KClcblx0dGhpcy5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcbiIsIk1ldGVvci5wdWJsaXNoKCdkaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzJywgZnVuY3Rpb24oaW5zdGFuY2VfaWRzKSB7XG4gIHZhciBoYW5kbGUsIHNlbGY7XG4gIGNoZWNrKGluc3RhbmNlX2lkcywgQXJyYXkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlX2lkcykge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShpbnN0YW5jZV9pZHMpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpbnN0YW5jZV9pZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgdHJhY2VzOiB7XG4gICAgICAgICRzbGljZTogMVxuICAgICAgfVxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGFkZGVkOiBmdW5jdGlvbihpZCwgZmllbGRzKSB7XG4gICAgICByZXR1cm4gc2VsZi5hZGRlZCgnaW5zdGFuY2VzJywgaWQsIHtcbiAgICAgICAgc3RhdGU6IGZpZWxkcy5zdGF0ZSxcbiAgICAgICAgaXNfcmVhZDogZmllbGRzLnRyYWNlc1swXS5hcHByb3Zlc1swXS5pc19yZWFkXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkLCBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZHMuc3RhdGUpIHtcbiAgICAgICAgc2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge1xuICAgICAgICAgIHN0YXRlOiBmaWVsZHMuc3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGRzLnRyYWNlcykge1xuICAgICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge1xuICAgICAgICAgIGlzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLnJlYWR5KCk7XG4gIHJldHVybiB0aGlzLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdyZWxhdGVkX2luc3RhY2VzJywgKGluc3RhbmNlSWQsIHJlbGF0ZWRfaW5zdGFuY2VzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgaW5zdGFuY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZWxhdGVkX2luc3RhbmNlX2lkcyA9IGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlSWQse2ZpZWxkczoge3JlbGF0ZWRfaW5zdGFuY2VzOiAxfX0pPy5yZWxhdGVkX2luc3RhbmNlc1xuXG5cdGlmIHJlbGF0ZWRfaW5zdGFuY2VfaWRzICYmIF8uaXNBcnJheShyZWxhdGVkX2luc3RhbmNlX2lkcylcblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbiA6IHJlbGF0ZWRfaW5zdGFuY2VfaWRzfX0sIHtmaWVsZHM6IHtfaWQ6IDEsIG5hbWU6IDEsIHNwYWNlOiAxfX0pXG5cdGVsc2Vcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpIiwiTWV0ZW9yLnB1Ymxpc2goJ3JlbGF0ZWRfaW5zdGFjZXMnLCBmdW5jdGlvbihpbnN0YW5jZUlkLCByZWxhdGVkX2luc3RhbmNlcykge1xuICB2YXIgcmVmLCByZWxhdGVkX2luc3RhbmNlX2lkcztcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZWxhdGVkX2luc3RhbmNlX2lkcyA9IChyZWYgPSBkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZUlkLCB7XG4gICAgZmllbGRzOiB7XG4gICAgICByZWxhdGVkX2luc3RhbmNlczogMVxuICAgIH1cbiAgfSkpICE9IG51bGwgPyByZWYucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDA7XG4gIGlmIChyZWxhdGVkX2luc3RhbmNlX2lkcyAmJiBfLmlzQXJyYXkocmVsYXRlZF9pbnN0YW5jZV9pZHMpKSB7XG4gICAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IHJlbGF0ZWRfaW5zdGFuY2VfaWRzXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgbmFtZTogMSxcbiAgICAgICAgc3BhY2U6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59KTtcbiIsImlmIE1ldGVvci5pc1NlcnZlclxuICAgIE1ldGVvci5wdWJsaXNoICdzcGFjZV91c2VyX3NpZ25zJywgKHNwYWNlSWQpIC0+XG4gICAgICAgIGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG4gICAgICAgIHVubGVzcyB0aGlzLnVzZXJJZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKVxuXG4gICAgICAgIHJldHVybiBkYi5zcGFjZV91c2VyX3NpZ25zLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9LCB7ZmllbGRzOiB7Y3JlYXRlZF9ieTogMCwgY3JlYXRlZDogMCwgbW9kaWZpZWRfYnk6IDB9fSlcbiIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ3NwYWNlX3VzZXJfc2lnbnMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICAgIH1cbiAgICByZXR1cm4gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiIyMjXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSBcInVzZXJfaW5ib3hfaW5zdGFuY2VcIiwgKCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cdHF1ZXJ5ID0ge3NwYWNlOiB7JGluOiB1c2VyU3BhY2VJZHN9fVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmluZDogLT5cblx0XHRkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuXHRcdFx0ZmllbGRzOiB7XG5cdFx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0XHRhcHBsaWNhbnRfbmFtZTogMSxcblx0XHRcdFx0ZmxvdzogMSxcblx0XHRcdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0XHRcdGNjX3VzZXJzOiAxLFxuXHRcdFx0XHRzdGF0ZTogMSxcblx0XHRcdFx0bmFtZTogMSxcblx0XHRcdFx0bW9kaWZpZWQ6IDEsXG5cdFx0XHRcdGZvcm06IDFcblx0XHRcdH0sIHNvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogMjAwXG5cdFx0fSk7XG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKGluc3RhbmNlLCBwb3N0KS0+XG5cdFx0XHRcdGRiLmZsb3dzLmZpbmQoe19pZDogaW5zdGFuY2UuZmxvd30sIHtmaWVsZHM6IHtuYW1lOiAxLCBzcGFjZTogMX19KTtcblx0XHR9XG5cdF1cbiMjI1xuXG4jIyNcbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9pbnN0YW5jZXMnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0I1x0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdCNcdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdCNcdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHQjXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cblx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRmaWVsZHMgPSB7XG5cdFx0c3BhY2U6IDEsXG4jXHRcdGFwcGxpY2FudF9uYW1lOiAxLFxuXHRcdGZsb3c6IDEsXG5cdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0Y2NfdXNlcnM6IDEsXG5cdFx0c3RhdGU6IDEsXG4jXHRcdG5hbWU6IDEsXG4jXHRcdG1vZGlmaWVkOiAxLFxuXHRcdGZvcm06IDFcblx0fVxuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7c29ydDoge21vZGlmaWVkOiAtMX0sIHNraXA6IDAsIGxpbWl0OiA1MDB9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0YWRkZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpXG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG4jIyNcblxuX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSAoc3BhY2VJZCwgdXNlcklkLCBfaXRlbXMsIGNhbGxiYWNrKS0+XG5cdGRiLmluc3RhbmNlcy5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKFtcblx0XHR7XG5cdFx0XHQkbWF0Y2g6IHtcblx0XHRcdFx0c3BhY2U6IHNwYWNlSWQsXG5cdFx0XHRcdCRvcjogW3tpbmJveF91c2VyczogdXNlcklkfSwge2NjX3VzZXJzOiB1c2VySWR9XVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0JGdyb3VwOiB7XG5cdFx0XHRcdF9pZDoge2Zsb3c6IFwiJGZsb3dcIiwgY2F0ZWdvcnk6IFwiJGNhdGVnb3J5XCJ9LCBjb3VudDogeyRzdW06IDF9XG5cdFx0XHR9XG5cdFx0fVxuXHRdKS50b0FycmF5IChlcnIsIGRhdGEpLT5cblx0XHRpZiBlcnJcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnIpXG5cblx0XHRkYXRhLmZvckVhY2ggKGRvYykgLT5cblx0XHRcdF9pdGVtcy5wdXNoIGRvY1xuXG5cdFx0aWYgY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKVxuXHRcdFx0Y2FsbGJhY2soKVxuXHRcdHJldHVyblxuXG5fYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IE1ldGVvci53cmFwQXN5bmMoX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUpXG5cbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9mbG93X2luc3RhbmNlc19jb3VudCcsIChzcGFjZUlkKS0+XG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZGF0YSA9IFtdICAj5pWw5o2u5qC85byP77yaW3tfaWQ6Zmxvd0lkLCBjb3VudDog5b6F5Yqe5pWw6YePfSwge19pZDpmbG93SWQyLCBjb3VudDog5b6F5Yqe5pWw6YePMn1dXG5cdF9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKHNwYWNlSWQsIHNlbGYudXNlcklkLCBkYXRhKVxuXG5cdF9mbG93c0RhdGEgPSBbXVxuXG5cdF8uZWFjaCBkYXRhLCAoZGF0YUl0ZW0pLT5cblx0XHRfZmxvd3NEYXRhLnB1c2goe19pZDogZGF0YUl0ZW0uX2lkLmZsb3csIGNhdGVnb3J5OiBkYXRhSXRlbS5faWQuY2F0ZWdvcnksIGNvdW50OiBkYXRhSXRlbS5jb3VudH0pXG5cblx0c2VsZi5hZGRlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtmbG93czogX2Zsb3dzRGF0YX0pO1xuXG5cdF9jaGFuZ2VEYXRhID0gKGRvYywgYWN0aW9uKS0+XG5cdFx0Zmxvd19pbnN0YW5jZSA9IF8uZmluZCBfZmxvd3NEYXRhLCAoZiktPlxuXHRcdFx0cmV0dXJuIGYuX2lkID09IGRvYy5mbG93XG5cdFx0aWYgZmxvd19pbnN0YW5jZVxuXHRcdFx0aWYgYWN0aW9uID09IFwiYWRkZWRcIlxuXHRcdFx0XHRmbG93X2luc3RhbmNlLmNvdW50Kytcblx0XHRcdGVsc2UgaWYgYWN0aW9uID09IFwicmVtb3ZlZFwiXG5cdFx0XHRcdGZsb3dfaW5zdGFuY2UuY291bnQtLVxuXHRcdGVsc2UgaWYgYWN0aW9uID09IFwiYWRkZWRcIlxuXHRcdFx0X2Zsb3dzRGF0YS5wdXNoIHtfaWQ6IGRvYy5mbG93LCBjYXRlZ29yeTogZG9jLmNhdGVnb3J5LCBjb3VudDogMX1cblxuXHRcdHNlbGYuY2hhbmdlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtmbG93czogX2Zsb3dzRGF0YX0pO1xuXG5cdF9pbml0ID0gdHJ1ZVxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge2ZpZWxkczoge19pZDogMSwgaW5ib3hfdXNlcnM6IDEsIGNjX3VzZXJzOiAxLCBmbG93OiAxLCBjYXRlZ29yeTogMX19KS5vYnNlcnZlIHtcblx0XHRhZGRlZDogKGRvYyktPlxuXHRcdFx0aWYgIV9pbml0XG5cdFx0XHRcdF9jaGFuZ2VEYXRhKGRvYywgXCJhZGRlZFwiKVxuXHRcdHJlbW92ZWQ6IChkb2MpLT5cblx0XHRcdGlmICFfaW5pdFxuXHRcdFx0XHRfY2hhbmdlRGF0YShkb2MsIFwicmVtb3ZlZFwiKVxuXHR9XG5cdF9pbml0ID0gZmFsc2VcblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpIiwiXG4vKlxuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgXCJ1c2VyX2luYm94X2luc3RhbmNlXCIsICgpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHRcdHVzZXI6IHRoaXMudXNlcklkLFxuXHRcdHVzZXJfYWNjZXB0ZWQ6IHRydWVcblx0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXHRxdWVyeSA9IHtzcGFjZTogeyRpbjogdXNlclNwYWNlSWRzfX1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGZpbmQ6IC0+XG5cdFx0ZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcblx0XHRcdGZpZWxkczoge1xuXHRcdFx0XHRzcGFjZTogMSxcblx0XHRcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0XHRcdGZsb3c6IDEsXG5cdFx0XHRcdGluYm94X3VzZXJzOiAxLFxuXHRcdFx0XHRjY191c2VyczogMSxcblx0XHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRcdG5hbWU6IDEsXG5cdFx0XHRcdG1vZGlmaWVkOiAxLFxuXHRcdFx0XHRmb3JtOiAxXG5cdFx0XHR9LCBzb3J0OiB7bW9kaWZpZWQ6IC0xfSwgc2tpcDogMCwgbGltaXQ6IDIwMFxuXHRcdH0pO1xuXHRjaGlsZHJlbjogW1xuXHRcdHtcblx0XHRcdGZpbmQ6IChpbnN0YW5jZSwgcG9zdCktPlxuXHRcdFx0XHRkYi5mbG93cy5maW5kKHtfaWQ6IGluc3RhbmNlLmZsb3d9LCB7ZmllbGRzOiB7bmFtZTogMSwgc3BhY2U6IDF9fSk7XG5cdFx0fVxuXHRdXG4gKi9cblxuLypcbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9pbnN0YW5jZXMnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0ICpcdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHQgKlx0XHR1c2VyOiB0aGlzLnVzZXJJZCxcblx0ICpcdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHQgKlx0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXG5cdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmllbGRzID0ge1xuXHRcdHNwYWNlOiAxLFxuICpcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0ZmxvdzogMSxcblx0XHRpbmJveF91c2VyczogMSxcblx0XHRjY191c2VyczogMSxcblx0XHRzdGF0ZTogMSxcbiAqXHRcdG5hbWU6IDEsXG4gKlx0XHRtb2RpZmllZDogMSxcblx0XHRmb3JtOiAxXG5cdH1cblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge3NvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogNTAwfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGFkZGVkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKVxuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuICovXG52YXIgX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUsIF9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlO1xuXG5fZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCwgX2l0ZW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUoW1xuICAgIHtcbiAgICAgICRtYXRjaDoge1xuICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgJG9yOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGNjX3VzZXJzOiB1c2VySWRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICAkZ3JvdXA6IHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgZmxvdzogXCIkZmxvd1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcIiRjYXRlZ29yeVwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB7XG4gICAgICAgICAgJHN1bTogMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBdKS50b0FycmF5KGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7XG4gICAgICByZXR1cm4gX2l0ZW1zLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICBpZiAoY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xufTtcblxuX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSBNZXRlb3Iud3JhcEFzeW5jKF9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKTtcblxuTWV0ZW9yLnB1Ymxpc2goJ215X2luYm94X2Zsb3dfaW5zdGFuY2VzX2NvdW50JywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgX2NoYW5nZURhdGEsIF9mbG93c0RhdGEsIF9pbml0LCBkYXRhLCBoYW5kbGUsIHF1ZXJ5LCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgcXVlcnkgPSB7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfTtcbiAgcXVlcnkuJG9yID0gW1xuICAgIHtcbiAgICAgIGluYm94X3VzZXJzOiB0aGlzLnVzZXJJZFxuICAgIH0sIHtcbiAgICAgIGNjX3VzZXJzOiB0aGlzLnVzZXJJZFxuICAgIH1cbiAgXTtcbiAgZGF0YSA9IFtdO1xuICBfYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZShzcGFjZUlkLCBzZWxmLnVzZXJJZCwgZGF0YSk7XG4gIF9mbG93c0RhdGEgPSBbXTtcbiAgXy5lYWNoKGRhdGEsIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG4gICAgcmV0dXJuIF9mbG93c0RhdGEucHVzaCh7XG4gICAgICBfaWQ6IGRhdGFJdGVtLl9pZC5mbG93LFxuICAgICAgY2F0ZWdvcnk6IGRhdGFJdGVtLl9pZC5jYXRlZ29yeSxcbiAgICAgIGNvdW50OiBkYXRhSXRlbS5jb3VudFxuICAgIH0pO1xuICB9KTtcbiAgc2VsZi5hZGRlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtcbiAgICBmbG93czogX2Zsb3dzRGF0YVxuICB9KTtcbiAgX2NoYW5nZURhdGEgPSBmdW5jdGlvbihkb2MsIGFjdGlvbikge1xuICAgIHZhciBmbG93X2luc3RhbmNlO1xuICAgIGZsb3dfaW5zdGFuY2UgPSBfLmZpbmQoX2Zsb3dzRGF0YSwgZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIGYuX2lkID09PSBkb2MuZmxvdztcbiAgICB9KTtcbiAgICBpZiAoZmxvd19pbnN0YW5jZSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gXCJhZGRlZFwiKSB7XG4gICAgICAgIGZsb3dfaW5zdGFuY2UuY291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBcInJlbW92ZWRcIikge1xuICAgICAgICBmbG93X2luc3RhbmNlLmNvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwiYWRkZWRcIikge1xuICAgICAgX2Zsb3dzRGF0YS5wdXNoKHtcbiAgICAgICAgX2lkOiBkb2MuZmxvdyxcbiAgICAgICAgY2F0ZWdvcnk6IGRvYy5jYXRlZ29yeSxcbiAgICAgICAgY291bnQ6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiZmxvd19pbnN0YW5jZXNcIiwgc3BhY2VJZCwge1xuICAgICAgZmxvd3M6IF9mbG93c0RhdGFcbiAgICB9KTtcbiAgfTtcbiAgX2luaXQgPSB0cnVlO1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuICAgIGZpZWxkczoge1xuICAgICAgX2lkOiAxLFxuICAgICAgaW5ib3hfdXNlcnM6IDEsXG4gICAgICBjY191c2VyczogMSxcbiAgICAgIGZsb3c6IDEsXG4gICAgICBjYXRlZ29yeTogMVxuICAgIH1cbiAgfSkub2JzZXJ2ZSh7XG4gICAgYWRkZWQ6IGZ1bmN0aW9uKGRvYykge1xuICAgICAgaWYgKCFfaW5pdCkge1xuICAgICAgICByZXR1cm4gX2NoYW5nZURhdGEoZG9jLCBcImFkZGVkXCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlZDogZnVuY3Rpb24oZG9jKSB7XG4gICAgICBpZiAoIV9pbml0KSB7XG4gICAgICAgIHJldHVybiBfY2hhbmdlRGF0YShkb2MsIFwicmVtb3ZlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBfaW5pdCA9IGZhbHNlO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIlxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdGNoZWNrKHNwYWNlSWQsIFN0cmluZylcblx0Y2hlY2soZmxvd0lkLCBTdHJpbmcpXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkICYmIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdjbXNfZmlsZXMnKS5maW5kKHsgc3BhY2U6IHNwYWNlSWQsICdwYXJlbnQubyc6ICdmbG93cycsICdwYXJlbnQuaWRzJzogZmxvd0lkLCAgbmFtZTogJ+ato+aWhy5kb2N4JyB9KVxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgY2hlY2soZmxvd0lkLCBTdHJpbmcpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIShzcGFjZUlkICYmIGZsb3dJZCkpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Ntc19maWxlcycpLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICdwYXJlbnQubyc6ICdmbG93cycsXG4gICAgJ3BhcmVudC5pZHMnOiBmbG93SWQsXG4gICAgbmFtZTogJ+ato+aWhy5kb2N4J1xuICB9KTtcbn0pO1xuIiwid29ya2Zsb3dUZW1wbGF0ZSA9IHt9XG5cbiPlj6/nlKjmraTohJrmnKzku47mqKHmnb/lt6XkvZzljLrlgZrmibnph4/lr7zlh7rvvJpcbiPkvb/nlKjnrqHnkIblkZjotKbmiLfnmbvlvZXlkI7vvIzov5vlhaVGbG93TW9kdWxlc++8jOWcqOaOp+WItuWPsOaJp+ihjOS7peS4i+iEmuacrOWNs+WPr1xuI2RiLmZvcm1zLmZpbmQoe3N0YXRlOlwiZW5hYmxlZFwifSkuZm9yRWFjaChmdW5jdGlvbihmb3JtKXt3aW5kb3cub3BlbihNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvd29ya2Zsb3cvZXhwb3J0L2Zvcm0/Zm9ybT1cIitmb3JtLl9pZCkpfSlcbndvcmtmbG93VGVtcGxhdGVbXCJlblwiXSA9W11cblxuI+WPr+eUqOatpOiEmuacrOS7juaooeadv+W3peS9nOWMuuWBmuaJuemHj+WvvOWHuu+8mlxuI+S9v+eUqOeuoeeQhuWRmOi0puaIt+eZu+W9leWQju+8jOi/m+WFpeaooeadv+S4k+WMuu+8jOWcqOaOp+WItuWPsOaJp+ihjOS7peS4i+iEmuacrOWNs+WPr1xuI2RiLmZvcm1zLmZpbmQoe3N0YXRlOlwiZW5hYmxlZFwifSkuZm9yRWFjaChmdW5jdGlvbihmb3JtKXt3aW5kb3cub3BlbihNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvd29ya2Zsb3cvZXhwb3J0L2Zvcm0/Zm9ybT1cIitmb3JtLl9pZCkpfSlcbndvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXSA9W11cblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRmcyA9IHJlcXVpcmUoJ2ZzJylcblx0cGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXHRtaW1lID0gcmVxdWlyZSgnbWltZScpXG5cdHJlYWRGaWxlTGlzdCA9IChwYXRoRGlyLCBmaWxlc0xpc3QpLT5cblx0XHRmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGhEaXIpXG5cdFx0ZmlsZXMuZm9yRWFjaCAobmFtZSwgaW5kZXgpLT5cblx0XHRcdHN0YXQgPSBmcy5zdGF0U3luYyhwYXRoLmpvaW4ocGF0aERpciwgbmFtZSkpXG5cdFx0XHRpZiBzdGF0LmlzRGlyZWN0b3J5KClcblx0XHRcdFx0IyDpgJLlvZLor7vlj5bmlofku7Zcblx0XHRcdFx0cmVhZEZpbGVMaXN0KHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSwgZmlsZXNMaXN0KVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRvYmogPSB7fVxuXHRcdFx0XHRvYmoucGF0aCA9IHBhdGhEaXJcblx0XHRcdFx0b2JqLm5hbWUgPSBuYW1lXG5cdFx0XHRcdGZpbGVzTGlzdC5wdXNoKG9iailcblxuXHQj6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7Zcblx0ZmlsZXNMaXN0X2NuID0gW11cblx0cGF0aF9jbiA9IE1ldGVvci5zZXR0aW5ncy53b3JrZmxvd1RlbXBsYXRlcz8ucGF0aF9jblxuXHRpZiBwYXRoX2NuXG5cdFx0YWJzb2x1dGVfcGF0aF9jbiA9IHBhdGgucmVzb2x2ZShwYXRoX2NuKVxuXHRcdGNvbnNvbGUubG9nIFwiYWJzb2x1dGVfcGF0aF9jblwiLCBhYnNvbHV0ZV9wYXRoX2NuXG5cdFx0aWYgZnMuZXhpc3RzU3luYyhhYnNvbHV0ZV9wYXRoX2NuKVxuXHRcdFx0cmVhZEZpbGVMaXN0KGFic29sdXRlX3BhdGhfY24sIGZpbGVzTGlzdF9jbilcblx0XHRcdGZpbGVzTGlzdF9jbi5mb3JFYWNoIChmaWxlKS0+XG5cdFx0XHRcdHRyeVxuXHRcdFx0XHRcdGlmIG1pbWUuZ2V0VHlwZShmaWxlLm5hbWUpIGlzIFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0XHRkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jylcblx0XHRcdFx0XHRcdHdvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXS5wdXNoKEpTT04ucGFyc2UoZGF0YSkpXG5cdFx0XHRcdGNhdGNoIGVcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwi6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXG5cdCPojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlxuXHRmaWxlc0xpc3RfdXMgPSBbXVxuXHRwYXRoX3VzID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzPy5wYXRoX3VzXG5cdGlmIHBhdGhfdXNcblx0XHRhYnNvbHV0ZV9wYXRoX3VzID0gcGF0aC5yZXNvbHZlKHBhdGhfdXMpXG5cdFx0Y29uc29sZS5sb2cgXCJhYnNvbHV0ZV9wYXRoX3VzXCIsIGFic29sdXRlX3BhdGhfdXNcblx0XHRpZiBmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfdXMpXG5cdFx0XHRyZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF91cywgZmlsZXNMaXN0X3VzKVxuXHRcdFx0ZmlsZXNMaXN0X3VzLmZvckVhY2ggKGZpbGUpLT5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0aWYgbWltZS5nZXRUeXBlKGZpbGUubmFtZSkgaXMgXCJhcHBsaWNhdGlvbi9qc29uXCJcblx0XHRcdFx0XHRcdGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKVxuXHRcdFx0XHRcdFx0d29ya2Zsb3dUZW1wbGF0ZVtcImVuXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSlcblx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCLojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0XHRcdFxuXHRcdFx0XHRcdFxuXG5cbiIsIiAgICAgICAgICAgICAgICAgICAgIFxuXG53b3JrZmxvd1RlbXBsYXRlID0ge307XG5cbndvcmtmbG93VGVtcGxhdGVbXCJlblwiXSA9IFtdO1xuXG53b3JrZmxvd1RlbXBsYXRlW1wiemgtQ05cIl0gPSBbXTtcblxuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHZhciBhYnNvbHV0ZV9wYXRoX2NuLCBhYnNvbHV0ZV9wYXRoX3VzLCBmaWxlc0xpc3RfY24sIGZpbGVzTGlzdF91cywgZnMsIG1pbWUsIHBhdGgsIHBhdGhfY24sIHBhdGhfdXMsIHJlYWRGaWxlTGlzdCwgcmVmLCByZWYxO1xuICBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4gIG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG4gIHJlYWRGaWxlTGlzdCA9IGZ1bmN0aW9uKHBhdGhEaXIsIGZpbGVzTGlzdCkge1xuICAgIHZhciBmaWxlcztcbiAgICBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGhEaXIpO1xuICAgIHJldHVybiBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgb2JqLCBzdGF0O1xuICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiByZWFkRmlsZUxpc3QocGF0aC5qb2luKHBhdGhEaXIsIG5hbWUpLCBmaWxlc0xpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIG9iai5wYXRoID0gcGF0aERpcjtcbiAgICAgICAgb2JqLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gZmlsZXNMaXN0LnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgZmlsZXNMaXN0X2NuID0gW107XG4gIHBhdGhfY24gPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzKSAhPSBudWxsID8gcmVmLnBhdGhfY24gOiB2b2lkIDA7XG4gIGlmIChwYXRoX2NuKSB7XG4gICAgYWJzb2x1dGVfcGF0aF9jbiA9IHBhdGgucmVzb2x2ZShwYXRoX2NuKTtcbiAgICBjb25zb2xlLmxvZyhcImFic29sdXRlX3BhdGhfY25cIiwgYWJzb2x1dGVfcGF0aF9jbik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYWJzb2x1dGVfcGF0aF9jbikpIHtcbiAgICAgIHJlYWRGaWxlTGlzdChhYnNvbHV0ZV9wYXRoX2NuLCBmaWxlc0xpc3RfY24pO1xuICAgICAgZmlsZXNMaXN0X2NuLmZvckVhY2goZnVuY3Rpb24oZmlsZSkge1xuICAgICAgICB2YXIgZGF0YSwgZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWltZS5nZXRUeXBlKGZpbGUubmFtZSkgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jyk7XG4gICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dUZW1wbGF0ZVtcInpoLUNOXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSk7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmaWxlc0xpc3RfdXMgPSBbXTtcbiAgcGF0aF91cyA9IChyZWYxID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzKSAhPSBudWxsID8gcmVmMS5wYXRoX3VzIDogdm9pZCAwO1xuICBpZiAocGF0aF91cykge1xuICAgIGFic29sdXRlX3BhdGhfdXMgPSBwYXRoLnJlc29sdmUocGF0aF91cyk7XG4gICAgY29uc29sZS5sb2coXCJhYnNvbHV0ZV9wYXRoX3VzXCIsIGFic29sdXRlX3BhdGhfdXMpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfdXMpKSB7XG4gICAgICByZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF91cywgZmlsZXNMaXN0X3VzKTtcbiAgICAgIHJldHVybiBmaWxlc0xpc3RfdXMuZm9yRWFjaChmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHZhciBkYXRhLCBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtaW1lLmdldFR5cGUoZmlsZS5uYW1lKSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd1RlbXBsYXRlW1wiZW5cIl0ucHVzaChKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpKTtcbiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59KTtcbiIsIiMjI1xuKiAgICAqICAgICogICAgKiAgICAqICAgICpcbuKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIHxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSUIGRheSBvZiB3ZWVrICgwIC0gNykgKDAgb3IgNyBpcyBTdW4pXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSAIG1vbnRoICgxIC0gMTIpXG7ilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgZGF5IG9mIG1vbnRoICgxIC0gMzEpXG7ilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBob3VyICgwIC0gMjMpXG7ilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIG1pbnV0ZSAoMCAtIDU5KVxu4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNlY29uZCAoMCAtIDU5LCBPUFRJT05BTClcbiMjI1xuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0aWYgTWV0ZW9yLnNldHRpbmdzLmNyb24/LmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvblxuXHRcdHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpXG5cdFx0IyDlrprml7bmiafooYzlkIzmraVcblx0XHRydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24uYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uXG5cdFx0Z29fbmV4dCA9IHRydWVcblx0XHRzY2hlZHVsZS5zY2hlZHVsZUpvYiBydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50ICgpLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRpZiAhZ29fbmV4dFxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRnb19uZXh0ID0gZmFsc2Vcblx0XHRcdFx0Y29uc29sZS50aW1lICdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nXG5cblx0XHRcdFx0bm93ID0gbmV3IERhdGVcblxuXHRcdFx0XHQjIOWwhuWnlOaJmOinhOWImeiuvue9ruS4uuS4jeWPr+eUqFxuXHRcdFx0XHRkYi5wcm9jZXNzX2RlbGVnYXRpb25fcnVsZXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSwgZW5kX3RpbWU6IHsgJGx0ZTogbm93IH0gfSwgeyAkc2V0OiB7IGVuYWJsZWQ6IGZhbHNlIH0gfSwgeyBtdWx0aSA6dHJ1ZSB9KVxuXG5cdFx0XHRcdGNvbnNvbGUudGltZUVuZCAnYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uJ1xuXHRcdFx0XHRnb19uZXh0ID0gdHJ1ZVxuXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJBVVRPIEFVVE9fRklOSVNIX1BST0NFU1NfREVMRUdBVElPTiBFUlJPUjogXCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0XHRcdGdvX25leHQgPSB0cnVlXG5cblx0XHQsIChlKS0+XG5cdFx0XHRjb25zb2xlLmxvZyAnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbi5jb2ZmZWUnXG5cdFx0XHRjb25zb2xlLmxvZyBlLnN0YWNrXG4iLCJcbi8qXG4qICAgICogICAgKiAgICAqICAgICogICAgKlxu4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAgfFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJQgZGF5IG9mIHdlZWsgKDAgLSA3KSAoMCBvciA3IGlzIFN1bilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIAgbW9udGggKDEgLSAxMilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBkYXkgb2YgbW9udGggKDEgLSAzMSlcbuKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGhvdXIgKDAgLSAyMylcbuKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgbWludXRlICgwIC0gNTkpXG7ilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2Vjb25kICgwIC0gNTksIE9QVElPTkFMKVxuICovXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIGdvX25leHQsIHJlZiwgcnVsZSwgc2NoZWR1bGU7XG4gIGlmICgocmVmID0gTWV0ZW9yLnNldHRpbmdzLmNyb24pICE9IG51bGwgPyByZWYuYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uIDogdm9pZCAwKSB7XG4gICAgc2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJyk7XG4gICAgcnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbjtcbiAgICBnb19uZXh0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc2NoZWR1bGUuc2NoZWR1bGVKb2IocnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlLCBub3c7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWdvX25leHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ29fbmV4dCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2F1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbicpO1xuICAgICAgICBub3cgPSBuZXcgRGF0ZTtcbiAgICAgICAgZGIucHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzLnVwZGF0ZSh7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBlbmRfdGltZToge1xuICAgICAgICAgICAgJGx0ZTogbm93XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQVVUTyBBVVRPX0ZJTklTSF9QUk9DRVNTX0RFTEVHQVRJT04gRVJST1I6IFwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZScpO1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKGUuc3RhY2spO1xuICAgIH0pKTtcbiAgfVxufSk7XG4iLCIjIyNcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4jIyNcbk1ldGVvci5zdGFydHVwIC0+XG5cdGlmIE1ldGVvci5zZXR0aW5ncy5jcm9uPy50aW1lb3V0X2F1dG9fc3VibWl0XG5cdFx0c2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJylcblx0XHQjIOWumuaXtuaJp+ihjOWQjOatpVxuXHRcdHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi50aW1lb3V0X2F1dG9fc3VibWl0XG5cdFx0Z29fbmV4dCA9IHRydWVcblx0XHRzY2hlZHVsZS5zY2hlZHVsZUpvYiBydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50ICgpLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRpZiAhZ29fbmV4dFxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRnb19uZXh0ID0gZmFsc2Vcblx0XHRcdFx0Y29uc29sZS50aW1lICd0aW1lb3V0X2F1dG9fc3VibWl0J1xuXG5cdFx0XHRcdHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoKVxuXG5cdFx0XHRcdGNvbnNvbGUudGltZUVuZCAndGltZW91dF9hdXRvX3N1Ym1pdCdcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiQVVUTyBUSU1FT1VUX0FVVE9fU1VCTUlUIEVSUk9SOiBcIlxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdCwgKGUpLT5cblx0XHRcdGNvbnNvbGUubG9nICdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUnXG5cdFx0XHRjb25zb2xlLmxvZyBlLnN0YWNrXG5cbk1ldGVvci5tZXRob2RzXG5cdHRpbWVvdXRfYXV0b19zdWJtaXQ6IChpbnNfaWQpLT5cblx0XHR1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KGluc19pZClcblx0XHRyZXR1cm4gdHJ1ZVxuXG5cbiIsIlxuLypcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4gKi9cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB2YXIgZ29fbmV4dCwgcmVmLCBydWxlLCBzY2hlZHVsZTtcbiAgaWYgKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3MuY3JvbikgIT0gbnVsbCA/IHJlZi50aW1lb3V0X2F1dG9fc3VibWl0IDogdm9pZCAwKSB7XG4gICAgc2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJyk7XG4gICAgcnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLnRpbWVvdXRfYXV0b19zdWJtaXQ7XG4gICAgZ29fbmV4dCA9IHRydWU7XG4gICAgcmV0dXJuIHNjaGVkdWxlLnNjaGVkdWxlSm9iKHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZ29fbmV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnb19uZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUudGltZSgndGltZW91dF9hdXRvX3N1Ym1pdCcpO1xuICAgICAgICB1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KCk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgndGltZW91dF9hdXRvX3N1Ym1pdCcpO1xuICAgICAgICByZXR1cm4gZ29fbmV4dCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBVVRPIFRJTUVPVVRfQVVUT19TVUJNSVQgRVJST1I6IFwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUnKTtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICB9KSk7XG4gIH1cbn0pO1xuXG5NZXRlb3IubWV0aG9kcyh7XG4gIHRpbWVvdXRfYXV0b19zdWJtaXQ6IGZ1bmN0aW9uKGluc19pZCkge1xuICAgIHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoaW5zX2lkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhciA9IG5ldyBUYWJ1bGFyLlRhYmxlXG5cdFx0bmFtZTogXCJyZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyXCJcblx0XHRjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZXNcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiX2lkXCIsXG5cdFx0XHRcdHRpdGxlOiAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJyZXZlcnNlXCIgaWQ9XCJyZXZlcnNlXCI+Jyxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0d2lkdGg6ICcxcHgnLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpbnB1dCA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJyZWxhdGVkLWluc3RhbmNlcy1saXN0LWNoZWNrYm94XCIgbmFtZT1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIGlkPVwicmVsYXRlZF9pbnN0YW5jZXNfaWRzXCIgdmFsdWU9XCInICsgZG9jLl9pZCArICdcIidcblxuXHRcdFx0XHRcdGlmIFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5yZWxhdGVkX2luc3RhbmNlcz8uaW5jbHVkZXMoZG9jLl9pZClcblx0XHRcdFx0XHRcdGlucHV0ICs9IFwiIGNoZWNrZWQgXCJcblxuXHRcdFx0XHRcdGlucHV0ICs9IFwiPlwiXG5cdFx0XHRcdFx0cmV0dXJuIGlucHV0XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm5hbWVcIixcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0d2lkdGg6ICc0NSUnLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRocmVmID0gJyc7XG5cdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSlcblx0XHRcdFx0XHRcdGhyZWYgPSAnJ1xuXG5cdFx0XHRcdFx0YWJzb2x1dGUgPSBmYWxzZVxuXG5cdFx0XHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdFx0XHRhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGVcblx0XHRcdFx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0XHRcdFx0aHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiK2RvYy5zcGFjZStcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aHJlZiA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitkb2Muc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGRvYy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXHRcdFx0XHRcdHJldHVybiBcIjxhIGRhdGEtaWQ9JyN7ZG9jLl9pZH0nIHRhcmdldD0nX2JsYW5rJyBocmVmPSdcIitocmVmK1wiJz5cIiArIGRvYy5uYW1lICsgXCI8L2E+XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiZmxvd19uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXRlID09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIlxuXG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9PC9kaXY+XG5cdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdH1cblx0XHRdXG5cblx0XHRkb206IFwidHBcIixcblx0XHRsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuXHRcdGV4dHJhRmllbGRzOiBbXCJzdGF0ZVwiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwic3BhY2VcIiwgXCJrZXl3b3Jkc1wiXSxcblx0XHRwYWdlTGVuZ3RoOiAxMCxcblx0XHRpbmZvOiBmYWxzZSxcblx0XHRzZWFyY2hpbmc6IHRydWUsXG5cdFx0cmVzcG9uc2l2ZTpcblx0XHRcdGRldGFpbHM6IGZhbHNlXG5cdFx0YXV0b1dpZHRoOiBmYWxzZSxcblx0XHRjaGFuZ2VTZWxlY3RvcjogKHNlbGVjdG9yLCB1c2VySWQpIC0+XG5cdFx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblxuXHRcdFx0c3BhY2VJZCA9IHNlbGVjdG9yLnNwYWNlXG5cdFx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNwYWNlSWQgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlSWQpXG5cdFx0XHRpZiAhc3BhY2Vcblx0XHRcdFx0c2VsZWN0b3Iuc3RhdGUgPSBcIm5vbmVcIlxuXHRcdFx0aWYgIXNwYWNlLmFkbWlucy5pbmNsdWRlcyh1c2VySWQpXG5cblx0XHRcdFx0Zmxvd19pZHMgPSBbXVxuXHRcdFx0XHRjdXJTcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcblx0XHRcdFx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcdFx0XHQndXNlcic6IHVzZXJJZFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRpZiBjdXJTcGFjZVVzZXJcblx0XHRcdFx0XHRvcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcblx0XHRcdFx0XHRcdF9pZDoge1xuXHRcdFx0XHRcdFx0XHQkaW46IGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkuZmV0Y2goKVxuXHRcdFx0XHRcdGZsb3dzID0gZGIuZmxvd3MuZmluZCh7IHNwYWNlOiBzcGFjZUlkIH0pXG5cdFx0XHRcdFx0Zmxvd3MuZm9yRWFjaCAoZmwpLT5cblx0XHRcdFx0XHRcdGlmIFdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpIHx8IFdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKVxuXHRcdFx0XHRcdFx0XHRmbG93X2lkcy5wdXNoKGZsLl9pZClcblxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNlbGVjdG9yLiRhbmRbMF0uJG9yID0gW3tzdWJtaXR0ZXI6IHVzZXJJZH0sIHthcHBsaWNhbnQ6IHVzZXJJZH0sIHtpbmJveF91c2VyczogdXNlcklkfSwge291dGJveF91c2VyczogdXNlcklkfSxcblx0XHRcdFx0XHRcdFx0e2NjX3VzZXJzOiB1c2VySWR9LCB7IGZsb3c6IHsgJGluOiBmbG93X2lkcyB9IH1dXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRfLmV4dGVuZCBzZWxlY3Rvciwge1xuXHRcdFx0XHRcdFx0JG9yOiBbe3N1Ym1pdHRlcjogdXNlcklkfSwge2FwcGxpY2FudDogdXNlcklkfSwge2luYm94X3VzZXJzOiB1c2VySWR9LCB7b3V0Ym94X3VzZXJzOiB1c2VySWR9LFxuXHRcdFx0XHRcdFx0XHR7Y2NfdXNlcnM6IHVzZXJJZH0sIHsgZmxvdzogeyAkaW46IGZsb3dfaWRzIH0gfV1cblx0XHRcdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWxlY3RvciIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gVGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyID0gbmV3IFRhYnVsYXIuVGFibGUoe1xuICAgIG5hbWU6IFwicmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhclwiLFxuICAgIGNvbGxlY3Rpb246IGRiLmluc3RhbmNlcyxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwiX2lkXCIsXG4gICAgICAgIHRpdGxlOiAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJyZXZlcnNlXCIgaWQ9XCJyZXZlcnNlXCI+JyxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd2lkdGg6ICcxcHgnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGlucHV0LCByZWY7XG4gICAgICAgICAgaW5wdXQgPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicmVsYXRlZC1pbnN0YW5jZXMtbGlzdC1jaGVja2JveFwiIG5hbWU9XCJyZWxhdGVkX2luc3RhbmNlc19pZHNcIiBpZD1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIHZhbHVlPVwiJyArIGRvYy5faWQgKyAnXCInO1xuICAgICAgICAgIGlmICgocmVmID0gVGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLnJlbGF0ZWRfaW5zdGFuY2VzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKGRvYy5faWQpIDogdm9pZCAwKSB7XG4gICAgICAgICAgICBpbnB1dCArPSBcIiBjaGVja2VkIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnB1dCArPSBcIj5cIjtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJuYW1lXCIsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdpZHRoOiAnNDUlJyxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhYnNvbHV0ZSwgaHJlZjtcbiAgICAgICAgICBocmVmID0gJyc7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpKSB7XG4gICAgICAgICAgICBocmVmID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICAgICAgYWJzb2x1dGUgPSB0aGlzLmFic29sdXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIGhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGRvYy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBkb2MuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhyZWYgPSBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBkb2Muc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKFwiPGEgZGF0YS1pZD0nXCIgKyBkb2MuX2lkICsgXCInIHRhcmdldD0nX2JsYW5rJyBocmVmPSdcIikgKyBocmVmICsgXCInPlwiICsgZG9jLm5hbWUgKyBcIjwvYT5cIjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmxvd19uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGp1ZGdlLCBzdGVwX2N1cnJlbnRfbmFtZTtcbiAgICAgICAgICBpZiAoZG9jLnN0YXRlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBqdWRnZSA9IGRvYy5maW5hbF9kZWNpc2lvbiB8fCBcImFwcHJvdmVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLmN1cnJlbnRfc3RlcF9uYW1lIHx8ICcnO1xuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInN0ZXAtY3VycmVudC1zdGF0ZSBcIiArIGp1ZGdlICsgXCJcXFwiPlwiICsgc3RlcF9jdXJyZW50X25hbWUgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IFwidHBcIixcbiAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgIGV4dHJhRmllbGRzOiBbXCJzdGF0ZVwiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwic3BhY2VcIiwgXCJrZXl3b3Jkc1wiXSxcbiAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICBpbmZvOiBmYWxzZSxcbiAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgcmVzcG9uc2l2ZToge1xuICAgICAgZGV0YWlsczogZmFsc2VcbiAgICB9LFxuICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgY2hhbmdlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1c2VySWQpIHtcbiAgICAgIHZhciBjdXJTcGFjZVVzZXIsIGZsb3dfaWRzLCBmbG93cywgb3JnYW5pemF0aW9ucywgcmVmLCByZWYxLCBzcGFjZSwgc3BhY2VJZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2VJZCA9IHNlbGVjdG9yLnNwYWNlO1xuICAgICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2VJZCA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZCk7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHNlbGVjdG9yLnN0YXRlID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlLmFkbWlucy5pbmNsdWRlcyh1c2VySWQpKSB7XG4gICAgICAgIGZsb3dfaWRzID0gW107XG4gICAgICAgIGN1clNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgICd1c2VyJzogdXNlcklkXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3VyU3BhY2VVc2VyKSB7XG4gICAgICAgICAgb3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgICAgJGluOiBjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLmZldGNoKCk7XG4gICAgICAgICAgZmxvd3MgPSBkYi5mbG93cy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZmxvd3MuZm9yRWFjaChmdW5jdGlvbihmbCkge1xuICAgICAgICAgICAgaWYgKFdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpIHx8IFdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvd19pZHMucHVzaChmbC5faWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYxID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzZWxlY3Rvci4kYW5kWzBdLiRvciA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibWl0dGVyOiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgYXBwbGljYW50OiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBvdXRib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBjY191c2VyczogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGZsb3c6IHtcbiAgICAgICAgICAgICAgICAkaW46IGZsb3dfaWRzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF8uZXh0ZW5kKHNlbGVjdG9yLCB7XG4gICAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1Ym1pdHRlcjogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBhcHBsaWNhbnQ6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgb3V0Ym94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGNjX3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGZsb3c6IHtcbiAgICAgICAgICAgICAgICAgICRpbjogZmxvd19pZHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIlN0ZWVkb3Muc3Vic1tcIkluc3RhbmNlVGFidWxhclwiXSA9IG5ldyBTdWJzTWFuYWdlcigpXG5cblxuX2hhbmRsZUxpc3RGaWVsZHMgPSAoZmllbGRzKSAtPlxuXHRpbnNfZmllbGRzID0gbmV3IEFycmF5KCk7XG5cblx0ZmllbGRzPy5mb3JFYWNoIChmKS0+XG5cdFx0aWYgZi50eXBlID09ICd0YWJsZSdcblx0XHRcdGNvbnNvbGUubG9nICdpZ25vcmUgb3BpbmlvbiBmaWVsZCBpbiB0YWJsZSdcblx0XHRlbHNlIGlmIGYudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdGY/LmZpZWxkcz8uZm9yRWFjaCAoZjEpLT5cblx0XHRcdFx0aW5zX2ZpZWxkcy5wdXNoIGYxXG5cdFx0ZWxzZVxuXHRcdFx0aW5zX2ZpZWxkcy5wdXNoIGZcblxuXHRyZXR1cm4gaW5zX2ZpZWxkc1xuXG5cbnVwZGF0ZVRhYnVsYXJUaXRsZSA9ICgpLT5cblxuIyDlpoLmnpxjb2x1bW5z5pyJ5Yqg5YeP77yM6K+35L+u5pS5VGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zIOWHveaVsFxuaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0ge1xuXHRcdG5hbWU6IFwiaW5zdGFuY2VzXCIsXG5cdFx0Y29sbGVjdGlvbjogZGIuaW5zdGFuY2VzLFxuXHRcdHB1YjogXCJpbnN0YW5jZV90YWJ1bGFyXCIsXG5cdFx0b25VbmxvYWQ6ICgpLT5cblx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXG5cdFx0ZHJhd0NhbGxiYWNrOiAoc2V0dGluZ3MpLT5cblx0XHRcdGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIilcblx0XHRcdGlmIGVtcHR5VGQubGVuZ3RoXG5cdFx0XHRcdGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiXG5cdFx0XHRpZiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkgLT5cblx0XHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApXG5cblx0XHRcdHRpdGxlID0gdCBcInBhZ2VyX2lucHV0X2hpbnRcIlxuXHRcdFx0ZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpXG5cdFx0XHRlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrIC0+XG5cdFx0XHRcdGlmICEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoXG5cdFx0XHRcdFx0aW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjIwcHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTZweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKVxuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKS5hcHBlbmQgaW5wdXRcblx0XHRcdFx0XHRnb1BhZ2UgPSAoaW5kZXgpLT5cblx0XHRcdFx0XHRcdGlmIGluZGV4ID4gMFxuXHRcdFx0XHRcdFx0XHRwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpXG5cdFx0XHRcdFx0XHRcdGlmIGluZGV4ID4gcGFnZXNcblx0XHRcdFx0XHRcdFx0XHQjIOmhteeggei2heWHuue0ouW8leaXtui3s+i9rOWIsOacgOWQjuS4gOmhtVxuXHRcdFx0XHRcdFx0XHRcdGluZGV4ID0gcGFnZXNcblx0XHRcdFx0XHRcdFx0aW5kZXgtLVxuXHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpXG5cdFx0XHRcdFx0aW5wdXQuYmx1ciAoZSktPlxuXHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2Vcblx0XHRcdFx0XHRcdCQodGhpcykucGFyZW50KCkuaHRtbCAnLi4uJ1xuXHRcdFx0XHRcdGlucHV0LmtleWRvd24gKGUpLT5cblx0XHRcdFx0XHRcdGlmKGUua2V5Q29kZS50b1N0cmluZygpID09IFwiMTNcIilcblx0XHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXG5cdFx0Y3JlYXRlZFJvdzogKHJvdywgZGF0YSwgZGF0YUluZGV4KSAtPlxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIGRhdGEuX2lkID09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkXG5cdFx0XHRcdFx0cm93LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic2VsZWN0ZWRcIilcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiX2lkXCIsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0bW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuXHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLm1vZGlmaWVkXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2Muc3RhdGUgIT0gJ2RyYWZ0J1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWRcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdvdXRib3gnIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJ1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLnN1Ym1pdF9kYXRlXG5cblx0XHRcdFx0XHRtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG5cdFx0XHRcdFx0Zmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZVxuXHRcdFx0XHRcdGNjX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdCMg5b2T5YmN55So5oi35ZyoY2MgdXNlcuS4re+8jOS9huaYr+S4jeWcqGluYm94IHVzZXJz5pe25omN5pi+56S6J+S8oOmYhSfmloflrZdcblx0XHRcdFx0XHRpZiBkb2MuaXNfY2MgJiYgIWRvYy5pbmJveF91c2Vycz8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2MuY3VycmVudF9zdGVwX25hbWV9KTwvc3Bhbj48L2Rpdj5cIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9ICdkcmFmdCcgJiYgZG9jLmN1cnJlbnRfc3RlcF9uYW1lXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLmN1cnJlbnRfc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08L2Rpdj5cIlxuXG5cdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHQjIGlzRmF2b3JpdGVTZWxlY3RlZCA9IEZhdm9yaXRlcy5pc1JlY29yZFNlbGVjdGVkKFwiaW5zdGFuY2VzXCIsIGRvYy5faWQpXG5cdFx0XHRcdFx0IyBpZiBGYXZvcml0ZXMuaXNSZWNvcmRTZWxlY3RlZChcImluc3RhbmNlc1wiLCBkb2MuX2lkKVxuXHRcdFx0XHRcdCMgXHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLWlvcy1zdGFyLW91dGxpbmUgaW5zdGFuY2UtZmF2b3JpdGUtc2VsZWN0ZWRcIj48L2k+J1xuXHRcdFx0XHRcdCMgZWxzZSBcblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb24gPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlWYWx1ZSA9IGRvYy52YWx1ZXM/LnByaW9yaXR5XG5cdFx0XHRcdFx0c3dpdGNoIHByaW9yaXR5VmFsdWVcblx0XHRcdFx0XHRcdHdoZW4gXCLnibnmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLntKfmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHR3aGVuIFwi5Yqe5paHXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCJcblx0XHRcdFx0XHRpZiBwcmlvcml0eUljb25DbGFzc1xuXHRcdFx0XHRcdFx0aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktI3twcmlvcml0eUljb25DbGFzc31cIlxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lICN7aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzc30nPiN7ZG9jLm5hbWV9I3tjY192aWV3fSN7YWdlbnRfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPiN7ZG9jLmFwcGxpY2FudF9uYW1lfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPiN7c3RlcF9jdXJyZW50X25hbWVfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9JyN7bW9kaWZpZWRTdHJpbmd9Jz4je21vZGlmaWVkRnJvbU5vd308L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLmlzX2NjICYmICFkb2MuaW5ib3hfdXNlcnM/LmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0Y2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWVcblx0XHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZX0pICsgXCIpPC9sYWJlbD5cIlxuXG5cdFx0XHRcdFx0dW5yZWFkID0gJydcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nXG5cdFx0XHRcdFx0ZWxzZSBpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PSB0cnVlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPidcblxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9PC9kaXY+XG5cdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN1Ym1pdF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N1Ym1pdF9kYXRlXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3VibWl0X2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZsb3dfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdGVwX2N1cnJlbnRfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXRlID09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIlxuXG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdGNjX3RhZyA9ICcnXG5cblx0XHRcdFx0XHRpZiBkb2MuY2NfY291bnQgPiAwXG5cdFx0XHRcdFx0XHRjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKVxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9I3tjY190YWd9PC9kaXY+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdGFydF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm15X2ZpbmlzaF9kYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5teV9maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MubXlfZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwia2V5d29yZHNcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jPy52YWx1ZXM/LnJlY29yZF9uZWVkICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT0gXCJ0cnVlXCJcblx0XHRcdFx0XHRcdGlmIGRvYz8uaXNfYXJjaGl2ZWRcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJZRVNcIilcblx0XHRcdFx0XHRcdHJldHVybiB0KFwiTk9cIilcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0ZG9tOiBkbyAtPlxuXHRcdFx0IyDmiYvmnLrkuIrkuI3mmL7npLrkuIDpobXmmL7npLrlpJrlsJHmnaHorrDlvZXpgInpoblcblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHQndHAnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCd0cGwnXG5cdFx0b3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcblx0XHRleHRyYUZpZWxkczogW1wiZm9ybVwiLCBcImZsb3dcIiwgXCJpbmJveF91c2Vyc1wiLCBcInN0YXRlXCIsIFwic3BhY2VcIiwgXCJhcHBsaWNhbnRcIiwgXCJmb3JtX3ZlcnNpb25cIixcblx0XHRcdFwiZmxvd192ZXJzaW9uXCIsIFwiaXNfY2NcIiwgXCJjY19jb3VudFwiLCBcImlzX3JlYWRcIiwgXCJjdXJyZW50X3N0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG5cdFx0bGVuZ3RoQ2hhbmdlOiB0cnVlLFxuXHRcdGxlbmd0aE1lbnU6IFsxMCwxNSwyMCwyNSw1MCwxMDBdLFxuXHRcdHBhZ2VMZW5ndGg6IDEwLFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdHNlYXJjaGluZzogdHJ1ZSxcblx0XHRyZXNwb25zaXZlOlxuXHRcdFx0ZGV0YWlsczogZmFsc2Vcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJJZCwgc3BhY2U6IHNwYWNlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdFx0dW5sZXNzIHNwYWNlX3VzZXJcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yXG5cdFx0cGFnaW5nVHlwZTogXCJudW1iZXJzXCJcblx0XHRcblx0XHQjIGdldFNvcnQ6IChzZWxlY3Rvciwgc29ydCkgLT4gXG5cdFx0IyBcdGNvbnNvbGUubG9nKCdzZWxlY3RvcjonLHNlbGVjdG9yKVxuXHRcdCMgXHRjb25zb2xlLmxvZygnc29ydDonLHNvcnQpXG5cdFx0IyBcdG5ld1NvcnQgPSBbXVxuXHRcdCMgXHRfLmVhY2ggc2VsZWN0b3IsICh2LCBrKSAtPlxuXHRcdCMgXHRcdG5ld1NvcnQucHVzaChbaywgMV0pXG5cdFx0IyBcdG5ld1NvcnQgPSBuZXdTb3J0LmNvbmNhdChzb3J0KVxuXHRcdCMgXHRjb25zb2xlLmxvZygnbmV3U29ydDonLG5ld1NvcnQpXG5cdFx0IyBcdHJldHVybiBuZXdTb3J0XG5cdH1cblxuXHRpZiBmbG93SWRcblx0XHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkXG5cblx0XHRvcHRpb25zLm5hbWUgPSBrZXlcblxuXHRcdFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkcyA9IGZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcy5mb3JFYWNoIChmKS0+XG5cdFx0XHRpZiBmLnR5cGUgIT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheVxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMucHVzaFxuXHRcdFx0XHRcdGRhdGE6IChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR0aXRsZTogdChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cblx0XHRcdFx0XHRcdHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge31cblxuXHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZXNbZi5jb2RlXVxuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggZi50eXBlXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ3VzZXInXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdncm91cCdcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5mdWxsbmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcblx0XHRcdFx0XHRcdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdjaGVja2JveCdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZSA9PSB0cnVlIHx8IHZhbHVlID09ICd0cnVlJ1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcblx0XHRcdFx0XHRcdFx0d2hlbiAnb2RhdGEnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdGlmIF8uaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlWydAbGFiZWwnXVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblxuXG5cdHJldHVybiBvcHRpb25zO1xuXG5cbiMg5aaC5p6cY29sdW1uc+acieWKoOWHj++8jOivt+S/ruaUuVRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucyDlh73mlbBcbmluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyID0gKGZsb3dJZCwgZmllbGRzKS0+XG5cdG9wdGlvbnMgPSB7XG5cdFx0bmFtZTogXCJpbnN0YW5jZV90YXNrc1wiLFxuXHRcdGNvbGxlY3Rpb246IGRiLmluc3RhbmNlX3Rhc2tzLFxuXHRcdHB1YjogXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsXG5cdFx0b25VbmxvYWQ6ICgpLT5cblx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXG5cdFx0ZHJhd0NhbGxiYWNrOiAoc2V0dGluZ3MpLT5cblx0XHRcdGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIilcblx0XHRcdGlmIGVtcHR5VGQubGVuZ3RoXG5cdFx0XHRcdGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiXG5cdFx0XHRpZiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkgLT5cblx0XHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApXG5cblx0XHRcdHRpdGxlID0gdCBcInBhZ2VyX2lucHV0X2hpbnRcIlxuXHRcdFx0ZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpXG5cdFx0XHRlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrIC0+XG5cdFx0XHRcdGlmICEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoXG5cdFx0XHRcdFx0aW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjIwcHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTZweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKVxuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKS5hcHBlbmQgaW5wdXRcblx0XHRcdFx0XHRnb1BhZ2UgPSAoaW5kZXgpLT5cblx0XHRcdFx0XHRcdGlmIGluZGV4ID4gMFxuXHRcdFx0XHRcdFx0XHRwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpXG5cdFx0XHRcdFx0XHRcdGlmIGluZGV4ID4gcGFnZXNcblx0XHRcdFx0XHRcdFx0XHQjIOmhteeggei2heWHuue0ouW8leaXtui3s+i9rOWIsOacgOWQjuS4gOmhtVxuXHRcdFx0XHRcdFx0XHRcdGluZGV4ID0gcGFnZXNcblx0XHRcdFx0XHRcdFx0aW5kZXgtLVxuXHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpXG5cdFx0XHRcdFx0aW5wdXQuYmx1ciAoZSktPlxuXHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2Vcblx0XHRcdFx0XHRcdCQodGhpcykucGFyZW50KCkuaHRtbCAnLi4uJ1xuXHRcdFx0XHRcdGlucHV0LmtleWRvd24gKGUpLT5cblx0XHRcdFx0XHRcdGlmKGUua2V5Q29kZS50b1N0cmluZygpID09IFwiMTNcIilcblx0XHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXG5cdFx0Y3JlYXRlZFJvdzogKHJvdywgZGF0YSwgZGF0YUluZGV4KSAtPlxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIGRhdGEuaW5zdGFuY2UgPT0gRmxvd1JvdXRlci5jdXJyZW50KCkucGFyYW1zLmluc3RhbmNlSWRcblx0XHRcdFx0XHRyb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKVxuXHRcdGNvbHVtbnM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJfaWRcIixcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRtb2RpZmllZFN0cmluZyA9IG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2MubW9kaWZpZWRcblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pbnN0YW5jZV9zdGF0ZSAhPSAnZHJhZnQnXG5cdFx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZFxuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ291dGJveCdcblx0XHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLnN1Ym1pdF9kYXRlIHx8IGRvYy5tb2RpZmllZFxuXG5cdFx0XHRcdFx0bW9kaWZpZWRGcm9tTm93ID0gU3RlZWRvcy5tb21lbnRSZWFjdGl2ZUZyb21Ob3cobW9kaWZpZWQpO1xuXHRcdFx0XHRcdGZsb3dfbmFtZSA9IGRvYy5mbG93X25hbWVcblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLnR5cGUgPT0gJ2NjJyAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2Muc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiBkb2Muc3RlcF9uYW1lXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLnN0ZXBfbmFtZX0pPC9zcGFuPjwvZGl2PlwiXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PC9kaXY+XCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWUgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lfSkgKyBcIik8L2xhYmVsPlwiXG5cblx0XHRcdFx0XHR1bnJlYWQgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPidcblx0XHRcdFx0XHRlbHNlIGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09IHRydWVcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+J1xuXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5pbnN0YW5jZV9uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj4je2RvYy5hcHBsaWNhbnRfbmFtZX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtZGV0YWlsJz4je3N0ZXBfY3VycmVudF9uYW1lX3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPScje21vZGlmaWVkU3RyaW5nfSc+I3ttb2RpZmllZEZyb21Ob3d9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImluc3RhbmNlX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0Y2NfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0IyDlvZPliY3nlKjmiLflnKhjYyB1c2Vy5Lit77yM5L2G5piv5LiN5ZyoaW5ib3ggdXNlcnPml7bmiY3mmL7npLon5Lyg6ZiFJ+aWh+Wtl1xuXHRcdFx0XHRcdGlmIGRvYy5pc19jYyAmJiAhZG9jLmluYm94X3VzZXJzPy5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiXG5cblx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRpZiBkb2MuYWdlbnRfdXNlcl9uYW1lXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eVZhbHVlID0gZG9jLnZhbHVlcz8ucHJpb3JpdHlcblx0XHRcdFx0XHRzd2l0Y2ggcHJpb3JpdHlWYWx1ZVxuXHRcdFx0XHRcdFx0d2hlbiBcIueJueaApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIue0p+aApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLlip7mlodcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIlxuXHRcdFx0XHRcdGlmIHByaW9yaXR5SWNvbkNsYXNzXG5cdFx0XHRcdFx0XHRpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS0je3ByaW9yaXR5SWNvbkNsYXNzfVwiXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgI3tpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzfSc+I3tkb2MuaW5zdGFuY2VfbmFtZX0je2NjX3ZpZXd9I3thZ2VudF92aWV3fTwvZGl2PlxuXHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN1Ym1pdF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJmbG93X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3RlcF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0ZXBfY3VycmVudF9uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2MuaW5zdGFuY2Vfc3RhdGUgPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0XHRcdFx0anVkZ2UgPSBkb2MuanVkZ2UgfHwgXCJhcHByb3ZlZFwiXG5cblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdGNjX3RhZyA9ICcnXG5cblx0XHRcdFx0XHRpZiBkb2MuY2NfY291bnQgPiAwXG5cdFx0XHRcdFx0XHRjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKVxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9I3tjY190YWd9PC9kaXY+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdGFydF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZpbmlzaF9kYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MuZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwia2V5d29yZHNcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jPy52YWx1ZXM/LnJlY29yZF9uZWVkICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT0gXCJ0cnVlXCJcblx0XHRcdFx0XHRcdGlmIGRvYz8uaXNfYXJjaGl2ZWRcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJZRVNcIilcblx0XHRcdFx0XHRcdHJldHVybiB0KFwiTk9cIilcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0ZG9tOiBkbyAtPlxuXHRcdFx0IyDmiYvmnLrkuIrkuI3mmL7npLrkuIDpobXmmL7npLrlpJrlsJHmnaHorrDlvZXpgInpoblcblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHQndHAnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCd0cGwnXG5cdFx0b3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcblx0XHRleHRyYUZpZWxkczogW1wiaW5zdGFuY2VcIiwgXCJmb3JtXCIsIFwiZmxvd1wiLCBcImluYm94X3VzZXJzXCIsIFwiaW5zdGFuY2Vfc3RhdGVcIiwgXCJzcGFjZVwiLCBcImFwcGxpY2FudFwiLCBcImZvcm1fdmVyc2lvblwiLFxuXHRcdFx0XCJmbG93X3ZlcnNpb25cIiwgXCJ0eXBlXCIsIFwiaXNfcmVhZFwiLCBcInN0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG5cdFx0bGVuZ3RoQ2hhbmdlOiB0cnVlLFxuXHRcdGxlbmd0aE1lbnU6IFsxMCwxNSwyMCwyNSw1MCwxMDBdLFxuXHRcdHBhZ2VMZW5ndGg6IDEwLFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdHNlYXJjaGluZzogdHJ1ZSxcblx0XHRyZXNwb25zaXZlOlxuXHRcdFx0ZGV0YWlsczogZmFsc2Vcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJJZCwgc3BhY2U6IHNwYWNlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdFx0dW5sZXNzIHNwYWNlX3VzZXJcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yXG5cdFx0cGFnaW5nVHlwZTogXCJudW1iZXJzXCJcblxuXHR9XG5cblx0aWYgZmxvd0lkXG5cdFx0a2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZFxuXG5cdFx0b3B0aW9ucy5uYW1lID0ga2V5XG5cblx0XHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzLmZpZWxkcyA9IGZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzXG5cblx0XHRpbnNfZmllbGRzLmZvckVhY2ggKGYpLT5cblx0XHRcdGlmIGYudHlwZSAhPSAndGFibGUnICYmIGYuaXNfbGlzdF9kaXNwbGF5XG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucy5wdXNoXG5cdFx0XHRcdFx0ZGF0YTogKGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblxuXHRcdFx0XHRcdFx0dmFsdWVzID0gZG9jLnZhbHVlcyB8fCB7fVxuXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdXG5cblx0XHRcdFx0XHRcdHN3aXRjaCBmLnR5cGVcblx0XHRcdFx0XHRcdFx0d2hlbiAndXNlcidcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5uYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2dyb3VwJ1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWU/LmZ1bGxuYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2RhdGUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlVGltZSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlID09IHRydWUgfHwgdmFsdWUgPT0gJ3RydWUnXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuXHRcdFx0XHRcdFx0XHR3aGVuICdvZGF0YSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddXG5cblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZVxuXG5cblx0cmV0dXJuIG9wdGlvbnM7XG5cblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIoKVxuXHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzID0gbmV3IFRhYnVsYXIuVGFibGUgaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoKVxuXHRUYWJ1bGFyVGFibGVzLmluYm94X2luc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKFwiaW5ib3hcIilcblx0VGFidWxhclRhYmxlcy5vdXRib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJvdXRib3hcIilcblxuXG5HZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyA9IChib3gsIGZsb3dJZCwgZmllbGRzKS0+XG5cdGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWRcblx0aWYgYm94ID09IFwiaW5ib3hcIlxuXHRcdG9wdGlvbnMgPSBfZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpXG5cdGVsc2UgaWYgYm94ID09IFwib3V0Ym94XCJcblx0XHRvcHRpb25zID0gX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyhmbG93SWQsIGZpZWxkcylcblx0ZWxzZVxuXHRcdG9wdGlvbnMgPSBpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKVxuXHRcdGlmICFmbG93SWRcblx0XHRcdG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCJcblx0aWYgZmxvd0lkXG5cdFx0b3B0aW9ucy5uYW1lID0ga2V5XG5cdHJldHVybiBvcHRpb25zXG5cbl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0gaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpXG5cblx0aWYgIWZsb3dJZFxuXHRcdG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCJcblxuXHRvcHRpb25zLm9yZGVyID0gW1s4LCBcImRlc2NcIl1dXG5cblx0b3B0aW9ucy5nZXRTb3J0ID0gKHNlbGVjdG9yLCBzb3J0KSAtPiBcblx0XHRjb25zb2xlLmxvZygnaW5ib3hfaW5zdGFuY2VzOicsc29ydClcblx0XHRyZXR1cm4gc29ydFxuXG5cdHJldHVybiBvcHRpb25zXG5cbl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSAoZmxvd0lkLCBmaWVsZHMpLT5cblx0b3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKVxuXG5cdGlmICFmbG93SWRcblx0XHRvcHRpb25zLm5hbWUgPSBcIm91dGJveF9pbnN0YW5jZXNcIlxuXG5cdG9wdGlvbnMub3JkZXIgPSBbWzksIC0xXV1cblxuXHRvcHRpb25zLmdldFNvcnQgPSAoc2VsZWN0b3IsIHNvcnQpIC0+IFxuXHRcdGNvbnNvbGUubG9nKCdvdXRib3hfaW5zdGFuY2VzOicsc29ydClcblx0XHQjIG5ld1NvcnQgPSBbIFxuXHRcdCMgXHRbJ3NwYWNlJywgMV0sXG5cdFx0IyBcdFsnaGFuZGxlcicsIDFdLFxuXHRcdCMgXHRbJ2lzX2ZpbmlzaGVkJywgMV0sXG5cdFx0IyBdXG5cdFx0IyBuZXdTb3J0ID0gbmV3U29ydC5jb25jYXQoc29ydClcblx0XHQjIHJldHVybiBuZXdTb3J0XG5cdFx0cmV0dXJuIHNvcnRcblxuXHRyZXR1cm4gb3B0aW9uc1xuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0VGFidWxhclRhYmxlcy5mbG93SW5zdGFuY2VzID0gbmV3IFJlYWN0aXZlVmFyKClcblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRUcmFja2VyLmF1dG9ydW4gKGMpIC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmICFTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9ICdkcmFmdCdcblx0XHRcdFx0TWV0ZW9yLmNhbGwgXCJuZXdJbnN0YW5jZXNMaXN0VGFidWxhclwiLCBTZXNzaW9uLmdldChcImJveFwiKSwgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIiksIChlcnJvciwgcmVzdWx0KSAtPlxuXHRcdFx0XHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyIFNlc3Npb24uZ2V0KFwiYm94XCIpLCBTZXNzaW9uLmdldChcImZsb3dJZFwiKSwgcmVzdWx0XG5cdFx0XHRcdFx0VGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fY2hhbmdlT3JkZXIoKVxuXG5cbm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyID0gKGJveCwgZmxvd0lkLCBmaWVsZHMpLT5cblx0aWYgIWZpZWxkc1xuXHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQ6IGZsb3dJZH0sIHtmaWVsZHM6IHtmb3JtOiAxfX0pXG5cdFx0ZmllbGRzID0gZGIuZm9ybXMuZmluZE9uZSh7IF9pZDogZmxvdz8uZm9ybSB9LCB7IGZpZWxkczogeyAnY3VycmVudC5maWVsZHMnOiAxIH0gfSk/LmN1cnJlbnQ/LmZpZWxkc1xuXG5cdGZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIGZpZWxkc1xuXG5cdGlmIGZpZWxkcz8uZmlsdGVyUHJvcGVydHkoXCJpc19saXN0X2Rpc3BsYXlcIiwgdHJ1ZSk/Lmxlbmd0aCA+IDBcblx0XHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgYm94ICsgZmxvd0lkXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMuc2V0KG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKVxuXHRcdGVsc2Vcblx0XHRcdG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpXG5cdFx0Y29uc29sZS5sb2cgXCJuZXcgVGFidWxhclRhYmxlcyBcIiwga2V5XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRNZXRlb3IubWV0aG9kc1xuXHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyOiAoYm94LCBmbG93SWQpLT5cblx0XHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyKGJveCwgZmxvd0lkKVxuXG5cdFx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkOiBmbG93SWR9LCB7ZmllbGRzOiB7Zm9ybTogMX19KVxuXHRcdFx0ZmllbGRzID0gZGIuZm9ybXMuZmluZE9uZSh7IF9pZDogZmxvdz8uZm9ybSB9LCB7IGZpZWxkczogeyAnY3VycmVudC5maWVsZHMnOiAxIH0gfSk/LmN1cnJlbnQ/LmZpZWxkc1xuXHRcdFx0cmV0dXJuIGZpZWxkc1xuXG5cbiIsInZhciBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucywgX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zLCBfZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zLCBfaGFuZGxlTGlzdEZpZWxkcywgaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIsIGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIsIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyLCB1cGRhdGVUYWJ1bGFyVGl0bGU7XG5cblN0ZWVkb3Muc3Vic1tcIkluc3RhbmNlVGFidWxhclwiXSA9IG5ldyBTdWJzTWFuYWdlcigpO1xuXG5faGFuZGxlTGlzdEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcykge1xuICB2YXIgaW5zX2ZpZWxkcztcbiAgaW5zX2ZpZWxkcyA9IG5ldyBBcnJheSgpO1xuICBpZiAoZmllbGRzICE9IG51bGwpIHtcbiAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGYudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmICE9IG51bGwgPyAocmVmID0gZi5maWVsZHMpICE9IG51bGwgPyByZWYuZm9yRWFjaChmdW5jdGlvbihmMSkge1xuICAgICAgICAgIHJldHVybiBpbnNfZmllbGRzLnB1c2goZjEpO1xuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnNfZmllbGRzLnB1c2goZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGluc19maWVsZHM7XG59O1xuXG51cGRhdGVUYWJ1bGFyVGl0bGUgPSBmdW5jdGlvbigpIHt9O1xuXG5pbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIGluc19maWVsZHMsIGtleSwgb3B0aW9ucztcbiAgb3B0aW9ucyA9IHtcbiAgICBuYW1lOiBcImluc3RhbmNlc1wiLFxuICAgIGNvbGxlY3Rpb246IGRiLmluc3RhbmNlcyxcbiAgICBwdWI6IFwiaW5zdGFuY2VfdGFidWxhclwiLFxuICAgIG9uVW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgfSxcbiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKHNldHRpbmdzKSB7XG4gICAgICB2YXIgZWxsaXBzaXNMaW5rLCBlbXB0eVRkLCB0aXRsZTtcbiAgICAgIGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIik7XG4gICAgICBpZiAoZW1wdHlUZC5sZW5ndGgpIHtcbiAgICAgICAgZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCI7XG4gICAgICB9XG4gICAgICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKTtcbiAgICAgIH1cbiAgICAgIHRpdGxlID0gdChcInBhZ2VyX2lucHV0X2hpbnRcIik7XG4gICAgICBlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJyk7XG4gICAgICByZXR1cm4gZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdvUGFnZSwgaW5wdXQ7XG4gICAgICAgIGlmICghJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aCkge1xuICAgICAgICAgIGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jyk7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMjBweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpO1xuICAgICAgICAgICQodGhpcykuZW1wdHkoKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgIGdvUGFnZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcGFnZXM7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgIHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IHBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBwYWdlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlucHV0LmJsdXIoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLnBhcmVudCgpLmh0bWwoJy4uLicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbnB1dC5rZXlkb3duKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUudG9TdHJpbmcoKSA9PT0gXCIxM1wiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlZFJvdzogZnVuY3Rpb24ocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgaWYgKGRhdGEuX2lkID09PSBGbG93Um91dGVyLmN1cnJlbnQoKS5wYXJhbXMuaW5zdGFuY2VJZCkge1xuICAgICAgICAgIHJldHVybiByb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBkYXRhOiBcIl9pZFwiLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGZsb3dfbmFtZSwgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcywgbW9kaWZpZWQsIG1vZGlmaWVkRnJvbU5vdywgbW9kaWZpZWRTdHJpbmcsIHByaW9yaXR5SWNvbiwgcHJpb3JpdHlJY29uQ2xhc3MsIHByaW9yaXR5VmFsdWUsIHJlZiwgcmVmMSwgc3RlcF9jdXJyZW50X25hbWVfdmlldywgdW5yZWFkO1xuICAgICAgICAgIG1vZGlmaWVkU3RyaW5nID0gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgbW9kaWZpZWQgPSBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5zdGF0ZSAhPT0gJ2RyYWZ0Jykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ291dGJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLnN1Ym1pdF9kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG4gICAgICAgICAgZmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZTtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmlzX2NjICYmICEoKHJlZiA9IGRvYy5pbmJveF91c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8c3Bhbj4oXCIgKyBkb2MuY3VycmVudF9zdGVwX25hbWUgKyBcIik8L3NwYW4+PC9kaXY+XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSAhPT0gJ2RyYWZ0JyAmJiBkb2MuY3VycmVudF9zdGVwX25hbWUpIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLmN1cnJlbnRfc3RlcF9uYW1lICsgXCIpPC9zcGFuPjwvZGl2PlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbiA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5VmFsdWUgPSAocmVmMSA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYxLnByaW9yaXR5IDogdm9pZCAwO1xuICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcIueJueaApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIue0p+aApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLlip7mlodcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmlvcml0eUljb25DbGFzcykge1xuICAgICAgICAgICAgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktXCIgKyBwcmlvcml0eUljb25DbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPlwiICsgdW5yZWFkICsgXCI8L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lIFwiICsgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyArIFwiJz5cIiArIGRvYy5uYW1lICsgY2NfdmlldyArIGFnZW50X3ZpZXcgKyBcIlxcblx0PHNwYW4+XCIgKyBkb2MuYXBwbGljYW50X25hbWUgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPlwiICsgc3RlcF9jdXJyZW50X25hbWVfdmlldyArIFwiXFxuXHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPSdcIiArIG1vZGlmaWVkU3RyaW5nICsgXCInPlwiICsgbW9kaWZpZWRGcm9tTm93ICsgXCI8L3NwYW4+XFxuPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm5hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhZ2VudF92aWV3LCBjY192aWV3LCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCByZWYxLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgY2NfdmlldyA9IFwiXCI7XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5pc19jYyAmJiAhKChyZWYgPSBkb2MuaW5ib3hfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSA6IHZvaWQgMCkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSkge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlWYWx1ZSA9IChyZWYxID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZjEucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLm5hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiPC9kaXY+XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3VibWl0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3VibWl0X2RhdGVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLnN1Ym1pdF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmxvd19uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgY2NfdGFnLCBqdWRnZSwgc3RlcF9jdXJyZW50X25hbWU7XG4gICAgICAgICAgaWYgKGRvYy5zdGF0ZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAganVkZ2UgPSBkb2MuZmluYWxfZGVjaXNpb24gfHwgXCJhcHByb3ZlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5jdXJyZW50X3N0ZXBfbmFtZSB8fCAnJztcbiAgICAgICAgICBjY190YWcgPSAnJztcbiAgICAgICAgICBpZiAoZG9jLmNjX2NvdW50ID4gMCkge1xuICAgICAgICAgICAgY2NfdGFnID0gVEFQaTE4bi5fXygnY2NfdGFnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInN0ZXAtY3VycmVudC1zdGF0ZSBcIiArIGp1ZGdlICsgXCJcXFwiPlwiICsgc3RlcF9jdXJyZW50X25hbWUgKyBjY190YWcgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3RhcnRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdGFydF9kYXRlXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5zdGFydF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJteV9maW5pc2hfZGF0ZVwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5teV9maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MubXlfZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwia2V5d29yZHNcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJpc19hcmNoaXZlZFwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICBpZiAoKGRvYyAhPSBudWxsID8gKHJlZiA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYucmVjb3JkX25lZWQgOiB2b2lkIDAgOiB2b2lkIDApICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwgPyBkb2MuaXNfYXJjaGl2ZWQgOiB2b2lkIDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQoXCJZRVNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdChcIk5PXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH1cbiAgICBdLFxuICAgIGRvbTogKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICByZXR1cm4gJ3RwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAndHBsJztcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIG9yZGVyOiBbWzQsIFwiZGVzY1wiXV0sXG4gICAgZXh0cmFGaWVsZHM6IFtcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJzdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsIFwiZmxvd192ZXJzaW9uXCIsIFwiaXNfY2NcIiwgXCJjY19jb3VudFwiLCBcImlzX3JlYWRcIiwgXCJjdXJyZW50X3N0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG4gICAgbGVuZ3RoQ2hhbmdlOiB0cnVlLFxuICAgIGxlbmd0aE1lbnU6IFsxMCwgMTUsIDIwLCAyNSwgNTAsIDEwMF0sXG4gICAgcGFnZUxlbmd0aDogMTAsXG4gICAgaW5mbzogZmFsc2UsXG4gICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgIGRldGFpbHM6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgIGNoYW5nZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgdXNlcklkKSB7XG4gICAgICB2YXIgcmVmLCBzcGFjZSwgc3BhY2VfdXNlcjtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSBzZWxlY3Rvci5zcGFjZTtcbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgaWYgKChzZWxlY3RvciAhPSBudWxsID8gKHJlZiA9IHNlbGVjdG9yLiRhbmQpICE9IG51bGwgPyByZWYubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghc3BhY2VfdXNlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9LFxuICAgIHBhZ2luZ1R5cGU6IFwibnVtYmVyc1wiXG4gIH07XG4gIGlmIChmbG93SWQpIHtcbiAgICBrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkO1xuICAgIG9wdGlvbnMubmFtZSA9IGtleTtcbiAgICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgaW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzKFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkcyk7XG4gICAgaW5zX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgIGlmIChmLnR5cGUgIT09ICd0YWJsZScgJiYgZi5pc19saXN0X2Rpc3BsYXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBmLm5hbWUgfHwgZi5jb2RlLFxuICAgICAgICAgIHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgICAgdmFyIHZhbHVlLCB2YWx1ZXM7XG4gICAgICAgICAgICB2YWx1ZXMgPSBkb2MudmFsdWVzIHx8IHt9O1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZi5jb2RlXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLm5hbWUgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5mdWxsbmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnb2RhdGEnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgaW5zX2ZpZWxkcywga2V5LCBvcHRpb25zO1xuICBvcHRpb25zID0ge1xuICAgIG5hbWU6IFwiaW5zdGFuY2VfdGFza3NcIixcbiAgICBjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZV90YXNrcyxcbiAgICBwdWI6IFwiaW5zdGFuY2VfdGFza3NfdGFidWxhclwiLFxuICAgIG9uVW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgfSxcbiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKHNldHRpbmdzKSB7XG4gICAgICB2YXIgZWxsaXBzaXNMaW5rLCBlbXB0eVRkLCB0aXRsZTtcbiAgICAgIGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIik7XG4gICAgICBpZiAoZW1wdHlUZC5sZW5ndGgpIHtcbiAgICAgICAgZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCI7XG4gICAgICB9XG4gICAgICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKTtcbiAgICAgIH1cbiAgICAgIHRpdGxlID0gdChcInBhZ2VyX2lucHV0X2hpbnRcIik7XG4gICAgICBlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJyk7XG4gICAgICByZXR1cm4gZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdvUGFnZSwgaW5wdXQ7XG4gICAgICAgIGlmICghJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aCkge1xuICAgICAgICAgIGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jyk7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMjBweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpO1xuICAgICAgICAgICQodGhpcykuZW1wdHkoKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgIGdvUGFnZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcGFnZXM7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgIHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IHBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBwYWdlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlucHV0LmJsdXIoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLnBhcmVudCgpLmh0bWwoJy4uLicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbnB1dC5rZXlkb3duKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUudG9TdHJpbmcoKSA9PT0gXCIxM1wiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlZFJvdzogZnVuY3Rpb24ocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgaWYgKGRhdGEuaW5zdGFuY2UgPT09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInNlbGVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwiX2lkXCIsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWdlbnRfdmlldywgY2NfdmlldywgZmxvd19uYW1lLCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBtb2RpZmllZCwgbW9kaWZpZWRGcm9tTm93LCBtb2RpZmllZFN0cmluZywgcHJpb3JpdHlJY29uLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgbW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICBtb2RpZmllZCA9IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmluc3RhbmNlX3N0YXRlICE9PSAnZHJhZnQnKSB7XG4gICAgICAgICAgICBtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnb3V0Ym94Jykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG4gICAgICAgICAgZmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZTtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLnR5cGUgPT09ICdjYycgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLnN0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvYy5zdGVwX25hbWUpIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLnN0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjwvZGl2PlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb24gPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZiA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLmluc3RhbmNlX25hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiXFxuXHQ8c3Bhbj5cIiArIGRvYy5hcHBsaWNhbnRfbmFtZSArIFwiPC9zcGFuPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLWRldGFpbCc+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ICsgXCJcXG5cdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9J1wiICsgbW9kaWZpZWRTdHJpbmcgKyBcIic+XCIgKyBtb2RpZmllZEZyb21Ob3cgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiaW5zdGFuY2VfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MsIHByaW9yaXR5SWNvbkNsYXNzLCBwcmlvcml0eVZhbHVlLCByZWYsIHJlZjEsIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcsIHVucmVhZDtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmlzX2NjICYmICEoKHJlZiA9IGRvYy5pbmJveF91c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZjEgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmMS5wcmlvcml0eSA6IHZvaWQgMDtcbiAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCLnibnmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLntKfmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi5Yqe5paHXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpb3JpdHlJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LVwiICsgcHJpb3JpdHlJY29uQ2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz5cIiArIHVucmVhZCArIFwiPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSBcIiArIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgKyBcIic+XCIgKyBkb2MuaW5zdGFuY2VfbmFtZSArIGNjX3ZpZXcgKyBhZ2VudF92aWV3ICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3VibWl0X2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJmbG93X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdGVwX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgY2NfdGFnLCBqdWRnZSwgc3RlcF9jdXJyZW50X25hbWU7XG4gICAgICAgICAgaWYgKGRvYy5pbnN0YW5jZV9zdGF0ZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAganVkZ2UgPSBkb2MuanVkZ2UgfHwgXCJhcHByb3ZlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5zdGVwX25hbWUgfHwgJyc7XG4gICAgICAgICAgY2NfdGFnID0gJyc7XG4gICAgICAgICAgaWYgKGRvYy5jY19jb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNjX3RhZyA9IFRBUGkxOG4uX18oJ2NjX3RhZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJzdGVwLWN1cnJlbnQtc3RhdGUgXCIgKyBqdWRnZSArIFwiXFxcIj5cIiArIHN0ZXBfY3VycmVudF9uYW1lICsgY2NfdGFnICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19tb2RpZmllZFwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN0YXJ0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RhcnRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3RhcnRfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2Muc3RhcnRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmluaXNoX2RhdGVcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLmZpbmlzaF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImtleXdvcmRzXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgaWYgKChkb2MgIT0gbnVsbCA/IChyZWYgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmLnJlY29yZF9uZWVkIDogdm9pZCAwIDogdm9pZCAwKSAmJiBkb2MudmFsdWVzLnJlY29yZF9uZWVkID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsID8gZG9jLmlzX2FyY2hpdmVkIDogdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0KFwiWUVTXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHQoXCJOT1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICd0cCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ3RwbCc7XG4gICAgICB9XG4gICAgfSkoKSxcbiAgICBvcmRlcjogW1s0LCBcImRlc2NcIl1dLFxuICAgIGV4dHJhRmllbGRzOiBbXCJpbnN0YW5jZVwiLCBcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJpbnN0YW5jZV9zdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsIFwiZmxvd192ZXJzaW9uXCIsIFwidHlwZVwiLCBcImlzX3JlYWRcIiwgXCJzdGVwX25hbWVcIiwgXCJ2YWx1ZXNcIiwgXCJrZXl3b3Jkc1wiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwiZmxvd19uYW1lXCIsIFwiaXNfaGlkZGVuXCIsIFwiYWdlbnRfdXNlcl9uYW1lXCJdLFxuICAgIGxlbmd0aENoYW5nZTogdHJ1ZSxcbiAgICBsZW5ndGhNZW51OiBbMTAsIDE1LCAyMCwgMjUsIDUwLCAxMDBdLFxuICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgIGluZm86IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiB7XG4gICAgICBkZXRhaWxzOiBmYWxzZVxuICAgIH0sXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBjaGFuZ2VTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IsIHVzZXJJZCkge1xuICAgICAgdmFyIHJlZiwgc3BhY2UsIHNwYWNlX3VzZXI7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gc2VsZWN0b3Iuc3BhY2U7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHNwYWNlOiBzcGFjZVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXNwYWNlX3VzZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfSxcbiAgICBwYWdpbmdUeXBlOiBcIm51bWJlcnNcIlxuICB9O1xuICBpZiAoZmxvd0lkKSB7XG4gICAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZDtcbiAgICBvcHRpb25zLm5hbWUgPSBrZXk7XG4gICAgVGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgaW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzKFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzKTtcbiAgICBpbnNfZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgaWYgKGYudHlwZSAhPT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgIGRhdGE6IGYubmFtZSB8fCBmLmNvZGUsXG4gICAgICAgICAgdGl0bGU6IHQoZi5uYW1lIHx8IGYuY29kZSksXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUsIHZhbHVlcztcbiAgICAgICAgICAgIHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge307XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdO1xuICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAndXNlcic6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUubmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmZ1bGxuYW1lIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdvZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgVGFidWxhclRhYmxlcy5pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZShpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKCkpO1xuICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzID0gbmV3IFRhYnVsYXIuVGFibGUoaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoKSk7XG4gIFRhYnVsYXJUYWJsZXMuaW5ib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUoR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJpbmJveFwiKSk7XG4gIHJldHVybiBUYWJ1bGFyVGFibGVzLm91dGJveF9pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZShHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhcIm91dGJveFwiKSk7XG59KTtcblxuR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMgPSBmdW5jdGlvbihib3gsIGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBrZXksIG9wdGlvbnM7XG4gIGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWQ7XG4gIGlmIChib3ggPT09IFwiaW5ib3hcIikge1xuICAgIG9wdGlvbnMgPSBfZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJvdXRib3hcIikge1xuICAgIG9wdGlvbnMgPSBfZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zKGZsb3dJZCwgZmllbGRzKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcyk7XG4gICAgaWYgKCFmbG93SWQpIHtcbiAgICAgIG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCI7XG4gICAgfVxuICB9XG4gIGlmIChmbG93SWQpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBrZXk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5fZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgb3B0aW9ucztcbiAgb3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKTtcbiAgaWYgKCFmbG93SWQpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBcImluYm94X2luc3RhbmNlc1wiO1xuICB9XG4gIG9wdGlvbnMub3JkZXIgPSBbWzgsIFwiZGVzY1wiXV07XG4gIG9wdGlvbnMuZ2V0U29ydCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBzb3J0KSB7XG4gICAgY29uc29sZS5sb2coJ2luYm94X2luc3RhbmNlczonLCBzb3J0KTtcbiAgICByZXR1cm4gc29ydDtcbiAgfTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5fZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcyk7XG4gIGlmICghZmxvd0lkKSB7XG4gICAgb3B0aW9ucy5uYW1lID0gXCJvdXRib3hfaW5zdGFuY2VzXCI7XG4gIH1cbiAgb3B0aW9ucy5vcmRlciA9IFtbOSwgLTFdXTtcbiAgb3B0aW9ucy5nZXRTb3J0ID0gZnVuY3Rpb24oc2VsZWN0b3IsIHNvcnQpIHtcbiAgICBjb25zb2xlLmxvZygnb3V0Ym94X2luc3RhbmNlczonLCBzb3J0KTtcbiAgICByZXR1cm4gc29ydDtcbiAgfTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIFRhYnVsYXJUYWJsZXMuZmxvd0luc3RhbmNlcyA9IG5ldyBSZWFjdGl2ZVZhcigpO1xufVxuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFRyYWNrZXIuYXV0b3J1bihmdW5jdGlvbihjKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAhU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJmbG93SWRcIikgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT09ICdkcmFmdCcpIHtcbiAgICAgICAgcmV0dXJuIE1ldGVvci5jYWxsKFwibmV3SW5zdGFuY2VzTGlzdFRhYnVsYXJcIiwgU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIoU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCByZXN1bHQpO1xuICAgICAgICAgIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll9jaGFuZ2VPcmRlcigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufSk7XG5cbm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyID0gZnVuY3Rpb24oYm94LCBmbG93SWQsIGZpZWxkcykge1xuICB2YXIgZmxvdywga2V5LCByZWYsIHJlZjEsIHJlZjI7XG4gIGlmICghZmllbGRzKSB7XG4gICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmbG93SWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgZm9ybTogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZpZWxkcyA9IChyZWYgPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgIF9pZDogZmxvdyAhPSBudWxsID8gZmxvdy5mb3JtIDogdm9pZCAwXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgICdjdXJyZW50LmZpZWxkcyc6IDFcbiAgICAgIH1cbiAgICB9KSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmN1cnJlbnQpICE9IG51bGwgPyByZWYxLmZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgfVxuICBmaWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyhmaWVsZHMpO1xuICBpZiAoKGZpZWxkcyAhPSBudWxsID8gKHJlZjIgPSBmaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc19saXN0X2Rpc3BsYXlcIiwgdHJ1ZSkpICE9IG51bGwgPyByZWYyLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGJveCArIGZsb3dJZDtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMuc2V0KG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGUubG9nKFwibmV3IFRhYnVsYXJUYWJsZXMgXCIsIGtleSk7XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLm1ldGhvZHMoe1xuICAgIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyOiBmdW5jdGlvbihib3gsIGZsb3dJZCkge1xuICAgICAgdmFyIGZpZWxkcywgZmxvdywgcmVmLCByZWYxO1xuICAgICAgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIoYm94LCBmbG93SWQpO1xuICAgICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGZsb3dJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmb3JtOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZmllbGRzID0gKHJlZiA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGZsb3cgIT0gbnVsbCA/IGZsb3cuZm9ybSA6IHZvaWQgMFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAnY3VycmVudC5maWVsZHMnOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY3VycmVudCkgIT0gbnVsbCA/IHJlZjEuZmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gIH0pO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jaGVja05wbS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9saWIvVVJJLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvaW5zdGFuY2VfdGFza3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvYXV0aF90b2tlbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC9saWIvaW5zdGFuY2VfcmVhZG9ubHlfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL2luc3RhbmNlX3JlYWRvbmx5X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L2NsaWVudC9jb3JlZm9ybS9pbnB1dFR5cGVzL2NvcmVmb3JtLXRhYmxlL3N0ZWVkb3MtdGFibGUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oYW5kbGVyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL190cmFjZXNfaGFuZGxlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX2luc3RhbmNlX2F0dGFjaG1lbnRzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9faW5zdGFuY2Vfc2lnbl90ZXh0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9zaWduX3RleHQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9fdHJhY2VzX2hlbHAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oZWxwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX2luc3RhbmNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldFNwYWNlVXNlcnMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldEZvcm11bGFVc2VyT2JqZWN0cy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvaW5pdF9mb3JtdWxhX3ZhbHVlcy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvYXBpX3dvcmtmbG93X2ZvcndhcmQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvcm91dGVzL3Rlc3Rfd2ViaG9vay5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy90ZXN0X3dlYmhvb2suY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3NldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2dldF9pbnN0YW5jZV9kYXRhLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL3NhdmVfaW5zdGFuY2UuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvc2VydmVyL21ldGhvZHMvdHJhY2VfYXBwcm92ZV9jYy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mb3J3YXJkX2luc3RhbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2Nmc19pbnN0YW5jZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfYXBwcm92ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfcmV0dXJuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV9yZW1pbmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL25leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX251bWJlcl9ydWxlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvY2hlY2tfbWFpbl9hdHRhY2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9lZGl0X2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9zdGFydF9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV90cmFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX2JhdGNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9oaWRlX2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV92YWx1ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3JvdXRlcy9pbnN0YW5jZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvaW5zdGFuY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9yb3V0ZXMvc3RlZWRvc19jc3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL3N0ZWVkb3NfY3NzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9saWIvMV9mb3JtX2Zvcm11bGEuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19wb3NpdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9mbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZm9ybXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zvcm1zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RyYWZ0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV9kcmFmdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9mbG93LXRlbXBsYXRlL3dvcmtmbG93X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL2Zsb3ctdGVtcGxhdGUvd29ya2Zsb3dfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9zY2hlZHVsZS9hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc2NoZWR1bGUvYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvc2NoZWR1bGUvdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zY2hlZHVsZS90aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3RhYnVsYXIuY29mZmVlIl0sIm5hbWVzIjpbImNoZWNrTnBtVmVyc2lvbnMiLCJtb2R1bGUiLCJsaW5rIiwidiIsInJvb3QiLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiVVJJIiwicHVueWNvZGUiLCJJUHY2IiwiU2Vjb25kTGV2ZWxEb21haW5zIiwiU0xEIiwiX1VSSSIsInVybCIsImJhc2UiLCJfdXJsU3VwcGxpZWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJfYmFzZVN1cHBsaWVkIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwibG9jYXRpb24iLCJocmVmIiwiYWJzb2x1dGVUbyIsInZlcnNpb24iLCJwIiwicHJvdG90eXBlIiwiaGFzT3duIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJlc2NhcGVSZWdFeCIsInN0cmluZyIsInJlcGxhY2UiLCJnZXRUeXBlIiwidmFsdWUiLCJTdHJpbmciLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImlzQXJyYXkiLCJvYmoiLCJmaWx0ZXJBcnJheVZhbHVlcyIsImRhdGEiLCJsb29rdXAiLCJpIiwiX21hdGNoIiwidGVzdCIsInNwbGljZSIsImFycmF5Q29udGFpbnMiLCJsaXN0IiwiX3R5cGUiLCJtYXRjaCIsImFycmF5c0VxdWFsIiwib25lIiwidHdvIiwic29ydCIsImwiLCJ0cmltU2xhc2hlcyIsInRleHQiLCJ0cmltX2V4cHJlc3Npb24iLCJfcGFydHMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJob3N0bmFtZSIsInVybiIsInBvcnQiLCJwYXRoIiwicXVlcnkiLCJmcmFnbWVudCIsImR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyIsImVzY2FwZVF1ZXJ5U3BhY2UiLCJwcm90b2NvbF9leHByZXNzaW9uIiwiaWRuX2V4cHJlc3Npb24iLCJwdW55Y29kZV9leHByZXNzaW9uIiwiaXA0X2V4cHJlc3Npb24iLCJpcDZfZXhwcmVzc2lvbiIsImZpbmRfdXJpX2V4cHJlc3Npb24iLCJmaW5kVXJpIiwic3RhcnQiLCJlbmQiLCJ0cmltIiwiZGVmYXVsdFBvcnRzIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwid3MiLCJ3c3MiLCJpbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMiLCJkb21BdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlIiwibm9kZSIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJ0eXBlIiwiZXNjYXBlRm9yRHVtYkZpcmVmb3gzNiIsImVzY2FwZSIsInN0cmljdEVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZSIsImRlY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzbzg4NTkiLCJ1bmVzY2FwZSIsInVuaWNvZGUiLCJjaGFyYWN0ZXJzIiwicGF0aG5hbWUiLCJleHByZXNzaW9uIiwibWFwIiwicmVzZXJ2ZWQiLCJ1cm5wYXRoIiwiZW5jb2RlUXVlcnkiLCJlc2NhcGVkIiwiZGVjb2RlUXVlcnkiLCJlIiwiX3BhcnQiLCJnZW5lcmF0ZUFjY2Vzc29yIiwiX2dyb3VwIiwiYyIsImdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uIiwiX3NlcCIsIl9jb2RpbmdGdW5jTmFtZSIsIl9pbm5lckNvZGluZ0Z1bmNOYW1lIiwiYWN0dWFsQ29kaW5nRnVuYyIsInNlZ21lbnRzIiwic3BsaXQiLCJqb2luIiwiZGVjb2RlUGF0aCIsImRlY29kZVVyblBhdGgiLCJyZWNvZGVQYXRoIiwicmVjb2RlVXJuUGF0aCIsImVuY29kZVJlc2VydmVkIiwicGFyc2UiLCJwYXJ0cyIsInBvcyIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJwYXJzZUF1dGhvcml0eSIsInBhcnNlSG9zdCIsImJyYWNrZXRQb3MiLCJ0IiwiY2hhckF0IiwiZmlyc3RDb2xvbiIsImZpcnN0U2xhc2giLCJuZXh0Q29sb24iLCJwYXJzZVVzZXJpbmZvIiwibGFzdEluZGV4T2YiLCJzaGlmdCIsInBhcnNlUXVlcnkiLCJpdGVtcyIsInNwbGl0cyIsIm5hbWUiLCJwdXNoIiwiYnVpbGQiLCJidWlsZEF1dGhvcml0eSIsImJ1aWxkSG9zdCIsImJ1aWxkVXNlcmluZm8iLCJidWlsZFF1ZXJ5IiwidW5pcXVlIiwia2V5IiwiYnVpbGRRdWVyeVBhcmFtZXRlciIsImFkZFF1ZXJ5IiwiY29uY2F0IiwicmVtb3ZlUXVlcnkiLCJoYXNRdWVyeSIsIndpdGhpbkFycmF5IiwiX2Jvb2x5IiwiQm9vbGVhbiIsIm9wIiwiY29tbW9uUGF0aCIsIk1hdGgiLCJtaW4iLCJ3aXRoaW5TdHJpbmciLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJfc3RhcnQiLCJfZW5kIiwiX3RyaW0iLCJfYXR0cmlidXRlT3BlbiIsImxhc3RJbmRleCIsImV4ZWMiLCJpbmRleCIsImlnbm9yZUh0bWwiLCJhdHRyaWJ1dGVPcGVuIiwibWF4Iiwic2VhcmNoIiwiaWdub3JlIiwicmVzdWx0IiwiZW5zdXJlVmFsaWRIb3N0bmFtZSIsInRvQVNDSUkiLCJub0NvbmZsaWN0IiwicmVtb3ZlQWxsIiwidW5jb25mbGljdGVkIiwiVVJJVGVtcGxhdGUiLCJkZWZlckJ1aWxkIiwiX2RlZmVycmVkX2J1aWxkIiwiX3N0cmluZyIsImNsb25lIiwidmFsdWVPZiIsImdlbmVyYXRlU2ltcGxlQWNjZXNzb3IiLCJnZW5lcmF0ZVByZWZpeEFjY2Vzc29yIiwiX2tleSIsImhhc2giLCJyZXMiLCJfb2JqZWN0IiwiYXR0cmlidXRlIiwic3JjIiwiaXMiLCJ3aGF0IiwiaXAiLCJpcDQiLCJpcDYiLCJzbGQiLCJpZG4iLCJyZWxhdGl2ZSIsImhhcyIsIl9wcm90b2NvbCIsIl9wb3J0IiwiX2hvc3RuYW1lIiwic2NoZW1lIiwieCIsIm9yaWdpbiIsImF1dGhvcml0eSIsImhvc3QiLCJ1c2VyaW5mbyIsInJlc291cmNlIiwic3ViZG9tYWluIiwiZG9tYWluIiwic3ViIiwiUmVnRXhwIiwidGxkIiwiZ2V0IiwiUmVmZXJlbmNlRXJyb3IiLCJkaXJlY3RvcnkiLCJmaWxlbmFtZSIsImRlY29kZVBhdGhTZWdtZW50IiwibXV0YXRlZERpcmVjdG9yeSIsIm5vcm1hbGl6ZVBhdGgiLCJzdWZmaXgiLCJzIiwic2VnbWVudCIsInNlcGFyYXRvciIsImFic29sdXRlIiwiRXJyb3IiLCJwb3AiLCJ1bnNoaWZ0Iiwic2VnbWVudENvZGVkIiwicSIsInNldFF1ZXJ5Iiwic2V0U2VhcmNoIiwiYWRkU2VhcmNoIiwicmVtb3ZlU2VhcmNoIiwiaGFzU2VhcmNoIiwibm9ybWFsaXplIiwibm9ybWFsaXplUHJvdG9jb2wiLCJub3JtYWxpemVRdWVyeSIsIm5vcm1hbGl6ZUZyYWdtZW50Iiwibm9ybWFsaXplSG9zdG5hbWUiLCJub3JtYWxpemVQb3J0IiwiYmVzdCIsIl9wYXRoIiwiX3dhc19yZWxhdGl2ZSIsIl9sZWFkaW5nUGFyZW50cyIsIl9wYXJlbnQiLCJfcG9zIiwibm9ybWFsaXplUGF0aG5hbWUiLCJub3JtYWxpemVTZWFyY2giLCJub3JtYWxpemVIYXNoIiwiZCIsInJlYWRhYmxlIiwidXJpIiwidG9Vbmljb2RlIiwicXAiLCJrdiIsInJlc29sdmVkIiwicHJvcGVydGllcyIsImJhc2VkaXIiLCJyZWxhdGl2ZVRvIiwicmVsYXRpdmVQYXJ0cyIsImJhc2VQYXJ0cyIsImNvbW1vbiIsInJlbGF0aXZlUGF0aCIsImJhc2VQYXRoIiwicGFyZW50cyIsImVxdWFscyIsIm9uZV9tYXAiLCJ0d29fbWFwIiwiY2hlY2tlZCIsIm9uZV9xdWVyeSIsInR3b19xdWVyeSIsIldvcmtmbG93IiwiSW1hZ2VTaWduIiwiVHJhY2VzSGFuZGxlciIsIlRyYWNlc1RlbXBsYXRlIiwiSW5zdGFuY2Vmb3JtVGVtcGxhdGUiLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSIsIkluc3RhbmNlU2lnblRleHQiLCJSZWxhdGVkSW5zdGFuY2VzIiwiUmVsYXRlZFJlY29yZHMiLCJJbnN0YW5jZU1hY3JvIiwiY29udGV4dCIsIlRyYWNlc01hbmFnZXIiLCJpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyIsImZpZWxkX2Zvcm11bGEiLCJpbmNsdWRlc09waW5pb25GaWVsZCIsImZvcm0iLCJmb3JtX3ZlcnNpb24iLCJfZm9ybV92ZXJzaW9uIiwiZmllbGRfZm9ybXVsYXMiLCJmaWVsZHMiLCJBcnJheSIsIk1ldGVvciIsImlzU2VydmVyIiwidXVmbG93TWFuYWdlciIsImdldEZvcm1WZXJzaW9uIiwiZGIiLCJmb3JtcyIsImZpbmRPbmUiLCJfaWQiLCJmb3JtX3ZlcnNpb25zIiwiZm9yRWFjaCIsImYiLCJyZWYiLCJjb25zb2xlIiwibG9nIiwiZjEiLCJmb3JtdWxhIiwiXyIsInNvbWUiLCJoZWxwZXJzIiwiaW5zdGFuY2VfdGFza3MiLCJDb2xsZWN0aW9uIiwiX3NpbXBsZVNjaGVtYSIsIlNpbXBsZVNjaGVtYSIsImluc3RhbmNlIiwidHJhY2UiLCJpc19maW5pc2hlZCIsInVzZXIiLCJ1c2VyX25hbWUiLCJoYW5kbGVyIiwiaGFuZGxlcl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb24iLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJzdGFydF9kYXRlIiwiRGF0ZSIsImR1ZV9kYXRlIiwiaXNfcmVhZCIsImlzX2Vycm9yIiwidmFsdWVzIiwiZGVhZGxpbmUiLCJyZW1pbmRfZGF0ZSIsInJlbWluZGVkX2NvdW50IiwiTnVtYmVyIiwicmVhZF9kYXRlIiwiZGVzY3JpcHRpb24iLCJtb2RpZmllZCIsIm1vZGlmaWVkX2J5Iiwic2lnbl9zaG93IiwianVkZ2UiLCJuZXh0X3N0ZXBzIiwiZmluaXNoX2RhdGUiLCJjb3N0X3RpbWUiLCJzcGFjZSIsImluc3RhbmNlX25hbWUiLCJzdWJtaXR0ZXIiLCJzdWJtaXR0ZXJfbmFtZSIsImFwcGxpY2FudCIsImFwcGxpY2FudF9uYW1lIiwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lIiwic3VibWl0X2RhdGUiLCJmbG93IiwiZmxvd19uYW1lIiwic3RlcCIsInN0ZXBfbmFtZSIsImNhdGVnb3J5X25hbWUiLCJpbnN0YW5jZV9zdGF0ZSIsImRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSIsImZvcndhcmRfZnJvbV9pbnN0YW5jZSIsImtleXdvcmRzIiwiaXNfYXJjaGl2ZWQiLCJjYXRlZ29yeSIsImF1dGhfdG9rZW5zIiwiX2dldExvY2FsZSIsIl9nZXRSZXF1aXJlZEZpZWxkcyIsIl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsIl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyIsIl9nZXRUZW1wbGF0ZURhdGEiLCJfZ2V0Vmlld0h0bWwiLCJnZXRMaW5rVGV4dCIsIm1hcmtlZCIsInJlcXVpcmUiLCJJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUiLCJpbnN0YW5jZV9hdHRhY2htZW50IiwiYWZTZWxlY3RVc2VyUmVhZCIsImFmRm9ybUdyb3VwUmVhZCIsImFmRm9ybUdyb3VwIiwiY3JlYXRlIiwidGVtcGFsdGVOYW1lIiwic3RlZWRvc0RhdGEiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlQ29tcGlsZWQiLCJ0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uIiwiU3BhY2ViYXJzQ29tcGlsZXIiLCJjb21waWxlIiwiaXNCb2R5IiwiZXZhbCIsIlRlbXBsYXRlIiwiQmxhemUiLCJjcmVhdGVJbnN0YW5jZVNpZ25UZXh0IiwiaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkIiwiaW5zdGFuY2VTaWduVGV4dEh0bWwiLCJpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVNpZ25UZXh0IiwiY3JlYXRlSW1hZ2VTaWduIiwiaW1hZ2VTaWduQ29tcGlsZWQiLCJpbWFnZVNpZ25IdG1sIiwiaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24iLCJpbWFnZVNpZ24iLCJjcmVhdGVUcmFjZXNIYW5sZGVyIiwidHJhY2VzSGFubGRlckNvbXBpbGVkIiwidHJhY2VzSGFubGRlckh0bWwiLCJ0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZV90cmFjZXNfaGFuZGxlciIsImluaXQiLCJpdGVtIiwibGFiZWwiLCJkZXRhaWxfdXJsIiwiU3RlZWRvcyIsImFic29sdXRlVXJsIiwiZ2V0VmFsdWUiLCJmaWVsZCIsImxvY2FsZSIsInV0Y09mZnNldCIsImRhdGUiLCJmaWVsZE9wdGlvbnMiLCJob3VycyIsIm1vbnRoIiwibmFtZUZpZWxkIiwicmVjb3JkcyIsInNlY29uZHMiLCJzZWxlY3RlZE9wdGlvbiIsInNlbGVjdGVkT3B0aW9ucyIsInNwbGl0ZWRWYWx1ZXMiLCJ0MCIsInQxIiwidWlTY2hlbWEiLCJ5ZWFyIiwibiIsIml0ZW1TcGxpdHMiLCJlbmNvZGVVUkkiLCJlcnJvciIsImlzX211bHRpc2VsZWN0IiwiZ2V0UHJvcGVydHkiLCJmdWxsbmFtZSIsIlRBUGkxOG4iLCJfXyIsImZvcm1hdERhdGUiLCJmb3JtYXRUaW1lIiwiaXNfdGV4dGFyZWEiLCJmaW5kIiwiZmlsdGVyIiwiaXNfcGVyY2VudCIsIm51bWJlclRvUGVyY2VudFN0cmluZyIsImRpZ2l0cyIsIm51bWJlclRvU3RyaW5nIiwiaXNDbGllbnQiLCJhdXRoUmVxdWVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhc3luYyIsIm9iamVjdEZpbmQiLCJmaWx0ZXJzIiwiZmlsZU5hbWUiLCJmaWxlUHJldmlld0h0bWwiLCJmaWxlVXJsIiwib3JpZ2luYWwiLCJDcmVhdG9yIiwiZ2V0T2JqZWN0IiwicmVmZXJlbmNlX3RvIiwiTkFNRV9GSUVMRF9LRVkiLCJyZWZlcmVuY2VfdG9fZmllbGQiLCJnZXRPYmplY3ROYW1lRmllbGRLZXkiLCJnZXRMYWJlbCIsImNvZGUiLCJmaW5kUHJvcGVydHlCeVBLIiwiZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbiIsImZvcm1fZmllbGRzIiwiY3VycmVudCIsIndoZXJlIiwiaGlzdG9yeXMiLCJnZXRGbG93VmVyc2lvbiIsImZsb3dfdmVyc2lvbiIsImZsb3dzIiwidmlld0h0bWwiLCJBc3NldHMiLCJnZXRUZXh0IiwicmVmMSIsInRvTG9jYWxlTG93ZXJDYXNlIiwicmV2IiwiaXNfcmVxdWlyZWQiLCJzdGVwcyIsImVkaXRhYmxlQ29kZSIsInN0YXJ0U3RlcCIsImtleXMiLCJwZXJtaXNzaW9ucyIsInJlcXVpcmVkRmllbGRzIiwiaW50ZXJzZWN0aW9uIiwiV29ya2Zsb3dNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdCIsImdldEF1dG9mb3JtU2NoZW1hVmFsdWVzIiwiaW5zbmFtZSIsImluc19zdGF0ZSIsInN0YXRlIiwiaW5zX2ZpbmFsX2RlY2lzaW9uIiwiaW5zX2NvZGUiLCJpbnNfaXNfYXJjaGl2ZWQiLCJpbnNfaXNfZGVsZXRlZCIsImFwcGxpY2FudENvbnRleHQiLCJzZXNzaW9uVXNlcklkIiwiZWRpdGFibGUiLCJzdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsInBhc3NpbmciLCJtb21lbnQiLCJmb3JtYXQiLCJnZXRJbnN0YW5jZVZpZXciLCJib2R5IiwiaW5zdGFuY2VDb21waWxlZCIsImluc3RhbmNlUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVRlbXBsYXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZ2V0VGVtcGxhdGUiLCJ0ZW1wbGF0ZU5hbWUiLCJpbnN0YW5jZV9yZWFkb25seV92aWV3IiwidG9IVE1MV2l0aERhdGEiLCJnZXRUcmFjZXNWaWV3IiwidHJhY2VDb21waWxlZCIsInRyYWNlUmVuZGVyRnVuY3Rpb24iLCJ0cmFjZXNIdG1sIiwiaW5zdGFuY2Vfc3R5bGUiLCJ0cmFjZV9yZWFkb25seV92aWV3IiwidHJhY2VzIiwiZ2V0QXR0YWNobWVudFZpZXciLCJhdHRhY2htZW50Q29tcGlsZWQiLCJhdHRhY2htZW50SHRtbCIsImF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiIsImF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXciLCJnZXRSZWxhdGVkSW5zdGFuY2VzVmlldyIsInJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCIsInJlbGF0ZWRJbnN0YW5jZXNIdG1sIiwicmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9pbnN0YW5jZXNfdmlldyIsImdldFJlbGF0ZWRSZWNvcmRzVmlldyIsInJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQiLCJyZWxhdGVkUmVjb3Jkc0h0bWwiLCJyZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9yZWNvcmRzX3ZpZXciLCJnZXRPbkxvYWRTY3JpcHQiLCJmb3JtX3NjcmlwdCIsImdldEluc3RhbmNlSHRtbCIsImFsbENzc0xpbmsiLCJhdHRhY2htZW50IiwiY3JlYXRvclNlcnZpY2UiLCJjc3NIcmVmIiwiZm9ybURlc2NyaXB0aW9uIiwiZm9ybURlc2NyaXB0aW9uSHRtbCIsImh0bWwiLCJpbnNfcmVjb3JkX2lkcyIsImluc3RhbmNlQm94U3R5bGUiLCJqcUhyZWYiLCJvbkxvYWRTY3JpcHQiLCJvcGVuRmlsZVNjcmlwdCIsInJlbGF0ZWRfaW5zdGFuY2VzIiwicmVsYXRlZF9yZWNvcmRzIiwic2hvd1RyYWNlc0J0biIsInNob3dUcmFjZXNTY3JpcHQiLCJ0cmFjZUNoZWNrIiwid2lkdGgiLCJzZXR0aW5ncyIsIndlYnNlcnZpY2VzIiwiY3JlYXRvciIsInJlY29yZF9pZHMiLCJpc01vYmlsZSIsInNob3dUcmFjZSIsImZpbmFsX2RlY2lzaW9uIiwic2hvd0F0dGFjaG1lbnRzIiwiaXNFbXB0eSIsInRhZ2dlciIsInN0eWxlcyIsInBsdWdpbnMiLCJhZGRfc3R5bGVzIiwiZm9ybUlkIiwiaW5zdGFuY2VfdGl0bGUiLCJwYWdlVGl0bGUiLCJwYWdlVGl0bGVUckNsYXNzIiwidmFsIiwiQ29yZUZvcm0iLCJwYWdlVGl0bGVGaWVsZE5hbWUiLCJoYW5kbGVUYWJsZVRlbXBsYXRlIiwiX2V4cG9ydCIsInRhYmxlX2ZpZWxkcyIsInRhYmxlX2ZpZWxkIiwiZmllbGRfcGVybWlzc2lvbiIsInB1cmVDb2RlIiwicmVxdWlyZWQiLCJ0aXRsZV9wZXJtaXNzaW9uIiwicmVtb3ZlU3BlY2lhbENoYXJhY3RlciIsImlzT3BpbmlvbkZpZWxkIiwidHJfc3RhcnQiLCJ0ZF9jb2xzcGFuIiwidHJfZW5kIiwiaW5jbHVkZXMiLCJwZXJtaXNzaW9uIiwiX3RlbXBsYXRlIiwidGFibGUiLCJfdGVtcGxhdGVIZWxwcyIsInN0ZWVkb3NfaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsImF0dHMiLCJpZCIsInN0eWxlIiwiZGlzYWJsZWQiLCJpbnN0YW5jZUlkIiwiZm9ybV90eXBlcyIsIkFwcHJvdmVNYW5hZ2VyIiwiaXNSZWFkT25seSIsInN0ZWVkb3NfZm9ybSIsImlubmVyc3ViZm9ybUNvbnRleHQiLCJkb2NfdmFsdWVzIiwiU2Vzc2lvbiIsImEiLCJiIiwiZ2V0QXV0b2Zvcm1TY2hlbWEiLCJpbnN0YW5jZV9ib3hfc3R5bGUiLCJib3giLCJpbnMiLCJwcmludF90ZW1wbGF0ZSIsImluc3RhbmNlX3RlbXBsYXRlIiwiU3RlZWRvc1RhYmxlIiwiY2hlY2tJdGVtIiwiaXRlbV9pbmRleCIsImZpZWxkT2JqIiwiZ2V0RmllbGQiLCJmaWVsZFZhbCIsImdldEl0ZW1Nb2RhbFZhbHVlIiwic2ZfbmFtZSIsInNmaWVsZHMiLCJzZiIsIkluc3RhbmNlTWFuYWdlciIsImNoZWNrRm9ybUZpZWxkVmFsdWUiLCIkIiwic2V0VGFibGVJdGVtVmFsdWUiLCJpdGVtX3ZhbHVlIiwidGFibGVWYWx1ZSIsImdldFRhYmxlVmFsdWUiLCJnZXRUYWJsZUl0ZW1WYWx1ZSIsInJlbW92ZVRhYmxlSXRlbSIsInJlbW92ZWQiLCJzZXRUYWJsZVZhbHVlIiwiZ2V0VmFsaWRWYWx1ZSIsInZhbGlkVmFsdWUiLCJoYW5kbGVEYXRhIiwiaW5zdGFuY2VGaWVsZHMiLCJnZXRJbnN0YW5jZUZpZWxkcyIsImdldE1vZGFsRGF0YSIsIkZvcm1fZm9ybXVsYSIsImdldEZvcm11bGFGaWVsZFZhcmlhYmxlIiwiQXV0b0Zvcm0iLCJnZXRGb3JtVmFsdWVzIiwiaW5zZXJ0RG9jIiwiYWRkSXRlbSIsIl9pdGVtX3ZhbHVlIiwiZ2V0S2V5cyIsImFwcGVuZCIsImdldFRyIiwidXBkYXRlSXRlbSIsInRkcyIsImdldFJlbW92ZVRkIiwic2ZpZWxkIiwiZ2V0VGQiLCJlbXB0eSIsInJ1bkZvcm11bGEiLCJyZW1vdmVJdGVtIiwiaGlkZSIsInNob3dNb2RhbCIsIm1ldGhvZCIsIm1vZGFsRGF0YSIsInNldFRpbWVvdXQiLCJNb2RhbCIsInNob3ciLCJnZXRDdXJyZW50RGF0YUZvckZvcm0iLCJzcyIsImdldEZvcm1TY2hlbWEiLCJzY2hlbWEiLCJvYmplY3RLZXlzIiwiX21ha2VHZW5lcmljIiwiZ2V0VGhlYWQiLCJpc09iamVjdCIsInRoZWFkIiwidHJzIiwic2ZfbGVuZ3RoIiwid2lkZV9maWVsZHMiLCJmaWx0ZXJQcm9wZXJ0eSIsImlzX3dpZGUiLCJnZXRUYm9keSIsInNmaWVsZHNFZGl0YWJsZSIsInRib2R5IiwidHIiLCJ0ZCIsInRkX3ZhbHVlIiwiZ2V0VERWYWx1ZSIsInZpZXciLCJDRkRhdGFNYW5hZ2VyIiwiZ2V0Rm9ybXVsYVNwYWNlVXNlcnMiLCJ1IiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbnMiLCJvIiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbiIsInBsdWNrIiwiYWRkSW5wdXRUeXBlIiwidmFsdWVPdXQiLCJ2YWx1ZUNvbnZlcnRlcnMiLCJzdHJpbmdUb1N0cmluZ0FycmF5Iiwic3RyaW5nVG9OdW1iZXIiLCJzdHJpbmdUb051bWJlckFycmF5Iiwic3RyaW5nVG9Cb29sZWFuIiwic3RyaW5nVG9Cb29sZWFuQXJyYXkiLCJzdHJpbmdUb0RhdGUiLCJzdHJpbmdUb0RhdGVBcnJheSIsImNvbnRleHRBZGp1c3QiLCJtYXhsZW5ndGgiLCJhZlRhYmxlIiwiZXZlbnRzIiwiZXZlbnQiLCJuZXdfaXRlbV9pbmRleCIsImN1cnJlbnRUYXJnZXQiLCJkYXRhc2V0Iiwic2V0IiwicmVuZGVyZWQiLCJzdHIiLCJhZGRJdGVtVHIiLCJnZXRDdXJyZW50U3RlcCIsInN0ZXBfdHlwZSIsImNjSGFzRWRpdFBlcm1pc3Npb24iLCJhdXRvcnVuIiwiY3VycmVudERhdGEiLCJzcGFjZVVzZXJTaWduIiwidXNlcklkIiwic3BhY2VfdXNlcl9zaWducyIsImltYWdlVVJMIiwic2lnbiIsInNob3dTaWduSW1hZ2UiLCJ0cmFjZVNob3dTaWduSW1hZ2UiLCJvYmplY3RVcmwiLCJvYmplY3RfbmFtZSIsInJlY29yZF9pZCIsImFwcF9pZCIsImdldE9iamVjdFVybCIsInVuZW1wdHkiLCJ1bmVxdWFscyIsImluY2x1ZGUiLCJyZWYyIiwicmVmMyIsImdldEluc3RhbmNlRmxvd1ZlcnNpb24iLCJhcHByb3ZlcyIsInJlZjQiLCJhcHByb3ZlIiwianVkZ2VfbmFtZSIsIm9waW5pb25fZmllbGRzX2NvZGUiLCJzaWduX2ZpZWxkX2NvZGUiLCJhZnRlcl9maWVsZCIsImJlZm9yZV9maWVsZCIsInByZV9maWVsZHMiLCJwcmVfd2lkZV9maWVsZHMiLCJzb3J0X2FwcHJvdmUiLCJvcmRlciIsInAxIiwicDIiLCJfcDEiLCJfcDIiLCJnZXRUaW1lIiwiX3QiLCJpc1RleHRhcmVhIiwiZ2V0Q2ZDbGFzcyIsImdldFRhYmxlVGhlYWQiLCJnZXRUYWJsZUJvZHkiLCJzaG93TGFiZWwiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRPcGluaW9uRmllbGRTdGVwc05hbWUiLCJ0b3Bfa2V5d29yZHMiLCJmb28xIiwib3BpbmlvbkZpZWxkcyIsImZvbyIsImpzb25fZm9ybXVsYSIsInMxIiwiZXJyb3IxIiwieWlqaWFubGFuIiwic3RlcE5hbWUiLCJpbWFnZV9zaWduIiwib25seV9jY19vcGluaW9uIiwib25seV9jYyIsImRlZmF1bHRfZGVzY3JpcHRpb24iLCJvbmx5X2hhbmRsZXIiLCJzaG93Q0NPcGluaW9uIiwibWFya0Rvd25Ub0h0bWwiLCJtYXJrRG93blN0cmluZyIsIk5wbSIsIlNwYWNlYmFycyIsIlNhZmVTdHJpbmciLCJmX2xhYmVsIiwidGhhdCIsImlzU2VjdGlvbiIsInJlZ2lzdGVySGVscGVyIiwiaW5zX2F0dGFjaF9kb3dubG9hZF91cmwiLCJnZXRQZXJtaXNzaW9ucyIsImluc3RhbmNlZm9ybUNoYW5nZUV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvcGVuV2luZG93IiwidGFyZ2V0Iiwib25DcmVhdGVkIiwiY29tcGlsZWQiLCJpbnN0YW5jZUN1c3RvbVRlbXBsYXRlIiwiaW5zdGFuY2VWaWV3IiwicmVuZGVyRnVuY3Rpb24iLCJWaWV3IiwiaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlIiwib25SZW5kZXJlZCIsImN1cnJlbnRBcHByb3ZlIiwiY3VycmVudFN0ZXAiLCJmb3JtdWxhX2ZpZWxkcyIsImluc3RhbmNlTnVtYmVyRmllbGRzIiwic2V0SW5zdGFuY2VGb3JtQXBwbGljYW50IiwibmV4dFN0ZXBzIiwibmV4dFN0ZXBVc2VycyIsIkluc3RhbmNlRXZlbnQiLCJpbml0RXZlbnRzIiwiZ2V0Q3VycmVudEFwcHJvdmUiLCJlYWNoIiwiZWxlbWVudCIsInNjaGVtYUtleSIsInRvYXN0ciIsInJlYXNvbiIsImdldEZpZWxkVmFsdWUiLCJJbnN0YW5jZU51bWJlclJ1bGVzIiwiaW5zdGFuY2VOdW1iZXJCdWlsZGVyIiwidHJpZ2dlciIsInJ1biIsInNob3dNYWluVGl0bGUiLCJ3b3JrZmxvd01haW5BdHRhY2hUaXRsZSIsImVuYWJsZWRfYWRkX21haW5fYXR0YWNobWVudCIsImN1cnJlbnRfc3RlcCIsImN1cnJlbnRUcmFjZSIsImdldEN1cnJlbnRUcmFjZSIsIm1haW5fYXR0YWNoX2NvdW50IiwiY2ZzIiwiaW5zdGFuY2VzIiwiY291bnQiLCJkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50Iiwic3RhcnRfc3RlcCIsImdldFN0YXJ0U3RlcCIsImNhbl9lZGl0X21haW5fYXR0YWNoIiwiZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50IiwiZ2V0RmxvdyIsInVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZCIsImlzQ0MiLCJnZXRDQ1N0ZXAiLCJjYW5fZWRpdF9ub3JtYWxfYXR0YWNoIiwibWFpbl9hdHRhY2htZW50IiwibWFpbl9hdHRhY2giLCJub3JtYWxfYXR0YWNobWVudHMiLCJzZWxlY3RvciIsIiRuZSIsImRmaXMiLCJkaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIiwiJGluIiwiZGlzdHJpYnV0ZV9tYWluIiwiZmlyc3RWZXJzaW9uTWFpbiIsIm1ldGFkYXRhIiwicGFyZW50IiwiYXR0YWNobWVudFVwbG9hZGVkQXQiLCJ1cGxvYWRlZEF0IiwiZmlyc3RWZXJzaW9uIiwic29ydEJ5IiwiaW5zdGFuY2VJZHMiLCJhdHRhY2htZW50c19jb3VudCIsImZsb3dfZmlsZXMiLCJmaWxlcyIsImlzRHJhZnRBbmRGbG93ZmlsZXNFeGlzdCIsImNvbXBhY3QiLCJhdHRhY2htZW50cyIsIiRvciIsImZldGNoIiwibXlBcHByb3ZlIiwibXlUcmFjZSIsImlzSW5ib3giLCJkZWZhdWx0RGVzY3JpcHRpb24iLCJhcHByb3ZlX3NvcnQiLCJhcHByb3Zlc0dyb3VwIiwiYXBwcm92ZXNfc29ydGVkIiwiY29tcGxldGVkX2RhdGUiLCJoYXNOZXh0IiwiaGF2ZURlc2NyaXB0aW9uQXBwcm92ZSIsImlzX2NvbXBsZXRlZCIsImxhc3QiLCJ0b3BfYXBwcm92ZXMiLCJ1bmlvbiIsInRvcF9hcHByb3ZlIiwiZ3JvdXBCeSIsImhhbmRsZXJBcHByb3ZlcyIsImRlc2NyaXB0aW9uQXBwcm92ZXMiLCJ3b3JrZmxvdyIsInNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiIsIl9kaXNwbGF5IiwiaXNNeUFwcHJvdmUiLCJteUFwcHJvdmVEZXNjcmlwdGlvbiIsImFwcHJvdmVJZCIsIm5vdyIsImlzT3Bpbmlvbk9mRmllbGQiLCJpbWFnZVNpZ25EYXRhIiwiZ2V0TGFzdFNpZ25BcHByb3ZlIiwiZ2V0SGFuZGxlclNpZ25TaG93QXBwcm92ZXMiLCJsYXN0TXlBcHByb3ZlRGVzY3JpcHRpb24iLCJzaG93QXBwcm92ZSIsImp1ZGdlX2Rlc2NyaXB0aW9uIiwiaXNfYXBwcm92ZWQiLCJpc19yZWplY3RlZCIsImlzX3JlYWRlZCIsImFkZENsYXNzIiwiZGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiZ2V0U3RlcE5hbWUiLCJzdGVwSWQiLCJnZXRJbnN0YW5jZVN0ZXAiLCJzaG93RGVsZXRlQnV0dG9uIiwiYXBwcm92ZWQiLCJmcm9tX3VzZXIiLCJpc1Nob3dNb2RpZmljYXRpb25CdXR0b24iLCJhcHByb3ZlX2FkbWlucyIsImlzU2hvdyIsImNvbnRhaW5zIiwiaXNFZGl0aW5nIiwiaXNfZWRpdGluZyIsImlzU2hvd0Rlc2NyaXB0aW9uIiwiZ2V0QXBwcm92ZVN0YXR1c0ljb24iLCJhcHByb3ZlSnVkZ2UiLCJhdXRvU3VibWl0dGVkIiwiYXBwcm92ZVN0YXR1c0ljb24iLCJnZXRBcHByb3ZlU3RhdHVzVGV4dCIsImFwcHJvdmVTdGF0dXNUZXh0IiwiZ2V0QXBwcm92ZUp1ZGdlQ2xhc3MiLCJpc0ZvcndhcmQiLCJzaG93Rm9yd2FyZERlbGV0ZUJ1dHRvbiIsImZvcndhcmRfaW5zdGFuY2UiLCJpc0Rpc3RyaWJ1dGUiLCJzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbiIsImhhc0Zsb3dBZG1pblBlcm1pc3Npb24iLCJmaW5pc2hEYXRlU2NoZW1hIiwiaXNBbmRyb2lkT3JJT1MiLCJhdXRvZm9ybSIsIm9wdGlvbmFsIiwicmVhZG9ubHkiLCJkYXRlVGltZVBpY2tlck9wdGlvbnMiLCJpZ25vcmVSZWFkb25seSIsIndpZGdldFBvc2l0aW9uaW5nIiwiaG9yaXpvbnRhbCIsImZpbmlzaERhdGVWYWx1ZXMiLCJzaG93VHJhY2VzVmlldyIsInNob3dfbW9kYWxfdHJhY2VzX2xpc3QiLCJzcGFjZV9zZXR0aW5ncyIsImdldEluc3RhbmNlU3RhdGVUZXh0IiwiaW5zdGFuY2VfaWQiLCJnZXRJbnN0YW5jZVN0YXRlQ29sb3IiLCJjbGEiLCJmaXJzdFRyYWNlIiwibGFzdF9kaXN0cmlidXRlX2Zyb20iLCJkaXNfaW5mbyIsIiRleGlzdHMiLCJjcmVhdGVkIiwiY3JlYXRlZF9ieSIsIlVVZmxvd19hcGkiLCJnZXROYW1lRm9yVXNlciIsInVzZXJzIiwiZnJvbV91c2VyX25hbWUiLCJpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZCIsImp1ZGdlVGVybWluYXRlZCIsImluc3RhbmNlRXhpc3RzIiwiYWdlbnREZXNjcmlwdGlvbiIsInVzZXJOYW1lIiwidHJhY2VOYW1lIiwidHJhY2VJZCIsImhhbmRsZXJEb2MiLCJoYW5kbGVySWQiLCJ1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIiwiZ2V0Q29udGFjdEluZm9Gb3JVc2VyIiwic3RvcFByb3BhZ2F0aW9uIiwiY2FsbGluZyIsImVyciIsInJlbW92ZUNsYXNzIiwic3VjY2VzcyIsImFsbG93TXVsdGlwbGUiLCJjbG9zZXN0IiwidGFyZ2V0X3VzZXJfaWQiLCJvcGVuU2FmZU9iamVjdFVybCIsImZvcndhcmRfc3BhY2UiLCJmb3J3YXJkc3BhY2UiLCJmb3J3YXJkaW5zdGFuY2UiLCJUcmFja2VyIiwiYWZ0ZXJGbHVzaCIsIm9uIiwic2Nyb2xsVG9wIiwiZmluaXNoX2lucHV0Iiwib3Bpbmlvbl9pbnB1dCIsInNob3dSZWxhdGVkSW5zdGFjZXMiLCJyZWxhdGVkX2luc3RhY2VzIiwicmVsYXRlZF9pbnN0YWNlX3VybCIsImlzQ29yZG92YSIsInNob3dfZGVsZXRlIiwic2hvd1JlbGF0ZWRSZWNvcmRzIiwicmVsYXRlZFJlY29yZFVybCIsIm9iamNldE5hbWUiLCJpZHMiLCJwcm9jZXNzIiwiZW52IiwiQ1JFQVRPUl9OT0RFX0VOViIsIkpzb25Sb3V0ZXMiLCJhZGQiLCJyZXEiLCJuZXh0IiwiaGFzaERhdGEiLCJhY3Rpb24iLCJ0b191c2VycyIsInNlbmRSZXN1bHQiLCJzdGFjayIsImVycm9ycyIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJ3b3JrZmxvd01ldGhvZHMiLCJtZXRob2RzIiwic2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZSIsImluc19pZCIsInN0ZXBfYXBwcm92ZSIsInN0ZXBzQXBwcm92ZXNPcHRpb25zIiwiYXBwbHkiLCJzZXRfaW5zdGFuY2Vfc2tpcF9zdGVwcyIsImdldF9pbnN0YW5jZV9kYXRhIiwiZm9ybUNhY2hlZCIsImZsb3dDYWNoZWQiLCJkcmFmdF9zYXZlX2luc3RhbmNlIiwiaW5ib3hfc2F2ZV9pbnN0YW5jZSIsImNjX2RvIiwiY2NfdXNlcl9pZHMiLCJjY19yZWFkIiwiY2Nfc3VibWl0IiwiY2NfcmVtb3ZlIiwiYmF0Y2hfY2FuY2VsX2NjIiwiYXBwcm92ZV9pZHMiLCJjY19zYXZlIiwic3BhY2VfaWQiLCJmbG93X2lkIiwiaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50IiwiaXNGb3J3YXJkQXR0YWNobWVudHMiLCJzZWxlY3RlZFVzZXJzIiwiYWN0aW9uX3R5cGUiLCJyZWxhdGVkIiwiZnJvbV9hcHByb3ZlX2lkIiwiZm9yd2FyZF9yZW1vdmUiLCJ0cmFjZV9pZCIsImFwcHJvdmVfaWQiLCJjYW5jZWxEaXN0cmlidXRlIiwiY2ZzX2luc3RhbmNlc19yZW1vdmUiLCJmaWxlX2lkIiwiY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudCIsImNmc19pbnN0YW5jZXNfbG9jayIsInVzZXJfaWQiLCJjZnNfaW5zdGFuY2VzX3VubG9jayIsImRvd25sb2FkX3NwYWNlX2luc3RhbmNlX2F0dGFjaG1lbnRzX3RvX2Rpc2siLCJzcGFjZUlkIiwiY2ZzUmVjb3JkSWRzIiwic2V0X2FwcHJvdmVfaGF2ZV9yZWFkIiwiY2hhbmdlX2FwcHJvdmVfaW5mbyIsInVwZGF0ZV9hcHByb3ZlX3NpZ24iLCJzaWduX3R5cGUiLCJsYXN0U2lnbkFwcHJvdmUiLCJ1cGRhdGVfc2lnbl9zaG93Iiwib2JqcyIsIm15QXBwcm92ZV9pZCIsImluc3RhbmNlX3JldHVybiIsImluc3RhbmNlX3JlbWluZCIsInJlbWluZF91c2VycyIsInJlbWluZF9jb3VudCIsInJlbWluZF9kZWFkbGluZSIsImFjdGlvbl90eXBlcyIsIm5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQiLCJkZWFsX3R5cGUiLCJwYXJhbXMiLCJfZXZhbCIsImNoZWNrX21haW5fYXR0YWNoIiwicmVtb3ZlX3JlbGF0ZWQiLCJyZV9pbnNfaWQiLCJ1cGRhdGVfaW5zdGFuY2VfcmVsYXRlZCIsInVwZGF0ZUZsb3dQb3NpdGlvbiIsInVwZGF0ZUZsb3dSb2xlIiwic3RhcnRfZmxvdyIsImZsb3dJZCIsImdldF9pbnN0YW5jZV90cmFjZXMiLCJjYXRlZ29yeUlkIiwiZmxvd0lkcyIsImdldF9iYXRjaF9pbnN0YW5jZXMiLCJnZXRfYmF0Y2hfaW5zdGFuY2VzX2NvdW50IiwiZ2V0X215X2FwcHJvdmVzIiwiY2hhbmdlX2Zsb3dfc3RhdGUiLCJoaWRlX2luc3RhbmNlIiwiaW5zSWQiLCJpc19oaWRkZW4iLCJnZXRJbnN0YW5jZVZhbHVlcyIsIkNvb2tpZXMiLCJnZXRJbnN0YW5jZVJlYWRPbmx5IiwiX2hhc1Blcm1pc3Npb24iLCJfbG9jYWxlIiwiX3BhcmVudF9pbnN0YW5jZXMiLCJkYXRhQnVmIiwiaGlkZV90cmFjZXMiLCJzcGFjZVVzZXJDb3VudCIsImdldEFQSUxvZ2luVXNlciIsImFjY2Vzc190b2tlbiIsImdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiIsInNwYWNlcyIsInNwYWNlX3VzZXJzIiwiaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyIsIl9wYXJlbnRfaWQiLCJfcGFyZW50X2lucyIsImNoYXJzZXQiLCJCdWZmZXIiLCJzZXRIZWFkZXIiLCJzdGF0dXNDb2RlIiwicmV0X3N5bmNfdG9rZW4iLCJzcGFjZVVzZXIiLCJzcGFjZVVzZXJPcmdhbml6YXRpb25zIiwic3luY190b2tlbiIsIkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2siLCJoZWFkZXJzIiwiaXNTcGFjZUFkbWluIiwib3JnYW5pemF0aW9ucyIsImNhbk1vbml0b3IiLCJjYW5BZG1pbiIsIiRndCIsIiRuaW4iLCJpbmJveF91ZXJzIiwiY2NfdXNlcnMiLCJvdXRib3hfdXNlcnMiLCJza2lwIiwibGltaXQiLCJjb3BpZXMiLCJhbGxDc3MiLCJXZWJBcHAiLCJnZXRSZWZyZXNoYWJsZUFzc2V0cyIsImNzcyIsInJvb3RVcmwiLCJfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fIiwiUk9PVF9VUkxfUEFUSF9QUkVGSVgiLCJST09UX1VSTCIsImVuZHNXaXRoIiwiaCIsImciLCJtIiwiayIsImdldEVhY2giLCJ1bmlxIiwibWl4aW4iLCJkZXN0IiwiaGFuZGVyVXNlck9iamVjdCIsIm9yZ2FuaXphdGlvbiIsImhyIiwic29ydF9ubyIsIm1vYmlsZSIsIndvcmtfcGhvbmUiLCJwb3NpdGlvbiIsInVzZXJSb2xlcyIsInJvbGVzIiwiaGFuZGVyT3JnT2JqZWN0Iiwib3JnIiwiaW5pdF9mb3JtdWxhX3ZhbHVlcyIsImF1dG9Gb3JtRG9jIiwiYXBwcm92ZXIiLCJfX3ZhbHVlcyIsInRhYmxlRmllbGRzIiwidGFibGVWYWx1ZXMiLCJmb3JtdWxhVGFibGVWYWx1ZXMiLCJfX3RhYmxlVmFsdWVzIiwidGFibGVmaWVsZCIsImdldEZvcm11bGFVc2VyT2JqZWN0cyIsImdldEZvcm11bGFPcmdPYmplY3RzIiwiZ2V0Rm9ybXVsYVVzZXJPYmplY3QiLCJwdWJsaXNoIiwiY2hlY2siLCJyZWFkeSIsImNhdGVnb3JpZXMiLCJhcHAiLCJmbG93X3Bvc2l0aW9ucyIsInJvbGUiLCJwdWJsaXNoQ29tcG9zaXRlIiwidGFibGVOYW1lIiwiTWF0Y2giLCJPcHRpb25hbCIsInVuYmxvY2siLCJjaGlsZHJlbiIsImZsb3dfcm9sZXMiLCJjcmVhdGVUZW1wbGF0ZUZvcm1BbmRGbG93IiwicGVybXMiLCJjb21wYW55X2lkIiwiZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VycyIsImRpc3RyaWJ1dGVfdG9fc2VsZiIsImVuYWJsZV9hbWlzZm9ybSIsInZlcnNpb25JZCIsImhhbmRsZSIsInNlbGYiLCJsYXRlc3QiLCJvYnNlcnZlQ2hhbmdlcyIsImNoYW5nZWQiLCJhZGRlZCIsIm9uU3RvcCIsInN0b3AiLCJmbG93X2lkcyIsImRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbiIsImFsbG93X3NlbGVjdF9zdGVwIiwiYW1pc19zY2hlbWEiLCJnZXRNaW5pSW5zdGFuY2UiLCJnZXRNeWFwcHJvdmVNb2RpZmllZCIsImluc3RhbmNlX2ZpZWxkc18wIiwibWluaUFwcHJvdmVGaWVsZHMiLCJuZWVkQ2hhbmdlIiwidHJpZ2dlckNoYW5nZUZpZWxkcyIsInRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMiLCJteUFwcHJvdmVNb2RpZmllZHMiLCJfaW5zdGFuY2VJZCIsIl90cmFjZSIsImNoYW5nZUZpZWxkcyIsIl9jaGFuZ2UiLCJfcmV2IiwiX215X2FwcHJvdmVfbW9kaWZpZWRzIiwiaXNFcXVhbCIsImdldEluc3RhbmNlVHJhY2VzIiwiX2luc0lkIiwiaW5ib3hfdXNlcnMiLCJhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUiLCJsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlIiwiaW5zdGFuY2VpZCIsImRhdGFNYXAiLCJvcGVyYXRpb24iLCJyYXdDb2xsZWN0aW9uIiwiYWdncmVnYXRlIiwidG9BcnJheSIsImRvYyIsImlzRnVuY3Rpb24iLCJ3cmFwQXN5bmMiLCJnZXRNeUFwcHJvdmUiLCJnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUiLCJnZXRTdGVwQ3VycmVudE5hbWUiLCJub3RGaW5pc2hlZFRyYWNlcyIsImFnZW50Iiwic3RlcEN1cnJlbnROYW1lIiwiJHNsaWNlIiwibXlMYXN0RmluaXNoZWRBcHByb3ZlIiwiYWdlbnRfdXNlcl9uYW1lIiwibXlfZmluaXNoX2RhdGUiLCJpc19jYyIsImNjX2NvdW50IiwidGFidWxhck5hbWUiLCJpbnN0YW5jZV9pZHMiLCJyZWxhdGVkX2luc3RhbmNlX2lkcyIsIl9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlIiwiX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUiLCJfaXRlbXMiLCIkbWF0Y2giLCIkZ3JvdXAiLCIkc3VtIiwiX2NoYW5nZURhdGEiLCJfZmxvd3NEYXRhIiwiX2luaXQiLCJkYXRhSXRlbSIsImZsb3dfaW5zdGFuY2UiLCJvYnNlcnZlIiwiZ2V0Q29sbGVjdGlvbiIsIndvcmtmbG93VGVtcGxhdGUiLCJzdGFydHVwIiwiYWJzb2x1dGVfcGF0aF9jbiIsImFic29sdXRlX3BhdGhfdXMiLCJmaWxlc0xpc3RfY24iLCJmaWxlc0xpc3RfdXMiLCJmcyIsIm1pbWUiLCJwYXRoX2NuIiwicGF0aF91cyIsInJlYWRGaWxlTGlzdCIsInBhdGhEaXIiLCJmaWxlc0xpc3QiLCJyZWFkZGlyU3luYyIsInN0YXQiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5Iiwid29ya2Zsb3dUZW1wbGF0ZXMiLCJyZXNvbHZlIiwiZXhpc3RzU3luYyIsImZpbGUiLCJyZWFkRmlsZVN5bmMiLCJnb19uZXh0IiwicnVsZSIsInNjaGVkdWxlIiwiY3JvbiIsImF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbiIsInNjaGVkdWxlSm9iIiwiYmluZEVudmlyb25tZW50IiwidGltZSIsInByb2Nlc3NfZGVsZWdhdGlvbl9ydWxlcyIsInVwZGF0ZSIsImVuYWJsZWQiLCJlbmRfdGltZSIsIiRsdGUiLCIkc2V0IiwibXVsdGkiLCJ0aW1lRW5kIiwidGltZW91dF9hdXRvX3N1Ym1pdCIsInRpbWVvdXRBdXRvU3VibWl0IiwiVGFidWxhclRhYmxlcyIsInJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIiLCJUYWJ1bGFyIiwiVGFibGUiLCJjb2xsZWN0aW9uIiwiY29sdW1ucyIsInRpdGxlIiwib3JkZXJhYmxlIiwicmVuZGVyIiwiaW5wdXQiLCJzdGVwX2N1cnJlbnRfbmFtZSIsImN1cnJlbnRfc3RlcF9uYW1lIiwiZG9tIiwibGVuZ3RoQ2hhbmdlIiwiZXh0cmFGaWVsZHMiLCJwYWdlTGVuZ3RoIiwiaW5mbyIsInNlYXJjaGluZyIsInJlc3BvbnNpdmUiLCJkZXRhaWxzIiwiYXV0b1dpZHRoIiwiY2hhbmdlU2VsZWN0b3IiLCJjdXJTcGFjZVVzZXIiLCIkYW5kIiwiYWRtaW5zIiwiZmwiLCJleHRlbmQiLCJHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyIsIl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyIsIl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMiLCJfaGFuZGxlTGlzdEZpZWxkcyIsImluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyIiwiaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciIsIm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyIiwidXBkYXRlVGFidWxhclRpdGxlIiwic3VicyIsIlN1YnNNYW5hZ2VyIiwiaW5zX2ZpZWxkcyIsInB1YiIsIm9uVW5sb2FkIiwiaW5zdGFuY2VfbGlzdCIsIl90YWJsZUNvbHVtbnMiLCJkcmF3Q2FsbGJhY2siLCJlbGxpcHNpc0xpbmsiLCJlbXB0eVRkIiwiY29sU3BhbiIsImlzUGFkIiwicGVyZmVjdFNjcm9sbGJhciIsIm9JbnN0YW5jZSIsImF0dHIiLCJjbGljayIsImdvUGFnZSIsImhlaWdodCIsInBhZ2VzIiwiY2VpbCIsImZuUmVjb3Jkc0Rpc3BsYXkiLCJfaURpc3BsYXlMZW5ndGgiLCJEYXRhVGFibGUiLCJwYWdlIiwiZHJhdyIsImJsdXIiLCJjdXJyZW50UGFnZSIsImtleWRvd24iLCJrZXlDb2RlIiwiY3JlYXRlZFJvdyIsInJvdyIsImRhdGFJbmRleCIsIkZsb3dSb3V0ZXIiLCJzZXRBdHRyaWJ1dGUiLCJhZ2VudF92aWV3IiwiY2NfdmlldyIsImluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MiLCJtb2RpZmllZEZyb21Ob3ciLCJtb2RpZmllZFN0cmluZyIsInByaW9yaXR5SWNvbiIsInByaW9yaXR5SWNvbkNsYXNzIiwicHJpb3JpdHlWYWx1ZSIsInN0ZXBfY3VycmVudF9uYW1lX3ZpZXciLCJ1bnJlYWQiLCJtb21lbnRSZWFjdGl2ZUZyb21Ob3ciLCJwcmlvcml0eSIsInZpc2libGUiLCJjY190YWciLCJyZWNvcmRfbmVlZCIsImxlbmd0aE1lbnUiLCJzcGFjZV91c2VyIiwicGFnaW5nVHlwZSIsImlzX2xpc3RfZGlzcGxheSIsImluYm94X2luc3RhbmNlcyIsIm91dGJveF9pbnN0YW5jZXMiLCJnZXRTb3J0IiwiZmxvd0luc3RhbmNlcyIsIlJlYWN0aXZlVmFyIiwiX2NoYW5nZU9yZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsZ0JBQUo7QUFBcUJDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG9DQUFaLEVBQWlEO0FBQUNGLGtCQUFnQixDQUFDRyxDQUFELEVBQUc7QUFBQ0gsb0JBQWdCLEdBQUNHLENBQWpCO0FBQW1COztBQUF4QyxDQUFqRCxFQUEyRixDQUEzRjtBQUNyQkgsZ0JBQWdCLENBQUM7QUFDaEIsbUJBQWlCLFFBREQ7QUFFaEIsWUFBVTtBQUZNLENBQUQsRUFHYixrQkFIYSxDQUFoQixDOzs7Ozs7Ozs7Ozs7QUNEQTs7Ozs7Ozs7Ozs7OztBQWFDLGFBQVVJLElBQVYsRUFBZ0JDLE9BQWhCLEVBQXlCO0FBQ3pCLGlCQUR5QixDQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFFBQUksT0FBT0MsTUFBUCxLQUFrQixVQUFsQixJQUFnQ0EsTUFBTSxDQUFDQyxHQUEzQyxFQUFnRDtBQUMvQztBQUNBRCxZQUFNLENBQUMsQ0FBQyxZQUFELEVBQWUsUUFBZixFQUF5QixzQkFBekIsQ0FBRCxFQUFtREQsT0FBbkQsQ0FBTjtBQUNBLEtBSEQsTUFHTztBQUNOO0FBQ0FELFVBQUksQ0FBQ0ksR0FBTCxHQUFXSCxPQUFPLENBQUNELElBQUksQ0FBQ0ssUUFBTixFQUFnQkwsSUFBSSxDQUFDTSxJQUFyQixFQUEyQk4sSUFBSSxDQUFDTyxrQkFBaEMsRUFBb0RQLElBQXBELENBQWxC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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2hlY2tOcG1WZXJzaW9ucyB9IGZyb20gJ21ldGVvci90bWVhc2RheTpjaGVjay1ucG0tdmVyc2lvbnMnO1xuY2hlY2tOcG1WZXJzaW9ucyh7XG5cdFwibm9kZS1zY2hlZHVsZVwiOiBcIl4xLjMuMVwiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcbn0sICdzdGVlZG9zOndvcmtmbG93Jyk7IiwiLyohXG4gKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzXG4gKlxuICogVmVyc2lvbjogMS4xNy4wXG4gKlxuICogQXV0aG9yOiBSb2RuZXkgUmVobVxuICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvXG4gKlxuICogTGljZW5zZWQgdW5kZXJcbiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICogICBHUEwgdjMgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0dQTC0zLjBcbiAqXG4gKi9cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHQndXNlIHN0cmljdCc7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvcmV0dXJuRXhwb3J0cy5qc1xuXHQvLyBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdC8vICAgLy8gTm9kZVxuXHQvLyAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuL3B1bnljb2RlJyksIHJlcXVpcmUoJy4vSVB2NicpLCByZXF1aXJlKCcuL1NlY29uZExldmVsRG9tYWlucycpKTtcblx0Ly8gfSBlbHNlXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnLi9wdW55Y29kZScsICcuL0lQdjYnLCAnLi9TZWNvbmRMZXZlbERvbWFpbnMnXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcblx0XHRyb290LlVSSSA9IGZhY3Rvcnkocm9vdC5wdW55Y29kZSwgcm9vdC5JUHY2LCByb290LlNlY29uZExldmVsRG9tYWlucywgcm9vdCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKHB1bnljb2RlLCBJUHY2LCBTTEQsIHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmdsb2JhbCBsb2NhdGlvbiwgZXNjYXBlLCB1bmVzY2FwZSAqL1xuXHQvLyBGSVhNRTogdjIuMC4wIHJlbmFtY2Ugbm9uLWNhbWVsQ2FzZSBwcm9wZXJ0aWVzIHRvIHVwcGVyY2FzZVxuXHQvKmpzaGludCBjYW1lbGNhc2U6IGZhbHNlICovXG5cblx0Ly8gc2F2ZSBjdXJyZW50IFVSSSB2YXJpYWJsZSwgaWYgYW55XG5cdHZhciBfVVJJID0gcm9vdCAmJiByb290LlVSSTtcblxuXHRmdW5jdGlvbiBVUkkodXJsLCBiYXNlKSB7XG5cdFx0dmFyIF91cmxTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMTtcblx0XHR2YXIgX2Jhc2VTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjtcblxuXHRcdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRcdGlmICghKHRoaXMgaW5zdGFuY2VvZiBVUkkpKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdGlmIChfYmFzZVN1cHBsaWVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBVUkkodXJsLCBiYXNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgVVJJKHVybCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVVJJKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHVybCA9IGxvY2F0aW9uLmhyZWYgKyAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHVybCA9ICcnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaHJlZih1cmwpO1xuXG5cdFx0Ly8gcmVzb2x2ZSB0byBiYXNlIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbnN0cnVjdG9yXG5cdFx0aWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWJzb2x1dGVUbyhiYXNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdFVSSS52ZXJzaW9uID0gJzEuMTcuMCc7XG5cblx0dmFyIHAgPSBVUkkucHJvdG90eXBlO1xuXHR2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBlc2NhcGVSZWdFeChzdHJpbmcpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9jb21taXQvODVhYzIxNzgzYzExZjhjY2FiMDYxMDZkYmE5NzM1YTMxYTg2OTI0ZCNjb21taXRjb21tZW50LTgyMTk2M1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZSkge1xuXHRcdC8vIElFOCBkb2Vzbid0IHJldHVybiBbT2JqZWN0IFVuZGVmaW5lZF0gYnV0IFtPYmplY3QgT2JqZWN0XSBmb3IgdW5kZWZpbmVkIHZhbHVlXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnVW5kZWZpbmVkJztcblx0XHR9XG5cblx0XHRyZXR1cm4gU3RyaW5nKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpLnNsaWNlKDgsIC0xKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG5cdFx0cmV0dXJuIGdldFR5cGUob2JqKSA9PT0gJ0FycmF5Jztcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbHRlckFycmF5VmFsdWVzKGRhdGEsIHZhbHVlKSB7XG5cdFx0dmFyIGxvb2t1cCA9IHt9O1xuXHRcdHZhciBpLCBsZW5ndGg7XG5cblx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRsb29rdXAgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGxvb2t1cFt2YWx1ZVtpXV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb29rdXBbdmFsdWVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogdHJ1ZSAqL1xuXHRcdFx0dmFyIF9tYXRjaCA9IGxvb2t1cCAmJiBsb29rdXBbZGF0YVtpXV0gIT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCAhbG9va3VwICYmIHZhbHVlLnRlc3QoZGF0YVtpXSk7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogZmFsc2UgKi9cblx0XHRcdGlmIChfbWF0Y2gpIHtcblx0XHRcdFx0ZGF0YS5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGxlbmd0aC0tO1xuXHRcdFx0XHRpLS07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheUNvbnRhaW5zKGxpc3QsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aDtcblxuXHRcdC8vIHZhbHVlIG1heSBiZSBzdHJpbmcsIG51bWJlciwgYXJyYXksIHJlZ2V4cFxuXHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Ly8gTm90ZTogdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRvIE8obikgKGluc3RlYWQgb2YgY3VycmVudCBPKG0gKiBuKSlcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICghYXJyYXlDb250YWlucyhsaXN0LCB2YWx1ZVtpXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIF90eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF90eXBlID09PSAnUmVnRXhwJykge1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RbaV0gPT09ICdzdHJpbmcnICYmIGxpc3RbaV0ubWF0Y2godmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobGlzdFtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJyYXlzRXF1YWwob25lLCB0d28pIHtcblx0XHRpZiAoIWlzQXJyYXkob25lKSB8fCAhaXNBcnJheSh0d28pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gYXJyYXlzIGNhbid0IGJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50IG9mIGNvbnRlbnRcblx0XHRpZiAob25lLmxlbmd0aCAhPT0gdHdvLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdG9uZS5zb3J0KCk7XG5cdFx0dHdvLnNvcnQoKTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gb25lLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0aWYgKG9uZVtpXSAhPT0gdHdvW2ldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRyaW1TbGFzaGVzKHRleHQpIHtcblx0XHR2YXIgdHJpbV9leHByZXNzaW9uID0gL15cXC8rfFxcLyskL2c7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSh0cmltX2V4cHJlc3Npb24sICcnKTtcblx0fVxuXG5cdFVSSS5fcGFydHMgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvdG9jb2w6IG51bGwsXG5cdFx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdFx0aG9zdG5hbWU6IG51bGwsXG5cdFx0XHR1cm46IG51bGwsXG5cdFx0XHRwb3J0OiBudWxsLFxuXHRcdFx0cGF0aDogbnVsbCxcblx0XHRcdHF1ZXJ5OiBudWxsLFxuXHRcdFx0ZnJhZ21lbnQ6IG51bGwsXG5cdFx0XHQvLyBzdGF0ZVxuXHRcdFx0ZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzOiBVUkkuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLFxuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZTogVVJJLmVzY2FwZVF1ZXJ5U3BhY2Vcblx0XHR9O1xuXHR9O1xuXHQvLyBzdGF0ZTogYWxsb3cgZHVwbGljYXRlIHF1ZXJ5IHBhcmFtZXRlcnMgKGE9MSZhPTEpXG5cdFVSSS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMgPSBmYWxzZTtcblx0Ly8gc3RhdGU6IHJlcGxhY2VzICsgd2l0aCAlMjAgKHNwYWNlIGluIHF1ZXJ5IHN0cmluZ3MpXG5cdFVSSS5lc2NhcGVRdWVyeVNwYWNlID0gdHJ1ZTtcblx0Ly8gc3RhdGljIHByb3BlcnRpZXNcblx0VVJJLnByb3RvY29sX2V4cHJlc3Npb24gPSAvXlthLXpdW2EtejAtOS4rLV0qJC9pO1xuXHRVUkkuaWRuX2V4cHJlc3Npb24gPSAvW15hLXowLTlcXC4tXS9pO1xuXHRVUkkucHVueWNvZGVfZXhwcmVzc2lvbiA9IC8oeG4tLSkvaTtcblx0Ly8gd2VsbCwgMzMzLjQ0NC41NTUuNjY2IG1hdGNoZXMsIGJ1dCBpdCBzdXJlIGFpbid0IG5vIElQdjQgLSBkbyB3ZSBjYXJlP1xuXHRVUkkuaXA0X2V4cHJlc3Npb24gPSAvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC87XG5cdC8vIGNyZWRpdHMgdG8gUmljaCBCcm93blxuXHQvLyBzb3VyY2U6IGh0dHA6Ly9mb3J1bXMuaW50ZXJtYXBwZXIuY29tL3ZpZXd0b3BpYy5waHA/cD0xMDk2IzEwOTZcblx0Ly8gc3BlY2lmaWNhdGlvbjogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDI5MS50eHRcblx0VVJJLmlwNl9leHByZXNzaW9uID0gL15cXHMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKCUuKyk/XFxzKiQvO1xuXHQvLyBleHByZXNzaW9uIHVzZWQgaXMgXCJncnViZXIgcmV2aXNlZFwiIChAZ3J1YmVyIHYyKSBkZXRlcm1pbmVkIHRvIGJlIHRoZVxuXHQvLyBiZXN0IHNvbHV0aW9uIGluIGEgcmVnZXgtZ29sZiB3ZSBkaWQgYSBjb3VwbGUgb2YgYWdlcyBhZ28gYXRcblx0Ly8gKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9kZW1vL3VybC1yZWdleFxuXHQvLyAqIGh0dHA6Ly9yb2RuZXlyZWhtLmRlL3QvdXJsLXJlZ2V4Lmh0bWxcblx0VVJJLmZpbmRfdXJpX2V4cHJlc3Npb24gPSAvXFxiKCg/OlthLXpdW1xcdy1dKzooPzpcXC97MSwzfXxbYS16MC05JV0pfHd3d1xcZHswLDN9Wy5dfFthLXowLTkuXFwtXStbLl1bYS16XXsyLDR9XFwvKSg/OlteXFxzKCk8Pl0rfFxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCkpKyg/OlxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCl8W15cXHNgISgpXFxbXFxde307OidcIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pZztcblx0VVJJLmZpbmRVcmkgPSB7XG5cdFx0Ly8gdmFsaWQgXCJzY2hlbWU6Ly9cIiBvciBcInd3dy5cIlxuXHRcdHN0YXJ0OiAvXFxiKD86KFthLXpdW2EtejAtOS4rLV0qOlxcL1xcLyl8d3d3XFwuKS9naSxcblx0XHQvLyBldmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IHdoaXRlc3BhY2Vcblx0XHRlbmQ6IC9bXFxzXFxyXFxuXXwkLyxcblx0XHQvLyB0cmltIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGNhcHR1cmVkIGJ5IGVuZCBSZWdFeHBcblx0XHR0cmltOiAvW2AhKClcXFtcXF17fTs6J1wiLiw8Pj/Cq8K74oCc4oCd4oCe4oCY4oCZXSskL1xuXHR9O1xuXHQvLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzLmh0bWxcblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1RDUF9hbmRfVURQX3BvcnRfbnVtYmVycyNXZWxsLWtub3duX3BvcnRzXG5cdFVSSS5kZWZhdWx0UG9ydHMgPSB7XG5cdFx0aHR0cDogJzgwJyxcblx0XHRodHRwczogJzQ0MycsXG5cdFx0ZnRwOiAnMjEnLFxuXHRcdGdvcGhlcjogJzcwJyxcblx0XHR3czogJzgwJyxcblx0XHR3c3M6ICc0NDMnXG5cdH07XG5cdC8vIGFsbG93ZWQgaG9zdG5hbWUgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0Ly8gQUxQSEEgRElHSVQgXCItXCIgXCIuXCIgXCJfXCIgXCJ+XCIgXCIhXCIgXCIkXCIgXCImXCIgXCInXCIgXCIoXCIgXCIpXCIgXCIqXCIgXCIrXCIgXCIsXCIgXCI7XCIgXCI9XCIgJWVuY29kZWRcblx0Ly8gSSd2ZSBuZXZlciBzZWVuIGEgKG5vbi1JRE4pIGhvc3RuYW1lIG90aGVyIHRoYW46IEFMUEhBIERJR0lUIC4gLVxuXHRVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzID0gL1teYS16QS1aMC05XFwuLV0vO1xuXHQvLyBtYXAgRE9NIEVsZW1lbnRzIHRvIHRoZWlyIFVSSSBhdHRyaWJ1dGVcblx0VVJJLmRvbUF0dHJpYnV0ZXMgPSB7XG5cdFx0J2EnOiAnaHJlZicsXG5cdFx0J2Jsb2NrcXVvdGUnOiAnY2l0ZScsXG5cdFx0J2xpbmsnOiAnaHJlZicsXG5cdFx0J2Jhc2UnOiAnaHJlZicsXG5cdFx0J3NjcmlwdCc6ICdzcmMnLFxuXHRcdCdmb3JtJzogJ2FjdGlvbicsXG5cdFx0J2ltZyc6ICdzcmMnLFxuXHRcdCdhcmVhJzogJ2hyZWYnLFxuXHRcdCdpZnJhbWUnOiAnc3JjJyxcblx0XHQnZW1iZWQnOiAnc3JjJyxcblx0XHQnc291cmNlJzogJ3NyYycsXG5cdFx0J3RyYWNrJzogJ3NyYycsXG5cdFx0J2lucHV0JzogJ3NyYycsIC8vIGJ1dCBvbmx5IGlmIHR5cGU9XCJpbWFnZVwiXG5cdFx0J2F1ZGlvJzogJ3NyYycsXG5cdFx0J3ZpZGVvJzogJ3NyYydcblx0fTtcblx0VVJJLmdldERvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRpZiAoIW5vZGUgfHwgIW5vZGUubm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdC8vIDxpbnB1dD4gc2hvdWxkIG9ubHkgZXhwb3NlIHNyYyBmb3IgdHlwZT1cImltYWdlXCJcblx0XHRpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgbm9kZS50eXBlICE9PSAnaW1hZ2UnKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBVUkkuZG9tQXR0cmlidXRlc1tub2RlTmFtZV07XG5cdH07XG5cblx0ZnVuY3Rpb24gZXNjYXBlRm9yRHVtYkZpcmVmb3gzNih2YWx1ZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy85MVxuXHRcdHJldHVybiBlc2NhcGUodmFsdWUpO1xuXHR9XG5cblx0Ly8gZW5jb2RpbmcgLyBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUkZDMzk4NlxuXHRmdW5jdGlvbiBzdHJpY3RFbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSB7XG5cdFx0Ly8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZW5jb2RlVVJJQ29tcG9uZW50XG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpXG5cdFx0XHQucmVwbGFjZSgvWyEnKCkqXS9nLCBlc2NhcGVGb3JEdW1iRmlyZWZveDM2KVxuXHRcdFx0LnJlcGxhY2UoL1xcKi9nLCAnJTJBJyk7XG5cdH1cblx0VVJJLmVuY29kZSA9IHN0cmljdEVuY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmlzbzg4NTkgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0fTtcblx0VVJJLnVuaWNvZGUgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdH07XG5cdFVSSS5jaGFyYWN0ZXJzID0ge1xuXHRcdHBhdGhuYW1lOiB7XG5cdFx0XHRlbmNvZGU6IHtcblx0XHRcdFx0Ly8gUkZDMzk4NiAyLjE6IEZvciBjb25zaXN0ZW5jeSwgVVJJIHByb2R1Y2VycyBhbmQgbm9ybWFsaXplcnMgc2hvdWxkXG5cdFx0XHRcdC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuXG5cdFx0XHRcdGV4cHJlc3Npb246IC8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Ly8gLS5ffiEnKCkqXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI2JzogJyYnLFxuXHRcdFx0XHRcdCclMkInOiAnKycsXG5cdFx0XHRcdFx0JyUyQyc6ICcsJyxcblx0XHRcdFx0XHQnJTNCJzogJzsnLFxuXHRcdFx0XHRcdCclM0QnOiAnPScsXG5cdFx0XHRcdFx0JyUzQSc6ICc6Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jXS9nLFxuXHRcdFx0XHRtYXA6IHtcblx0XHRcdFx0XHQnLyc6ICclMkYnLFxuXHRcdFx0XHRcdCc/JzogJyUzRicsXG5cdFx0XHRcdFx0JyMnOiAnJTIzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZXNlcnZlZDoge1xuXHRcdFx0ZW5jb2RlOiB7XG5cdFx0XHRcdC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZFxuXHRcdFx0XHQvLyB1c2UgdXBwZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cyBmb3IgYWxsIHBlcmNlbnQtZW5jb2RpbmdzLlxuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyM3wyNHwyNnwyN3wyOHwyOXwyQXwyQnwyQ3wyRnwzQXwzQnwzRHwzRnw0MHw1Qnw1RCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdC8vIGdlbi1kZWxpbXNcblx0XHRcdFx0XHQnJTNBJzogJzonLFxuXHRcdFx0XHRcdCclMkYnOiAnLycsXG5cdFx0XHRcdFx0JyUzRic6ICc/Jyxcblx0XHRcdFx0XHQnJTIzJzogJyMnLFxuXHRcdFx0XHRcdCclNUInOiAnWycsXG5cdFx0XHRcdFx0JyU1RCc6ICddJyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnLFxuXHRcdFx0XHRcdC8vIHN1Yi1kZWxpbXNcblx0XHRcdFx0XHQnJTIxJzogJyEnLFxuXHRcdFx0XHRcdCclMjQnOiAnJCcsXG5cdFx0XHRcdFx0JyUyNic6ICcmJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR1cm5wYXRoOiB7XG5cdFx0XHQvLyBUaGUgY2hhcmFjdGVycyB1bmRlciBgZW5jb2RlYCBhcmUgdGhlIGNoYXJhY3RlcnMgY2FsbGVkIG91dCBieSBSRkMgMjE0MSBhcyBiZWluZyBhY2NlcHRhYmxlXG5cdFx0XHQvLyBmb3IgdXNhZ2UgaW4gYSBVUk4uIFJGQzIxNDEgYWxzbyBjYWxscyBvdXQgXCItXCIsIFwiLlwiLCBhbmQgXCJfXCIgYXMgYWNjZXB0YWJsZSBjaGFyYWN0ZXJzLCBidXRcblx0XHRcdC8vIHRoZXNlIGFyZW4ndCBlbmNvZGVkIGJ5IGVuY29kZVVSSUNvbXBvbmVudCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRoZW0gb3V0IGhlcmUuIEFsc29cblx0XHRcdC8vIG5vdGUgdGhhdCB0aGUgY29sb24gY2hhcmFjdGVyIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGUgZW5jb2RpbmcgbWFwOyB0aGlzIGlzIGJlY2F1c2UgVVJJLmpzXG5cdFx0XHQvLyBnaXZlcyB0aGUgY29sb25zIGluIFVSTnMgc2VtYW50aWMgbWVhbmluZyBhcyB0aGUgZGVsaW1pdGVycyBvZiBwYXRoIHNlZ2VtZW50cywgYW5kIHNvIGl0XG5cdFx0XHQvLyBzaG91bGQgbm90IGFwcGVhciB1bmVuY29kZWQgaW4gYSBzZWdtZW50IGl0c2VsZi5cblx0XHRcdC8vIFNlZSBhbHNvIHRoZSBub3RlIGFib3ZlIGFib3V0IFJGQzM5ODYgYW5kIGNhcGl0YWxhbGl6ZWQgaGV4IGRpZ2l0cy5cblx0XHRcdGVuY29kZToge1xuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyNHwyN3wyOHwyOXwyQXwyQnwyQ3wzQnwzRHw0MCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdCclMjEnOiAnIScsXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBUaGVzZSBjaGFyYWN0ZXJzIGFyZSB0aGUgY2hhcmFjdGVycyBjYWxsZWQgb3V0IGJ5IFJGQzIxNDEgYXMgXCJyZXNlcnZlZFwiIGNoYXJhY3RlcnMgdGhhdFxuXHRcdFx0Ly8gc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBhIFVSTiwgcGx1cyB0aGUgY29sb24gY2hhcmFjdGVyIChzZWUgbm90ZSBhYm92ZSkuXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jOl0vZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Jy8nOiAnJTJGJyxcblx0XHRcdFx0XHQnPyc6ICclM0YnLFxuXHRcdFx0XHRcdCcjJzogJyUyMycsXG5cdFx0XHRcdFx0JzonOiAnJTNBJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRVUkkuZW5jb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHR2YXIgZXNjYXBlZCA9IFVSSS5lbmNvZGUoc3RyaW5nICsgJycpO1xuXHRcdGlmIChlc2NhcGVRdWVyeVNwYWNlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVzY2FwZVF1ZXJ5U3BhY2UgPSBVUkkuZXNjYXBlUXVlcnlTcGFjZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXNjYXBlUXVlcnlTcGFjZSA/IGVzY2FwZWQucmVwbGFjZSgvJTIwL2csICcrJykgOiBlc2NhcGVkO1xuXHR9O1xuXHRVUkkuZGVjb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRzdHJpbmcgKz0gJyc7XG5cdFx0aWYgKGVzY2FwZVF1ZXJ5U3BhY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZSA9IFVSSS5lc2NhcGVRdWVyeVNwYWNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gVVJJLmRlY29kZShlc2NhcGVRdWVyeVNwYWNlID8gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTIwJykgOiBzdHJpbmcpO1xuXHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0Ly8gd2UncmUgbm90IGdvaW5nIHRvIG1lc3Mgd2l0aCB3ZWlyZCBlbmNvZGluZ3MsXG5cdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvODdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvOTJcblx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXHQvLyBnZW5lcmF0ZSBlbmNvZGUvZGVjb2RlIHBhdGggZnVuY3Rpb25zXG5cdHZhciBfcGFydHMgPSB7J2VuY29kZSc6J2VuY29kZScsICdkZWNvZGUnOidkZWNvZGUnfTtcblx0dmFyIF9wYXJ0O1xuXHR2YXIgZ2VuZXJhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uKF9ncm91cCwgX3BhcnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gVVJJW19wYXJ0XShzdHJpbmcgKyAnJykucmVwbGFjZShVUkkuY2hhcmFjdGVyc1tfZ3JvdXBdW19wYXJ0XS5leHByZXNzaW9uLCBmdW5jdGlvbihjKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFVSSS5jaGFyYWN0ZXJzW19ncm91cF1bX3BhcnRdLm1hcFtjXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIHdlJ3JlIG5vdCBnb2luZyB0byBtZXNzIHdpdGggd2VpcmQgZW5jb2RpbmdzLFxuXHRcdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy84N1xuXHRcdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvaXNzdWVzLzkyXG5cdFx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRmb3IgKF9wYXJ0IGluIF9wYXJ0cykge1xuXHRcdFVSSVtfcGFydCArICdQYXRoU2VnbWVudCddID0gZ2VuZXJhdGVBY2Nlc3NvcigncGF0aG5hbWUnLCBfcGFydHNbX3BhcnRdKTtcblx0XHRVUklbX3BhcnQgKyAnVXJuUGF0aFNlZ21lbnQnXSA9IGdlbmVyYXRlQWNjZXNzb3IoJ3VybnBhdGgnLCBfcGFydHNbX3BhcnRdKTtcblx0fVxuXG5cdHZhciBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbiA9IGZ1bmN0aW9uKF9zZXAsIF9jb2RpbmdGdW5jTmFtZSwgX2lubmVyQ29kaW5nRnVuY05hbWUpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHQvLyBXaHkgcGFzcyBpbiBuYW1lcyBvZiBmdW5jdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXM/IFRoZVxuXHRcdFx0Ly8gZGVmaW5pdGlvbnMgb2Ygc29tZSBmdW5jdGlvbnMgKGJ1dCBpbiBwYXJ0aWN1bGFyLCBVUkkuZGVjb2RlKSB3aWxsIG9jY2FzaW9uYWxseSBjaGFuZ2UgZHVlXG5cdFx0XHQvLyB0byBVUkkuanMgaGF2aW5nIElTTzg4NTkgYW5kIFVuaWNvZGUgbW9kZXMuIFBhc3NpbmcgaW4gdGhlIG5hbWUgYW5kIGdldHRpbmcgaXQgd2lsbCBlbnN1cmVcblx0XHRcdC8vIHRoYXQgdGhlIGZ1bmN0aW9ucyB3ZSB1c2UgaGVyZSBhcmUgXCJmcmVzaFwiLlxuXHRcdFx0dmFyIGFjdHVhbENvZGluZ0Z1bmM7XG5cdFx0XHRpZiAoIV9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBVUklbX2NvZGluZ0Z1bmNOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gVVJJW19jb2RpbmdGdW5jTmFtZV0oVVJJW19pbm5lckNvZGluZ0Z1bmNOYW1lXShzdHJpbmcpKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHNlZ21lbnRzID0gKHN0cmluZyArICcnKS5zcGxpdChfc2VwKTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNlZ21lbnRzW2ldID0gYWN0dWFsQ29kaW5nRnVuYyhzZWdtZW50c1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWdtZW50cy5qb2luKF9zZXApO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVGhpcyB0YWtlcyBwbGFjZSBvdXRzaWRlIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCwgZS5nLiwgZW5jb2RlVXJuUGF0aCBmdW5jdGlvbnMuXG5cdFVSSS5kZWNvZGVQYXRoID0gZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24oJy8nLCAnZGVjb2RlUGF0aFNlZ21lbnQnKTtcblx0VVJJLmRlY29kZVVyblBhdGggPSBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbignOicsICdkZWNvZGVVcm5QYXRoU2VnbWVudCcpO1xuXHRVUkkucmVjb2RlUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCcvJywgJ2VuY29kZVBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXHRVUkkucmVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCc6JywgJ2VuY29kZVVyblBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXG5cdFVSSS5lbmNvZGVSZXNlcnZlZCA9IGdlbmVyYXRlQWNjZXNzb3IoJ3Jlc2VydmVkJywgJ2VuY29kZScpO1xuXG5cdFVSSS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHR2YXIgcG9zO1xuXHRcdGlmICghcGFydHMpIHtcblx0XHRcdHBhcnRzID0ge307XG5cdFx0fVxuXHRcdC8vIFtwcm90b2NvbFwiOi8vXCJbdXNlcm5hbWVbXCI6XCJwYXNzd29yZF1cIkBcIl1ob3N0bmFtZVtcIjpcInBvcnRdXCIvXCI/XVtwYXRoXVtcIj9cInF1ZXJ5c3RyaW5nXVtcIiNcImZyYWdtZW50XVxuXG5cdFx0Ly8gZXh0cmFjdCBmcmFnbWVudFxuXHRcdHBvcyA9IHN0cmluZy5pbmRleE9mKCcjJyk7XG5cdFx0aWYgKHBvcyA+IC0xKSB7XG5cdFx0XHQvLyBlc2NhcGluZz9cblx0XHRcdHBhcnRzLmZyYWdtZW50ID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxKSB8fCBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuXHRcdH1cblxuXHRcdC8vIGV4dHJhY3QgcXVlcnlcblx0XHRwb3MgPSBzdHJpbmcuaW5kZXhPZignPycpO1xuXHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0Ly8gZXNjYXBpbmc/XG5cdFx0XHRwYXJ0cy5xdWVyeSA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTtcblx0XHR9XG5cblx0XHQvLyBleHRyYWN0IHByb3RvY29sXG5cdFx0aWYgKHN0cmluZy5zdWJzdHJpbmcoMCwgMikgPT09ICcvLycpIHtcblx0XHRcdC8vIHJlbGF0aXZlLXNjaGVtZVxuXHRcdFx0cGFydHMucHJvdG9jb2wgPSBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygyKTtcblx0XHRcdC8vIGV4dHJhY3QgXCJ1c2VyOnBhc3NAaG9zdDpwb3J0XCJcblx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zID0gc3RyaW5nLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0XHRwYXJ0cy5wcm90b2NvbCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAocGFydHMucHJvdG9jb2wgJiYgIXBhcnRzLnByb3RvY29sLm1hdGNoKFVSSS5wcm90b2NvbF9leHByZXNzaW9uKSkge1xuXHRcdFx0XHRcdC8vIDogbWF5IGJlIHdpdGhpbiB0aGUgcGF0aFxuXHRcdFx0XHRcdHBhcnRzLnByb3RvY29sID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykgPT09ICcvLycpIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDMpO1xuXG5cdFx0XHRcdFx0Ly8gZXh0cmFjdCBcInVzZXI6cGFzc0Bob3N0OnBvcnRcIlxuXHRcdFx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdFx0XHRcdHBhcnRzLnVybiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB3aGF0J3MgbGVmdCBtdXN0IGJlIHRoZSBwYXRoXG5cdFx0cGFydHMucGF0aCA9IHN0cmluZztcblxuXHRcdC8vIGFuZCB3ZSdyZSBkb25lXG5cdFx0cmV0dXJuIHBhcnRzO1xuXHR9O1xuXHRVUkkucGFyc2VIb3N0ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuXHRcdC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuXHRcdC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2Jsb2IvMzg2ZmQyNGY0OWIwZTlkMWE4YTA3NjU5MmE0MDQxNjhmYWVlY2MzNC9saWIvdXJsLmpzI0wxMTUtTDEyNFxuXHRcdC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvcHVsbC8yMzNcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5cdFx0Ly8gZXh0cmFjdCBob3N0OnBvcnRcblx0XHR2YXIgcG9zID0gc3RyaW5nLmluZGV4T2YoJy8nKTtcblx0XHR2YXIgYnJhY2tldFBvcztcblx0XHR2YXIgdDtcblxuXHRcdGlmIChwb3MgPT09IC0xKSB7XG5cdFx0XHRwb3MgPSBzdHJpbmcubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChzdHJpbmcuY2hhckF0KDApID09PSAnWycpIHtcblx0XHRcdC8vIElQdjYgaG9zdCAtIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtNm1hbi10ZXh0LWFkZHItcmVwcmVzZW50YXRpb24tMDQjc2VjdGlvbi02XG5cdFx0XHQvLyBJIGNsYWltIG1vc3QgY2xpZW50IHNvZnR3YXJlIGJyZWFrcyBvbiBJUHY2IGFueXdheXMuIFRvIHNpbXBsaWZ5IHRoaW5ncywgVVJJIG9ubHkgYWNjZXB0c1xuXHRcdFx0Ly8gSVB2Nitwb3J0IGluIHRoZSBmb3JtYXQgWzIwMDE6ZGI4OjoxXTo4MCAoZm9yIHRoZSB0aW1lIGJlaW5nKVxuXHRcdFx0YnJhY2tldFBvcyA9IHN0cmluZy5pbmRleE9mKCddJyk7XG5cdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHN0cmluZy5zdWJzdHJpbmcoMSwgYnJhY2tldFBvcykgfHwgbnVsbDtcblx0XHRcdHBhcnRzLnBvcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGJyYWNrZXRQb3MgKyAyLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRpZiAocGFydHMucG9ydCA9PT0gJy8nKSB7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZmlyc3RDb2xvbiA9IHN0cmluZy5pbmRleE9mKCc6Jyk7XG5cdFx0XHR2YXIgZmlyc3RTbGFzaCA9IHN0cmluZy5pbmRleE9mKCcvJyk7XG5cdFx0XHR2YXIgbmV4dENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBmaXJzdENvbG9uICsgMSk7XG5cdFx0XHRpZiAobmV4dENvbG9uICE9PSAtMSAmJiAoZmlyc3RTbGFzaCA9PT0gLTEgfHwgbmV4dENvbG9uIDwgZmlyc3RTbGFzaCkpIHtcblx0XHRcdFx0Ly8gSVB2NiBob3N0IGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ucyAtIGJ1dCBubyBwb3J0XG5cdFx0XHRcdC8vIHRoaXMgbm90YXRpb24gaXMgYWN0dWFsbHkgbm90IGFsbG93ZWQgYnkgUkZDIDM5ODYsIGJ1dCB3ZSdyZSBhIGxpYmVyYWwgcGFyc2VyXG5cdFx0XHRcdHBhcnRzLmhvc3RuYW1lID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHRbMF0gfHwgbnVsbDtcblx0XHRcdFx0cGFydHMucG9ydCA9IHRbMV0gfHwgbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocGFydHMuaG9zdG5hbWUgJiYgc3RyaW5nLnN1YnN0cmluZyhwb3MpLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRwb3MrKztcblx0XHRcdHN0cmluZyA9ICcvJyArIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwb3MpIHx8ICcvJztcblx0fTtcblx0VVJJLnBhcnNlQXV0aG9yaXR5ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdHN0cmluZyA9IFVSSS5wYXJzZVVzZXJpbmZvKHN0cmluZywgcGFydHMpO1xuXHRcdHJldHVybiBVUkkucGFyc2VIb3N0KHN0cmluZywgcGFydHMpO1xuXHR9O1xuXHRVUkkucGFyc2VVc2VyaW5mbyA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHQvLyBleHRyYWN0IHVzZXJuYW1lOnBhc3N3b3JkXG5cdFx0dmFyIGZpcnN0U2xhc2ggPSBzdHJpbmcuaW5kZXhPZignLycpO1xuXHRcdHZhciBwb3MgPSBzdHJpbmcubGFzdEluZGV4T2YoJ0AnLCBmaXJzdFNsYXNoID4gLTEgPyBmaXJzdFNsYXNoIDogc3RyaW5nLmxlbmd0aCAtIDEpO1xuXHRcdHZhciB0O1xuXG5cdFx0Ly8gYXV0aG9yaXR5QCBtdXN0IGNvbWUgYmVmb3JlIC9wYXRoXG5cdFx0aWYgKHBvcyA+IC0xICYmIChmaXJzdFNsYXNoID09PSAtMSB8fCBwb3MgPCBmaXJzdFNsYXNoKSkge1xuXHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0cGFydHMudXNlcm5hbWUgPSB0WzBdID8gVVJJLmRlY29kZSh0WzBdKSA6IG51bGw7XG5cdFx0XHR0LnNoaWZ0KCk7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IHRbMF0gPyBVUkkuZGVjb2RlKHQuam9pbignOicpKSA6IG51bGw7XG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJ0cy51c2VybmFtZSA9IG51bGw7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblx0VVJJLnBhcnNlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdC8vIHRocm93IG91dCB0aGUgZnVua3kgYnVzaW5lc3MgLSBcIj9cIltuYW1lXCI9XCJ2YWx1ZVwiJlwiXStcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJisvZywgJyYnKS5yZXBsYWNlKC9eXFw/KiYqfCYrJC9nLCAnJyk7XG5cblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdHZhciBpdGVtcyA9IHt9O1xuXHRcdHZhciBzcGxpdHMgPSBzdHJpbmcuc3BsaXQoJyYnKTtcblx0XHR2YXIgbGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcblx0XHR2YXIgdiwgbmFtZSwgdmFsdWU7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2ID0gc3BsaXRzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRuYW1lID0gVVJJLmRlY29kZVF1ZXJ5KHYuc2hpZnQoKSwgZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHQvLyBubyBcIj1cIiBpcyBudWxsIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHRcdHZhbHVlID0gdi5sZW5ndGggPyBVUkkuZGVjb2RlUXVlcnkodi5qb2luKCc9JyksIGVzY2FwZVF1ZXJ5U3BhY2UpIDogbnVsbDtcblxuXHRcdFx0aWYgKGhhc093bi5jYWxsKGl0ZW1zLCBuYW1lKSkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW1zW25hbWVdID09PSAnc3RyaW5nJyB8fCBpdGVtc1tuYW1lXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGl0ZW1zW25hbWVdID0gW2l0ZW1zW25hbWVdXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1zW25hbWVdLnB1c2godmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXRlbXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbXM7XG5cdH07XG5cblx0VVJJLmJ1aWxkID0gZnVuY3Rpb24ocGFydHMpIHtcblx0XHR2YXIgdCA9ICcnO1xuXG5cdFx0aWYgKHBhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHBhcnRzLnByb3RvY29sICsgJzonO1xuXHRcdH1cblxuXHRcdGlmICghcGFydHMudXJuICYmICh0IHx8IHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnLy8nO1xuXHRcdH1cblxuXHRcdHQgKz0gKFVSSS5idWlsZEF1dGhvcml0eShwYXJ0cykgfHwgJycpO1xuXG5cdFx0aWYgKHR5cGVvZiBwYXJ0cy5wYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHBhcnRzLnBhdGguY2hhckF0KDApICE9PSAnLycgJiYgdHlwZW9mIHBhcnRzLmhvc3RuYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHR0ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0dCArPSBwYXJ0cy5wYXRoO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMucXVlcnkgPT09ICdzdHJpbmcnICYmIHBhcnRzLnF1ZXJ5KSB7XG5cdFx0XHR0ICs9ICc/JyArIHBhcnRzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMuZnJhZ21lbnQgPT09ICdzdHJpbmcnICYmIHBhcnRzLmZyYWdtZW50KSB7XG5cdFx0XHR0ICs9ICcjJyArIHBhcnRzLmZyYWdtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkSG9zdCA9IGZ1bmN0aW9uKHBhcnRzKSB7XG5cdFx0dmFyIHQgPSAnJztcblxuXHRcdGlmICghcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IGVsc2UgaWYgKFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnWycgKyBwYXJ0cy5ob3N0bmFtZSArICddJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCArPSBwYXJ0cy5ob3N0bmFtZTtcblx0XHR9XG5cblx0XHRpZiAocGFydHMucG9ydCkge1xuXHRcdFx0dCArPSAnOicgKyBwYXJ0cy5wb3J0O1xuXHRcdH1cblxuXHRcdHJldHVybiB0O1xuXHR9O1xuXHRVUkkuYnVpbGRBdXRob3JpdHkgPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHJldHVybiBVUkkuYnVpbGRVc2VyaW5mbyhwYXJ0cykgKyBVUkkuYnVpbGRIb3N0KHBhcnRzKTtcblx0fTtcblx0VVJJLmJ1aWxkVXNlcmluZm8gPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHZhciB0ID0gJyc7XG5cblx0XHRpZiAocGFydHMudXNlcm5hbWUpIHtcblx0XHRcdHQgKz0gVVJJLmVuY29kZShwYXJ0cy51c2VybmFtZSk7XG5cblx0XHRcdGlmIChwYXJ0cy5wYXNzd29yZCkge1xuXHRcdFx0XHR0ICs9ICc6JyArIFVSSS5lbmNvZGUocGFydHMucGFzc3dvcmQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0ICs9ICdAJztcblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBkdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHQvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiBvciBodHRwOi8vbGFicy5hcGFjaGUub3JnL3dlYmFyY2gvdXJpL3JmYy9yZmMzOTg2Lmh0bWxcblx0XHQvLyBiZWluZyDCuy0uX34hJCYnKCkqKyw7PTpALz/CqyAlSEVYIGFuZCBhbG51bSBhcmUgYWxsb3dlZFxuXHRcdC8vIHRoZSBSRkMgZXhwbGljaXRseSBzdGF0ZXMgPy9mb28gYmVpbmcgYSB2YWxpZCB1c2UgY2FzZSwgbm8gbWVudGlvbiBvZiBwYXJhbWV0ZXIgc3ludGF4IVxuXHRcdC8vIFVSSS5qcyB0cmVhdHMgdGhlIHF1ZXJ5IHN0cmluZyBhcyBiZWluZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2Zvcm0tY29udGVudC10eXBlXG5cblx0XHR2YXIgdCA9ICcnO1xuXHRcdHZhciB1bmlxdWUsIGtleSwgaSwgbGVuZ3RoO1xuXHRcdGZvciAoa2V5IGluIGRhdGEpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChkYXRhLCBrZXkpICYmIGtleSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheShkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0dW5pcXVlID0ge307XG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gZGF0YVtrZXldLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldW2ldICE9PSB1bmRlZmluZWQgJiYgdW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHQgKz0gJyYnICsgVVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIoa2V5LCBkYXRhW2tleV1baV0sIGVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0ICs9ICcmJyArIFVSSS5idWlsZFF1ZXJ5UGFyYW1ldGVyKGtleSwgZGF0YVtrZXldLCBlc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0LnN1YnN0cmluZygxKTtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXNjYXBlUXVlcnlTcGFjZSkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNmb3JtLWNvbnRlbnQtdHlwZSAtLSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBkb24ndCBhcHBlbmQgXCI9XCIgZm9yIG51bGwgdmFsdWVzLCBhY2NvcmRpbmcgdG8gaHR0cDovL2R2Y3MudzMub3JnL2hnL3VybC9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCN1cmwtcGFyYW1ldGVyLXNlcmlhbGl6YXRpb25cblx0XHRyZXR1cm4gVVJJLmVuY29kZVF1ZXJ5KG5hbWUsIGVzY2FwZVF1ZXJ5U3BhY2UpICsgKHZhbHVlICE9PSBudWxsID8gJz0nICsgVVJJLmVuY29kZVF1ZXJ5KHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSA6ICcnKTtcblx0fTtcblxuXHRVUkkuYWRkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBuYW1lLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRhdGFbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGF0YVtuYW1lXSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IFtkYXRhW25hbWVdXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV07XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbbmFtZV0gPSAoZGF0YVtuYW1lXSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aCwga2V5O1xuXG5cdFx0aWYgKGlzQXJyYXkobmFtZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGF0YVtuYW1lW2ldXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGdldFR5cGUobmFtZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBkYXRhKSB7XG5cdFx0XHRcdGlmIChuYW1lLnRlc3Qoa2V5KSkge1xuXHRcdFx0XHRcdGRhdGFba2V5XSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLnJlbW92ZVF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pICYmIHZhbHVlLnRlc3QoZGF0YVtuYW1lXSkpIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSBmaWx0ZXJBcnJheVZhbHVlcyhkYXRhW25hbWVdLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFbbmFtZV0gPT09IFN0cmluZyh2YWx1ZSkgJiYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDEpKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5oYXNRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlLCB3aXRoaW5BcnJheSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0aWYgKCFVUkkuaGFzUXVlcnkoZGF0YSwga2V5LCBuYW1lW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlcicpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoZ2V0VHlwZSh2YWx1ZSkpIHtcblx0XHRcdGNhc2UgJ1VuZGVmaW5lZCc6XG5cdFx0XHRcdC8vIHRydWUgaWYgZXhpc3RzIChidXQgbWF5IGJlIGVtcHR5KVxuXHRcdFx0XHRyZXR1cm4gbmFtZSBpbiBkYXRhOyAvLyBkYXRhW25hbWVdICE9PSB1bmRlZmluZWQ7XG5cblx0XHRcdGNhc2UgJ0Jvb2xlYW4nOlxuXHRcdFx0XHQvLyB0cnVlIGlmIGV4aXN0cyBhbmQgbm9uLWVtcHR5XG5cdFx0XHRcdHZhciBfYm9vbHkgPSBCb29sZWFuKGlzQXJyYXkoZGF0YVtuYW1lXSkgPyBkYXRhW25hbWVdLmxlbmd0aCA6IGRhdGFbbmFtZV0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IF9ib29seTtcblxuXHRcdFx0Y2FzZSAnRnVuY3Rpb24nOlxuXHRcdFx0XHQvLyBhbGxvdyBjb21wbGV4IGNvbXBhcmlzb25cblx0XHRcdFx0cmV0dXJuICEhdmFsdWUoZGF0YVtuYW1lXSwgbmFtZSwgZGF0YSk7XG5cblx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9wID0gd2l0aGluQXJyYXkgPyBhcnJheUNvbnRhaW5zIDogYXJyYXlzRXF1YWw7XG5cdFx0XHRcdHJldHVybiBvcChkYXRhW25hbWVdLCB2YWx1ZSk7XG5cblx0XHRcdGNhc2UgJ1JlZ0V4cCc6XG5cdFx0XHRcdGlmICghaXNBcnJheShkYXRhW25hbWVdKSkge1xuXHRcdFx0XHRcdHJldHVybiBCb29sZWFuKGRhdGFbbmFtZV0gJiYgZGF0YVtuYW1lXS5tYXRjaCh2YWx1ZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0dmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnU3RyaW5nJzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGFbbmFtZV0gPT09IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyB1bmRlZmluZWQsIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBSZWdFeHAsIEZ1bmN0aW9uIGFzIHRoZSB2YWx1ZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cblxuXHRVUkkuY29tbW9uUGF0aCA9IGZ1bmN0aW9uKG9uZSwgdHdvKSB7XG5cdFx0dmFyIGxlbmd0aCA9IE1hdGgubWluKG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpO1xuXHRcdHZhciBwb3M7XG5cblx0XHQvLyBmaW5kIGZpcnN0IG5vbi1tYXRjaGluZyBjaGFyYWN0ZXJcblx0XHRmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbmd0aDsgcG9zKyspIHtcblx0XHRcdGlmIChvbmUuY2hhckF0KHBvcykgIT09IHR3by5jaGFyQXQocG9zKSkge1xuXHRcdFx0XHRwb3MtLTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBvcyA8IDEpIHtcblx0XHRcdHJldHVybiBvbmUuY2hhckF0KDApID09PSB0d28uY2hhckF0KDApICYmIG9uZS5jaGFyQXQoMCkgPT09ICcvJyA/ICcvJyA6ICcnO1xuXHRcdH1cblxuXHRcdC8vIHJldmVydCB0byBsYXN0IC9cblx0XHRpZiAob25lLmNoYXJBdChwb3MpICE9PSAnLycgfHwgdHdvLmNoYXJBdChwb3MpICE9PSAnLycpIHtcblx0XHRcdHBvcyA9IG9uZS5zdWJzdHJpbmcoMCwgcG9zKS5sYXN0SW5kZXhPZignLycpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpO1xuXHR9O1xuXG5cdFVSSS53aXRoaW5TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblx0XHR2YXIgX3N0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCBVUkkuZmluZFVyaS5zdGFydDtcblx0XHR2YXIgX2VuZCA9IG9wdGlvbnMuZW5kIHx8IFVSSS5maW5kVXJpLmVuZDtcblx0XHR2YXIgX3RyaW0gPSBvcHRpb25zLnRyaW0gfHwgVVJJLmZpbmRVcmkudHJpbTtcblx0XHR2YXIgX2F0dHJpYnV0ZU9wZW4gPSAvW2EtejAtOS1dPVtcIiddPyQvaTtcblxuXHRcdF9zdGFydC5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHR2YXIgbWF0Y2ggPSBfc3RhcnQuZXhlYyhzdHJpbmcpO1xuXHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRpZiAob3B0aW9ucy5pZ25vcmVIdG1sKSB7XG5cdFx0XHRcdC8vIGF0dHJpYnV0KGU9W1wiJ10/JClcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZU9wZW4gPSBzdHJpbmcuc2xpY2UoTWF0aC5tYXgoc3RhcnQgLSAzLCAwKSwgc3RhcnQpO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlT3BlbiAmJiBfYXR0cmlidXRlT3Blbi50ZXN0KGF0dHJpYnV0ZU9wZW4pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGVuZCA9IHN0YXJ0ICsgc3RyaW5nLnNsaWNlKHN0YXJ0KS5zZWFyY2goX2VuZCk7XG5cdFx0XHR2YXIgc2xpY2UgPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZShfdHJpbSwgJycpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaWdub3JlICYmIG9wdGlvbnMuaWdub3JlLnRlc3Qoc2xpY2UpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRlbmQgPSBzdGFydCArIHNsaWNlLmxlbmd0aDtcblx0XHRcdHZhciByZXN1bHQgPSBjYWxsYmFjayhzbGljZSwgc3RhcnQsIGVuZCwgc3RyaW5nKTtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zbGljZSgwLCBzdGFydCkgKyByZXN1bHQgKyBzdHJpbmcuc2xpY2UoZW5kKTtcblx0XHRcdF9zdGFydC5sYXN0SW5kZXggPSBzdGFydCArIHJlc3VsdC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0X3N0YXJ0Lmxhc3RJbmRleCA9IDA7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSA9IGZ1bmN0aW9uKHYpIHtcblx0XHQvLyBUaGVvcmV0aWNhbGx5IFVSSXMgYWxsb3cgcGVyY2VudC1lbmNvZGluZyBpbiBIb3N0bmFtZXMgKGFjY29yZGluZyB0byBSRkMgMzk4Nilcblx0XHQvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBETlMgYW5kIHRoZXJlZm9yZSBpZ25vcmVkIGJ5IFVSSS5qc1xuXG5cdFx0aWYgKHYubWF0Y2goVVJJLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpIHtcblx0XHRcdC8vIHRlc3QgcHVueWNvZGVcblx0XHRcdGlmICghcHVueWNvZGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHVueWNvZGUudG9BU0NJSSh2KS5tYXRjaChVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIG5vQ29uZmxpY3Rcblx0VVJJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbihyZW1vdmVBbGwpIHtcblx0XHRpZiAocmVtb3ZlQWxsKSB7XG5cdFx0XHR2YXIgdW5jb25mbGljdGVkID0ge1xuXHRcdFx0XHRVUkk6IHRoaXMubm9Db25mbGljdCgpXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocm9vdC5VUklUZW1wbGF0ZSAmJiB0eXBlb2Ygcm9vdC5VUklUZW1wbGF0ZS5ub0NvbmZsaWN0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHVuY29uZmxpY3RlZC5VUklUZW1wbGF0ZSA9IHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdC5JUHY2ICYmIHR5cGVvZiByb290LklQdjYubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuSVB2NiA9IHJvb3QuSVB2Ni5ub0NvbmZsaWN0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290LlNlY29uZExldmVsRG9tYWlucyAmJiB0eXBlb2Ygcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuU2Vjb25kTGV2ZWxEb21haW5zID0gcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5jb25mbGljdGVkO1xuXHRcdH0gZWxzZSBpZiAocm9vdC5VUkkgPT09IHRoaXMpIHtcblx0XHRcdHJvb3QuVVJJID0gX1VSSTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmJ1aWxkID0gZnVuY3Rpb24oZGVmZXJCdWlsZCkge1xuXHRcdGlmIChkZWZlckJ1aWxkID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChkZWZlckJ1aWxkID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZGVmZXJyZWRfYnVpbGQpIHtcblx0XHRcdHRoaXMuX3N0cmluZyA9IFVSSS5idWlsZCh0aGlzLl9wYXJ0cyk7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAuY2xvbmUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFVSSSh0aGlzKTtcblx0fTtcblxuXHRwLnZhbHVlT2YgPSBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnVpbGQoZmFsc2UpLl9zdHJpbmc7XG5cdH07XG5cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKF9wYXJ0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzW19wYXJ0XSB8fCAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzW19wYXJ0XSA9IHYgfHwgbnVsbDtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVQcmVmaXhBY2Nlc3NvcihfcGFydCwgX2tleSl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0c1tfcGFydF0gfHwgJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHYgPSB2ICsgJyc7XG5cdFx0XHRcdFx0aWYgKHYuY2hhckF0KDApID09PSBfa2V5KSB7XG5cdFx0XHRcdFx0XHR2ID0gdi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fcGFydHNbX3BhcnRdID0gdjtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cC5wcm90b2NvbCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3Byb3RvY29sJyk7XG5cdHAudXNlcm5hbWUgPSBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKCd1c2VybmFtZScpO1xuXHRwLnBhc3N3b3JkID0gZ2VuZXJhdGVTaW1wbGVBY2Nlc3NvcigncGFzc3dvcmQnKTtcblx0cC5ob3N0bmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ2hvc3RuYW1lJyk7XG5cdHAucG9ydCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3BvcnQnKTtcblx0cC5xdWVyeSA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ3F1ZXJ5JywgJz8nKTtcblx0cC5mcmFnbWVudCA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ2ZyYWdtZW50JywgJyMnKTtcblxuXHRwLnNlYXJjaCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0dmFyIHQgPSB0aGlzLnF1ZXJ5KHYsIGJ1aWxkKTtcblx0XHRyZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID8gKCc/JyArIHQpIDogdDtcblx0fTtcblx0cC5oYXNoID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgdCA9IHRoaXMuZnJhZ21lbnQodiwgYnVpbGQpO1xuXHRcdHJldHVybiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgdC5sZW5ndGggPyAoJyMnICsgdCkgOiB0O1xuXHR9O1xuXG5cdHAucGF0aG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGggfHwgKHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gJy8nIDogJycpO1xuXHRcdFx0cmV0dXJuIHYgPyAodGhpcy5fcGFydHMudXJuID8gVVJJLmRlY29kZVVyblBhdGggOiBVUkkuZGVjb2RlUGF0aCkocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVVcm5QYXRoKHYpIDogJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVQYXRoKHYpIDogJy8nO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnBhdGggPSBwLnBhdGhuYW1lO1xuXHRwLmhyZWYgPSBmdW5jdGlvbihocmVmLCBidWlsZCkge1xuXHRcdHZhciBrZXk7XG5cblx0XHRpZiAoaHJlZiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0cmluZyA9ICcnO1xuXHRcdHRoaXMuX3BhcnRzID0gVVJJLl9wYXJ0cygpO1xuXG5cdFx0dmFyIF9VUkkgPSBocmVmIGluc3RhbmNlb2YgVVJJO1xuXHRcdHZhciBfb2JqZWN0ID0gdHlwZW9mIGhyZWYgPT09ICdvYmplY3QnICYmIChocmVmLmhvc3RuYW1lIHx8IGhyZWYucGF0aCB8fCBocmVmLnBhdGhuYW1lKTtcblx0XHRpZiAoaHJlZi5ub2RlTmFtZSkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IFVSSS5nZXREb21BdHRyaWJ1dGUoaHJlZik7XG5cdFx0XHRocmVmID0gaHJlZlthdHRyaWJ1dGVdIHx8ICcnO1xuXHRcdFx0X29iamVjdCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHdpbmRvdy5sb2NhdGlvbiBpcyByZXBvcnRlZCB0byBiZSBhbiBvYmplY3QsIGJ1dCBpdCdzIG5vdCB0aGUgc29ydFxuXHRcdC8vIG9mIG9iamVjdCB3ZSdyZSBsb29raW5nIGZvcjpcblx0XHQvLyAqIGxvY2F0aW9uLnByb3RvY29sIGVuZHMgd2l0aCBhIGNvbG9uXG5cdFx0Ly8gKiBsb2NhdGlvbi5xdWVyeSAhPSBvYmplY3Quc2VhcmNoXG5cdFx0Ly8gKiBsb2NhdGlvbi5oYXNoICE9IG9iamVjdC5mcmFnbWVudFxuXHRcdC8vIHNpbXBseSBzZXJpYWxpemluZyB0aGUgdW5rbm93biBvYmplY3Qgc2hvdWxkIGRvIHRoZSB0cmlja1xuXHRcdC8vIChmb3IgbG9jYXRpb24sIG5vdCBmb3IgZXZlcnl0aGluZy4uLilcblx0XHRpZiAoIV9VUkkgJiYgX29iamVjdCAmJiBocmVmLnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGhyZWYgPSBocmVmLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBocmVmID09PSAnc3RyaW5nJyB8fCBocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cyA9IFVSSS5wYXJzZShTdHJpbmcoaHJlZiksIHRoaXMuX3BhcnRzKTtcblx0XHR9IGVsc2UgaWYgKF9VUkkgfHwgX29iamVjdCkge1xuXHRcdFx0dmFyIHNyYyA9IF9VUkkgPyBocmVmLl9wYXJ0cyA6IGhyZWY7XG5cdFx0XHRmb3IgKGtleSBpbiBzcmMpIHtcblx0XHRcdFx0aWYgKGhhc093bi5jYWxsKHRoaXMuX3BhcnRzLCBrZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGFydHNba2V5XSA9IHNyY1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5wdXQnKTtcblx0XHR9XG5cblx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Ly8gaWRlbnRpZmljYXRpb24gYWNjZXNzb3JzXG5cdHAuaXMgPSBmdW5jdGlvbih3aGF0KSB7XG5cdFx0dmFyIGlwID0gZmFsc2U7XG5cdFx0dmFyIGlwNCA9IGZhbHNlO1xuXHRcdHZhciBpcDYgPSBmYWxzZTtcblx0XHR2YXIgbmFtZSA9IGZhbHNlO1xuXHRcdHZhciBzbGQgPSBmYWxzZTtcblx0XHR2YXIgaWRuID0gZmFsc2U7XG5cdFx0dmFyIHB1bnljb2RlID0gZmFsc2U7XG5cdFx0dmFyIHJlbGF0aXZlID0gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0cmVsYXRpdmUgPSBmYWxzZTtcblx0XHRcdGlwNCA9IFVSSS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwNiA9IFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwID0gaXA0IHx8IGlwNjtcblx0XHRcdG5hbWUgPSAhaXA7XG5cdFx0XHRzbGQgPSBuYW1lICYmIFNMRCAmJiBTTEQuaGFzKHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlkbiA9IG5hbWUgJiYgVVJJLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdFx0cHVueWNvZGUgPSBuYW1lICYmIFVSSS5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAod2hhdC50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlICdyZWxhdGl2ZSc6XG5cdFx0XHRcdHJldHVybiByZWxhdGl2ZTtcblxuXHRcdFx0Y2FzZSAnYWJzb2x1dGUnOlxuXHRcdFx0XHRyZXR1cm4gIXJlbGF0aXZlO1xuXG5cdFx0XHQvLyBob3N0bmFtZSBpZGVudGlmaWNhdGlvblxuXHRcdFx0Y2FzZSAnZG9tYWluJzpcblx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRyZXR1cm4gbmFtZTtcblxuXHRcdFx0Y2FzZSAnc2xkJzpcblx0XHRcdFx0cmV0dXJuIHNsZDtcblxuXHRcdFx0Y2FzZSAnaXAnOlxuXHRcdFx0XHRyZXR1cm4gaXA7XG5cblx0XHRcdGNhc2UgJ2lwNCc6XG5cdFx0XHRjYXNlICdpcHY0Jzpcblx0XHRcdGNhc2UgJ2luZXQ0Jzpcblx0XHRcdFx0cmV0dXJuIGlwNDtcblxuXHRcdFx0Y2FzZSAnaXA2Jzpcblx0XHRcdGNhc2UgJ2lwdjYnOlxuXHRcdFx0Y2FzZSAnaW5ldDYnOlxuXHRcdFx0XHRyZXR1cm4gaXA2O1xuXG5cdFx0XHRjYXNlICdpZG4nOlxuXHRcdFx0XHRyZXR1cm4gaWRuO1xuXG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0XHRyZXR1cm4gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdFx0Y2FzZSAndXJuJzpcblx0XHRcdFx0cmV0dXJuICEhdGhpcy5fcGFydHMudXJuO1xuXG5cdFx0XHRjYXNlICdwdW55Y29kZSc6XG5cdFx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHQvLyBjb21wb25lbnQgc3BlY2lmaWMgaW5wdXQgdmFsaWRhdGlvblxuXHR2YXIgX3Byb3RvY29sID0gcC5wcm90b2NvbDtcblx0dmFyIF9wb3J0ID0gcC5wb3J0O1xuXHR2YXIgX2hvc3RuYW1lID0gcC5ob3N0bmFtZTtcblxuXHRwLnByb3RvY29sID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHQvLyBhY2NlcHQgdHJhaWxpbmcgOi8vXG5cdFx0XHRcdHYgPSB2LnJlcGxhY2UoLzooXFwvXFwvKT8kLywgJycpO1xuXG5cdFx0XHRcdGlmICghdi5tYXRjaChVUkkucHJvdG9jb2xfZXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm90b2NvbCBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2VzblxcJ3Qgc3RhcnQgd2l0aCBbQS1aXScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfcHJvdG9jb2wuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuc2NoZW1lID0gcC5wcm90b2NvbDtcblx0cC5wb3J0ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh2ID09PSAwKSB7XG5cdFx0XHRcdHYgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHR2ICs9ICcnO1xuXHRcdFx0XHRpZiAodi5jaGFyQXQoMCkgPT09ICc6Jykge1xuXHRcdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2Lm1hdGNoKC9bXjAtOV0vKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BvcnQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gWzAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX3BvcnQuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuaG9zdG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIHggPSB7fTtcblx0XHRcdHZhciByZXMgPSBVUkkucGFyc2VIb3N0KHYsIHgpO1xuXHRcdFx0aWYgKHJlcyAhPT0gJy8nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lIFwiJyArIHYgKyAnXCIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTtcblx0XHRcdH1cblxuXHRcdFx0diA9IHguaG9zdG5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBfaG9zdG5hbWUuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cblx0Ly8gY29tcG91bmQgYWNjZXNzb3JzXG5cdHAub3JpZ2luID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2woKTtcblx0XHRcdHZhciBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSgpO1xuXHRcdFx0aWYgKCFhdXRob3JpdHkpIHJldHVybiAnJztcblx0XHRcdHJldHVybiAocHJvdG9jb2wgPyBwcm90b2NvbCArICc6Ly8nIDogJycpICsgdGhpcy5hdXRob3JpdHkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG9yaWdpbiA9IFVSSSh2KTtcblx0XHRcdHRoaXNcblx0XHRcdFx0LnByb3RvY29sKG9yaWdpbi5wcm90b2NvbCgpKVxuXHRcdFx0XHQuYXV0aG9yaXR5KG9yaWdpbi5hdXRob3JpdHkoKSlcblx0XHRcdFx0LmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuaG9zdCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUgPyBVUkkuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKSA6ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgcmVzID0gVVJJLnBhcnNlSG9zdCh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuYXV0aG9yaXR5ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/IFVSSS5idWlsZEF1dGhvcml0eSh0aGlzLl9wYXJ0cykgOiAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlcyA9IFVSSS5wYXJzZUF1dGhvcml0eSh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAudXNlcmluZm8gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy51c2VybmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gVVJJLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpO1xuXHRcdFx0cmV0dXJuIHQuc3Vic3RyaW5nKDAsIHQubGVuZ3RoIC0xKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZbdi5sZW5ndGgtMV0gIT09ICdAJykge1xuXHRcdFx0XHR2ICs9ICdAJztcblx0XHRcdH1cblxuXHRcdFx0VVJJLnBhcnNlVXNlcmluZm8odiwgdGhpcy5fcGFydHMpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnJlc291cmNlID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXRoKCkgKyB0aGlzLnNlYXJjaCgpICsgdGhpcy5oYXNoKCk7XG5cdFx0fVxuXG5cdFx0cGFydHMgPSBVUkkucGFyc2Uodik7XG5cdFx0dGhpcy5fcGFydHMucGF0aCA9IHBhcnRzLnBhdGg7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBwYXJ0cy5xdWVyeTtcblx0XHR0aGlzLl9wYXJ0cy5mcmFnbWVudCA9IHBhcnRzLmZyYWdtZW50O1xuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvLyBmcmFjdGlvbiBhY2Nlc3NvcnNcblx0cC5zdWJkb21haW4gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVuaWVuY2UsIHJldHVybiBcInd3d1wiIGZyb20gXCJ3d3cuZXhhbXBsZS5vcmdcIlxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGdyYWIgZG9tYWluIGFuZCBhZGQgYW5vdGhlciBzZWdtZW50XG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoIC0gdGhpcy5kb21haW4oKS5sZW5ndGggLSAxO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlbmQpIHx8ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aCAtIHRoaXMuZG9tYWluKCkubGVuZ3RoO1xuXHRcdFx0dmFyIHN1YiA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlKTtcblx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cCgnXicgKyBlc2NhcGVSZWdFeChzdWIpKTtcblxuXHRcdFx0aWYgKHYgJiYgdi5jaGFyQXQodi5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG5cdFx0XHRcdHYgKz0gJy4nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLmRvbWFpbiA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBjb252ZW5pZW5jZSwgcmV0dXJuIFwiZXhhbXBsZS5vcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiBob3N0bmFtZSBjb25zaXN0cyBvZiAxIG9yIDIgc2VnbWVudHMsIGl0IG11c3QgYmUgdGhlIGRvbWFpblxuXHRcdFx0dmFyIHQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5tYXRjaCgvXFwuL2cpO1xuXHRcdFx0aWYgKHQgJiYgdC5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZ3JhYiB0bGQgYW5kIGFkZCBhbm90aGVyIHNlZ21lbnRcblx0XHRcdHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLnRsZChidWlsZCkubGVuZ3RoIC0gMTtcblx0XHRcdGVuZCA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKCcuJywgZW5kIC0xKSArIDE7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKGVuZCkgfHwgJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdikge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eScpO1xuXHRcdFx0fVxuXG5cdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCdJUCcpKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLmRvbWFpbigpKSArICckJyk7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnRsZCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyByZXR1cm4gXCJvcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoJy4nKTtcblx0XHRcdHZhciB0bGQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcocG9zICsgMSk7XG5cblx0XHRcdGlmIChidWlsZCAhPT0gdHJ1ZSAmJiBTTEQgJiYgU0xELmxpc3RbdGxkLnRvTG93ZXJDYXNlKCldKSB7XG5cdFx0XHRcdHJldHVybiBTTEQuZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB8fCB0bGQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0bGQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByZXBsYWNlO1xuXG5cdFx0XHRpZiAoIXYpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBUTEQgZW1wdHknKTtcblx0XHRcdH0gZWxzZSBpZiAodi5tYXRjaCgvW15hLXpBLVowLTktXS8pKSB7XG5cdFx0XHRcdGlmIChTTEQgJiYgU0xELmlzKHYpKSB7XG5cdFx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2Nhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5kaXJlY3RvcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLnBhdGggJiYgIXRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJy8nO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoIC0gMTtcblx0XHRcdHZhciByZXMgPSB0aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLCBlbmQpIHx8ICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/ICcvJyA6ICcnKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aChyZXMpIDogcmVzO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBlID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoO1xuXHRcdFx0dmFyIGRpcmVjdG9yeSA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsIGUpO1xuXHRcdFx0dmFyIHJlcGxhY2UgPSBuZXcgUmVnRXhwKCdeJyArIGVzY2FwZVJlZ0V4KGRpcmVjdG9yeSkpO1xuXG5cdFx0XHQvLyBmdWxseSBxdWFsaWZpZXIgZGlyZWN0b3JpZXMgYmVnaW4gd2l0aCBhIHNsYXNoXG5cdFx0XHRpZiAoIXRoaXMuaXMoJ3JlbGF0aXZlJykpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0diA9ICcvJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2LmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0diA9ICcvJyArIHY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGlyZWN0b3JpZXMgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcblx0XHRcdGlmICh2ICYmIHYuY2hhckF0KHYubGVuZ3RoIC0gMSkgIT09ICcvJykge1xuXHRcdFx0XHR2ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0diA9IFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0dGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5maWxlbmFtZSA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IHRydWUpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMucGF0aCB8fCB0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMucGF0aC5sYXN0SW5kZXhPZignLycpO1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKHBvcysxKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aFNlZ21lbnQocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG11dGF0ZWREaXJlY3RvcnkgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHYuY2hhckF0KDApID09PSAnLycpIHtcblx0XHRcdFx0diA9IHYuc3Vic3RyaW5nKDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodi5tYXRjaCgvXFwuP1xcLy8pKSB7XG5cdFx0XHRcdG11dGF0ZWREaXJlY3RvcnkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy5maWxlbmFtZSgpKSArICckJyk7XG5cdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXG5cdFx0XHRpZiAobXV0YXRlZERpcmVjdG9yeSkge1xuXHRcdFx0XHR0aGlzLm5vcm1hbGl6ZVBhdGgoYnVpbGQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuc3VmZml4ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5wYXRoIHx8IHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmaWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTtcblx0XHRcdHZhciBwb3MgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuXHRcdFx0dmFyIHMsIHJlcztcblxuXHRcdFx0aWYgKHBvcyA9PT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdWZmaXggbWF5IG9ubHkgY29udGFpbiBhbG51bSBjaGFyYWN0ZXJzICh5dXAsIEkgbWFkZSB0aGlzIHVwLilcblx0XHRcdHMgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKzEpO1xuXHRcdFx0cmVzID0gKC9eW2EtejAtOSVdKyQvaSkudGVzdChzKSA/IHMgOiAnJztcblx0XHRcdHJldHVybiB2ID8gVVJJLmRlY29kZVBhdGhTZWdtZW50KHJlcykgOiByZXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG5cdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN1ZmZpeCA9IHRoaXMuc3VmZml4KCk7XG5cdFx0XHR2YXIgcmVwbGFjZTtcblxuXHRcdFx0aWYgKCFzdWZmaXgpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoICs9ICcuJyArIFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0fSBlbHNlIGlmICghdikge1xuXHRcdFx0XHRyZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCgnLicgKyBzdWZmaXgpICsgJyQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHN1ZmZpeCkgKyAnJCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSB0aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5zZWdtZW50ID0gZnVuY3Rpb24oc2VnbWVudCwgdiwgYnVpbGQpIHtcblx0XHR2YXIgc2VwYXJhdG9yID0gdGhpcy5fcGFydHMudXJuID8gJzonIDogJy8nO1xuXHRcdHZhciBwYXRoID0gdGhpcy5wYXRoKCk7XG5cdFx0dmFyIGFic29sdXRlID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJztcblx0XHR2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcGFyYXRvcik7XG5cblx0XHRpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzZWdtZW50ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHNlZ21lbnQ7XG5cdFx0XHRzZWdtZW50ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICdudW1iZXInKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzZWdtZW50IFwiJyArIHNlZ21lbnQgKyAnXCIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFic29sdXRlKSB7XG5cdFx0XHRzZWdtZW50cy5zaGlmdCgpO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50IDwgMCkge1xuXHRcdFx0Ly8gYWxsb3cgbmVnYXRpdmUgaW5kZXhlcyB0byBhZGRyZXNzIGZyb20gdGhlIGVuZFxuXHRcdFx0c2VnbWVudCA9IE1hdGgubWF4KHNlZ21lbnRzLmxlbmd0aCArIHNlZ21lbnQsIDApO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiB0cnVlICovXG5cdFx0XHRyZXR1cm4gc2VnbWVudCA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gc2VnbWVudHNcblx0XHRcdFx0OiBzZWdtZW50c1tzZWdtZW50XTtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiBmYWxzZSAqL1xuXHRcdH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gbnVsbCB8fCBzZWdtZW50c1tzZWdtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNBcnJheSh2KSkge1xuXHRcdFx0XHRzZWdtZW50cyA9IFtdO1xuXHRcdFx0XHQvLyBjb2xsYXBzZSBlbXB0eSBlbGVtZW50cyB3aXRoaW4gYXJyYXlcblx0XHRcdFx0Zm9yICh2YXIgaT0wLCBsPXYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKCF2W2ldLmxlbmd0aCAmJiAoIXNlZ21lbnRzLmxlbmd0aCB8fCAhc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoc2VnbWVudHMubGVuZ3RoICYmICFzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLTFdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VnbWVudHMucG9wKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh0cmltU2xhc2hlcyh2W2ldKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodiB8fCB0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0diA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9PT0gJycpIHtcblx0XHRcdFx0XHQvLyBlbXB0eSB0cmFpbGluZyBlbGVtZW50cyBoYXZlIHRvIGJlIG92ZXJ3cml0dGVuXG5cdFx0XHRcdFx0Ly8gdG8gcHJldmVudCByZXN1bHRzIHN1Y2ggYXMgL2Zvby8vYmFyXG5cdFx0XHRcdFx0c2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh2KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRzZWdtZW50c1tzZWdtZW50XSA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VnbWVudHMuc3BsaWNlKHNlZ21lbnQsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhYnNvbHV0ZSkge1xuXHRcdFx0c2VnbWVudHMudW5zaGlmdCgnJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGF0aChzZWdtZW50cy5qb2luKHNlcGFyYXRvciksIGJ1aWxkKTtcblx0fTtcblx0cC5zZWdtZW50Q29kZWQgPSBmdW5jdGlvbihzZWdtZW50LCB2LCBidWlsZCkge1xuXHRcdHZhciBzZWdtZW50cywgaSwgbDtcblxuXHRcdGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ251bWJlcicpIHtcblx0XHRcdGJ1aWxkID0gdjtcblx0XHRcdHYgPSBzZWdtZW50O1xuXHRcdFx0c2VnbWVudCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWdtZW50cyA9IHRoaXMuc2VnbWVudChzZWdtZW50LCB2LCBidWlsZCk7XG5cdFx0XHRpZiAoIWlzQXJyYXkoc2VnbWVudHMpKSB7XG5cdFx0XHRcdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IFVSSS5kZWNvZGUoc2VnbWVudHMpIDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHNlZ21lbnRzW2ldID0gVVJJLmRlY29kZShzZWdtZW50c1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlZ21lbnRzO1xuXHRcdH1cblxuXHRcdGlmICghaXNBcnJheSh2KSkge1xuXHRcdFx0diA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdiBpbnN0YW5jZW9mIFN0cmluZykgPyBVUkkuZW5jb2RlKHYpIDogdjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChpID0gMCwgbCA9IHYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZbaV0gPSBVUkkuZW5jb2RlKHZbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNlZ21lbnQoc2VnbWVudCwgdiwgYnVpbGQpO1xuXHR9O1xuXG5cdC8vIG11dGF0aW5nIHF1ZXJ5IHN0cmluZ1xuXHR2YXIgcSA9IHAucXVlcnk7XG5cdHAucXVlcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0dmFyIHJlc3VsdCA9IHYuY2FsbCh0aGlzLCBkYXRhKTtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkocmVzdWx0IHx8IGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9IGVsc2UgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkodiwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcS5jYWxsKHRoaXMsIHYsIGJ1aWxkKTtcblx0XHR9XG5cdH07XG5cdHAuc2V0UXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYnVpbGQpIHtcblx0XHR2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHwgbmFtZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0ZGF0YVtuYW1lXSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YVtrZXldID0gbmFtZVtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1VSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmFkZFF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIG5hbWUsIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUpO1xuXHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkoZGF0YSwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRidWlsZCA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBidWlsZCkge1xuXHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFVSSS5yZW1vdmVRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSk7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmhhc1F1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHdpdGhpbkFycmF5KSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0cmV0dXJuIFVSSS5oYXNRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpO1xuXHR9O1xuXHRwLnNldFNlYXJjaCA9IHAuc2V0UXVlcnk7XG5cdHAuYWRkU2VhcmNoID0gcC5hZGRRdWVyeTtcblx0cC5yZW1vdmVTZWFyY2ggPSBwLnJlbW92ZVF1ZXJ5O1xuXHRwLmhhc1NlYXJjaCA9IHAuaGFzUXVlcnk7XG5cblx0Ly8gc2FuaXRpemluZyBVUkxzXG5cdHAubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHRcdFx0Lm5vcm1hbGl6ZVByb3RvY29sKGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplUGF0aChmYWxzZSlcblx0XHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplRnJhZ21lbnQoZmFsc2UpXG5cdFx0XHRcdC5idWlsZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQubm9ybWFsaXplUHJvdG9jb2woZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplSG9zdG5hbWUoZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplUG9ydChmYWxzZSlcblx0XHRcdC5ub3JtYWxpemVQYXRoKGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZUZyYWdtZW50KGZhbHNlKVxuXHRcdFx0LmJ1aWxkKCk7XG5cdH07XG5cdHAubm9ybWFsaXplUHJvdG9jb2wgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wcm90b2NvbCA9IHRoaXMuX3BhcnRzLnByb3RvY29sLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplSG9zdG5hbWUgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuaXMoJ0lETicpICYmIHB1bnljb2RlKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXMoJ0lQdjYnKSAmJiBJUHY2KSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gSVB2Ni5iZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBvcnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdC8vIHJlbW92ZSBwb3J0IG9mIGl0J3MgdGhlIHByb3RvY29sJ3MgZGVmYXVsdFxuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnICYmIHRoaXMuX3BhcnRzLnBvcnQgPT09IFVSSS5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wb3J0ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVQYXRoID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHR2YXIgX3BhdGggPSB0aGlzLl9wYXJ0cy5wYXRoO1xuXHRcdGlmICghX3BhdGgpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSBVUkkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhciBfd2FzX3JlbGF0aXZlO1xuXHRcdHZhciBfbGVhZGluZ1BhcmVudHMgPSAnJztcblx0XHR2YXIgX3BhcmVudCwgX3BvcztcblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRoc1xuXHRcdGlmIChfcGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0X3dhc19yZWxhdGl2ZSA9IHRydWU7XG5cdFx0XHRfcGF0aCA9ICcvJyArIF9wYXRoO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBmaWxlcyAoYXMgb3Bwb3NlZCB0byBkaXJlY3Rvcmllcylcblx0XHRpZiAoX3BhdGguc2xpY2UoLTMpID09PSAnLy4uJyB8fCBfcGF0aC5zbGljZSgtMikgPT09ICcvLicpIHtcblx0XHRcdF9wYXRoICs9ICcvJztcblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHNpbXBsZXNcblx0XHRfcGF0aCA9IF9wYXRoXG5cdFx0XHQucmVwbGFjZSgvKFxcLyhcXC5cXC8pKyl8KFxcL1xcLiQpL2csICcvJylcblx0XHRcdC5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG5cblx0XHQvLyByZW1lbWJlciBsZWFkaW5nIHBhcmVudHNcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSkge1xuXHRcdFx0X2xlYWRpbmdQYXJlbnRzID0gX3BhdGguc3Vic3RyaW5nKDEpLm1hdGNoKC9eKFxcLlxcLlxcLykrLykgfHwgJyc7XG5cdFx0XHRpZiAoX2xlYWRpbmdQYXJlbnRzKSB7XG5cdFx0XHRcdF9sZWFkaW5nUGFyZW50cyA9IF9sZWFkaW5nUGFyZW50c1swXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHBhcmVudHNcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0X3BhcmVudCA9IF9wYXRoLmluZGV4T2YoJy8uLicpO1xuXHRcdFx0aWYgKF9wYXJlbnQgPT09IC0xKSB7XG5cdFx0XHRcdC8vIG5vIG1vcmUgLi4vIHRvIHJlc29sdmVcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2UgaWYgKF9wYXJlbnQgPT09IDApIHtcblx0XHRcdFx0Ly8gdG9wIGxldmVsIGNhbm5vdCBiZSByZWxhdGl2ZSwgc2tpcCBpdFxuXHRcdFx0XHRfcGF0aCA9IF9wYXRoLnN1YnN0cmluZygzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdF9wb3MgPSBfcGF0aC5zdWJzdHJpbmcoMCwgX3BhcmVudCkubGFzdEluZGV4T2YoJy8nKTtcblx0XHRcdGlmIChfcG9zID09PSAtMSkge1xuXHRcdFx0XHRfcG9zID0gX3BhcmVudDtcblx0XHRcdH1cblx0XHRcdF9wYXRoID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wb3MpICsgX3BhdGguc3Vic3RyaW5nKF9wYXJlbnQgKyAzKTtcblx0XHR9XG5cblx0XHQvLyByZXZlcnQgdG8gcmVsYXRpdmVcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSAmJiB0aGlzLmlzKCdyZWxhdGl2ZScpKSB7XG5cdFx0XHRfcGF0aCA9IF9sZWFkaW5nUGFyZW50cyArIF9wYXRoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cblx0XHRfcGF0aCA9IFVSSS5yZWNvZGVQYXRoKF9wYXRoKTtcblx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gX3BhdGg7XG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBhdGhuYW1lID0gcC5ub3JtYWxpemVQYXRoO1xuXHRwLm5vcm1hbGl6ZVF1ZXJ5ID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHRpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnF1ZXJ5ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5xdWVyeS5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5fcGFydHMucXVlcnkgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5xdWVyeShVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplRnJhZ21lbnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICghdGhpcy5fcGFydHMuZnJhZ21lbnQpIHtcblx0XHRcdHRoaXMuX3BhcnRzLmZyYWdtZW50ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVTZWFyY2ggPSBwLm5vcm1hbGl6ZVF1ZXJ5O1xuXHRwLm5vcm1hbGl6ZUhhc2ggPSBwLm5vcm1hbGl6ZUZyYWdtZW50O1xuXG5cdHAuaXNvODg1OSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCB1bmljb2RlIGlucHV0LCBpc284ODU5IG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdFVSSS5lbmNvZGUgPSBlO1xuXHRcdFx0VVJJLmRlY29kZSA9IGQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAudW5pY29kZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCBpc284ODU5IGlucHV0LCB1bmljb2RlIG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0VVJJLmVuY29kZSA9IGU7XG5cdFx0XHRVUkkuZGVjb2RlID0gZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0cC5yZWFkYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmkgPSB0aGlzLmNsb25lKCk7XG5cdFx0Ly8gcmVtb3ZpbmcgdXNlcm5hbWUsIHBhc3N3b3JkLCBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IGJlIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0XHR1cmkudXNlcm5hbWUoJycpLnBhc3N3b3JkKCcnKS5ub3JtYWxpemUoKTtcblx0XHR2YXIgdCA9ICcnO1xuXHRcdGlmICh1cmkuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHVyaS5fcGFydHMucHJvdG9jb2wgKyAnOi8vJztcblx0XHR9XG5cblx0XHRpZiAodXJpLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHVyaS5pcygncHVueWNvZGUnKSAmJiBwdW55Y29kZSkge1xuXHRcdFx0XHR0ICs9IHB1bnljb2RlLnRvVW5pY29kZSh1cmkuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdFx0aWYgKHVyaS5fcGFydHMucG9ydCkge1xuXHRcdFx0XHRcdHQgKz0gJzonICsgdXJpLl9wYXJ0cy5wb3J0O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0ICs9IHVyaS5ob3N0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHVyaS5fcGFydHMuaG9zdG5hbWUgJiYgdXJpLl9wYXJ0cy5wYXRoICYmIHVyaS5fcGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dCArPSAnLyc7XG5cdFx0fVxuXG5cdFx0dCArPSB1cmkucGF0aCh0cnVlKTtcblx0XHRpZiAodXJpLl9wYXJ0cy5xdWVyeSkge1xuXHRcdFx0dmFyIHEgPSAnJztcblx0XHRcdGZvciAodmFyIGkgPSAwLCBxcCA9IHVyaS5fcGFydHMucXVlcnkuc3BsaXQoJyYnKSwgbCA9IHFwLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIga3YgPSAocXBbaV0gfHwgJycpLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHEgKz0gJyYnICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzBdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mL2csICclMjYnKTtcblxuXHRcdFx0XHRpZiAoa3ZbMV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHEgKz0gJz0nICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzFdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyYvZywgJyUyNicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0ICs9ICc/JyArIHEuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHQgKz0gVVJJLmRlY29kZVF1ZXJ5KHVyaS5oYXNoKCksIHRydWUpO1xuXHRcdHJldHVybiB0O1xuXHR9O1xuXG5cdC8vIHJlc29sdmluZyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMc1xuXHRwLmFic29sdXRlVG8gPSBmdW5jdGlvbihiYXNlKSB7XG5cdFx0dmFyIHJlc29sdmVkID0gdGhpcy5jbG9uZSgpO1xuXHRcdHZhciBwcm9wZXJ0aWVzID0gWydwcm90b2NvbCcsICd1c2VybmFtZScsICdwYXNzd29yZCcsICdob3N0bmFtZScsICdwb3J0J107XG5cdFx0dmFyIGJhc2VkaXIsIGksIHA7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoYmFzZSBpbnN0YW5jZW9mIFVSSSkpIHtcblx0XHRcdGJhc2UgPSBuZXcgVVJJKGJhc2UpO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucHJvdG9jb2wgPSBiYXNlLl9wYXJ0cy5wcm90b2NvbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiByZXNvbHZlZDtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyAocCA9IHByb3BlcnRpZXNbaV0pOyBpKyspIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0c1twXSA9IGJhc2UuX3BhcnRzW3BdO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnBhdGgpIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0cy5wYXRoID0gYmFzZS5fcGFydHMucGF0aDtcblx0XHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5KSB7XG5cdFx0XHRcdHJlc29sdmVkLl9wYXJ0cy5xdWVyeSA9IGJhc2UuX3BhcnRzLnF1ZXJ5O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocmVzb2x2ZWQuX3BhcnRzLnBhdGguc3Vic3RyaW5nKC0yKSA9PT0gJy4uJykge1xuXHRcdFx0cmVzb2x2ZWQuX3BhcnRzLnBhdGggKz0gJy8nO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvbHZlZC5wYXRoKCkuY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRcdGJhc2VkaXIgPSBiYXNlLmRpcmVjdG9yeSgpO1xuXHRcdFx0YmFzZWRpciA9IGJhc2VkaXIgPyBiYXNlZGlyIDogYmFzZS5wYXRoKCkuaW5kZXhPZignLycpID09PSAwID8gJy8nIDogJyc7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucGF0aCA9IChiYXNlZGlyID8gKGJhc2VkaXIgKyAnLycpIDogJycpICsgcmVzb2x2ZWQuX3BhcnRzLnBhdGg7XG5cdFx0XHRyZXNvbHZlZC5ub3JtYWxpemVQYXRoKCk7XG5cdFx0fVxuXG5cdFx0cmVzb2x2ZWQuYnVpbGQoKTtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH07XG5cdHAucmVsYXRpdmVUbyA9IGZ1bmN0aW9uKGJhc2UpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSB0aGlzLmNsb25lKCkubm9ybWFsaXplKCk7XG5cdFx0dmFyIHJlbGF0aXZlUGFydHMsIGJhc2VQYXJ0cywgY29tbW9uLCByZWxhdGl2ZVBhdGgsIGJhc2VQYXRoO1xuXG5cdFx0aWYgKHJlbGF0aXZlLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMnKTtcblx0XHR9XG5cblx0XHRiYXNlID0gbmV3IFVSSShiYXNlKS5ub3JtYWxpemUoKTtcblx0XHRyZWxhdGl2ZVBhcnRzID0gcmVsYXRpdmUuX3BhcnRzO1xuXHRcdGJhc2VQYXJ0cyA9IGJhc2UuX3BhcnRzO1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlLnBhdGgoKTtcblx0XHRiYXNlUGF0aCA9IGJhc2UucGF0aCgpO1xuXG5cdFx0aWYgKHJlbGF0aXZlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVUkkgaXMgYWxyZWFkeSByZWxhdGl2ZScpO1xuXHRcdH1cblxuXHRcdGlmIChiYXNlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsY3VsYXRlIGEgVVJJIHJlbGF0aXZlIHRvIGFub3RoZXIgcmVsYXRpdmUgVVJJJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgPT09IGJhc2VQYXJ0cy5wcm90b2NvbCkge1xuXHRcdFx0cmVsYXRpdmVQYXJ0cy5wcm90b2NvbCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IGJhc2VQYXJ0cy51c2VybmFtZSB8fCByZWxhdGl2ZVBhcnRzLnBhc3N3b3JkICE9PSBiYXNlUGFydHMucGFzc3dvcmQpIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhcnRzLnByb3RvY29sICE9PSBudWxsIHx8IHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IG51bGwgfHwgcmVsYXRpdmVQYXJ0cy5wYXNzd29yZCAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPT09IGJhc2VQYXJ0cy5ob3N0bmFtZSAmJiByZWxhdGl2ZVBhcnRzLnBvcnQgPT09IGJhc2VQYXJ0cy5wb3J0KSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLmhvc3RuYW1lID0gbnVsbDtcblx0XHRcdHJlbGF0aXZlUGFydHMucG9ydCA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhdGggPT09IGJhc2VQYXRoKSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLnBhdGggPSAnJztcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBjb21tb24gc3ViIHBhdGhcblx0XHRjb21tb24gPSBVUkkuY29tbW9uUGF0aChyZWxhdGl2ZVBhdGgsIGJhc2VQYXRoKTtcblxuXHRcdC8vIElmIHRoZSBwYXRocyBoYXZlIG5vdGhpbmcgaW4gY29tbW9uLCByZXR1cm4gYSByZWxhdGl2ZSBVUkwgd2l0aCB0aGUgYWJzb2x1dGUgcGF0aC5cblx0XHRpZiAoIWNvbW1vbikge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0dmFyIHBhcmVudHMgPSBiYXNlUGFydHMucGF0aFxuXHRcdFx0LnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKVxuXHRcdFx0LnJlcGxhY2UoL1teXFwvXSokLywgJycpXG5cdFx0XHQucmVwbGFjZSgvLio/XFwvL2csICcuLi8nKTtcblxuXHRcdHJlbGF0aXZlUGFydHMucGF0aCA9IChwYXJlbnRzICsgcmVsYXRpdmVQYXJ0cy5wYXRoLnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKSkgfHwgJy4vJztcblxuXHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHR9O1xuXG5cdC8vIGNvbXBhcmluZyBVUklzXG5cdHAuZXF1YWxzID0gZnVuY3Rpb24odXJpKSB7XG5cdFx0dmFyIG9uZSA9IHRoaXMuY2xvbmUoKTtcblx0XHR2YXIgdHdvID0gbmV3IFVSSSh1cmkpO1xuXHRcdHZhciBvbmVfbWFwID0ge307XG5cdFx0dmFyIHR3b19tYXAgPSB7fTtcblx0XHR2YXIgY2hlY2tlZCA9IHt9O1xuXHRcdHZhciBvbmVfcXVlcnksIHR3b19xdWVyeSwga2V5O1xuXG5cdFx0b25lLm5vcm1hbGl6ZSgpO1xuXHRcdHR3by5ub3JtYWxpemUoKTtcblxuXHRcdC8vIGV4YWN0IG1hdGNoXG5cdFx0aWYgKG9uZS50b1N0cmluZygpID09PSB0d28udG9TdHJpbmcoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gZXh0cmFjdCBxdWVyeSBzdHJpbmdcblx0XHRvbmVfcXVlcnkgPSBvbmUucXVlcnkoKTtcblx0XHR0d29fcXVlcnkgPSB0d28ucXVlcnkoKTtcblx0XHRvbmUucXVlcnkoJycpO1xuXHRcdHR3by5xdWVyeSgnJyk7XG5cblx0XHQvLyBkZWZpbml0ZWx5IG5vdCBlcXVhbCBpZiBub3QgZXZlbiBub24tcXVlcnkgcGFydHMgbWF0Y2hcblx0XHRpZiAob25lLnRvU3RyaW5nKCkgIT09IHR3by50b1N0cmluZygpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gcXVlcnkgcGFyYW1ldGVycyBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgZXZlbiBpZiB0aGV5J3JlIHBlcm11dGVkXG5cdFx0aWYgKG9uZV9xdWVyeS5sZW5ndGggIT09IHR3b19xdWVyeS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvbmVfbWFwID0gVVJJLnBhcnNlUXVlcnkob25lX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHR0d29fbWFwID0gVVJJLnBhcnNlUXVlcnkodHdvX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGZvciAoa2V5IGluIG9uZV9tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChvbmVfbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghaXNBcnJheShvbmVfbWFwW2tleV0pKSB7XG5cdFx0XHRcdFx0aWYgKG9uZV9tYXBba2V5XSAhPT0gdHdvX21hcFtrZXldKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhcnJheXNFcXVhbChvbmVfbWFwW2tleV0sIHR3b19tYXBba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjaGVja2VkW2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoa2V5IGluIHR3b19tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbCh0d29fbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghY2hlY2tlZFtrZXldKSB7XG5cdFx0XHRcdFx0Ly8gdHdvIGNvbnRhaW5zIGEgcGFyYW1ldGVyIG5vdCBwcmVzZW50IGluIG9uZVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdC8vIHN0YXRlXG5cdHAuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24odikge1xuXHRcdHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmVzY2FwZVF1ZXJ5U3BhY2UgPSBmdW5jdGlvbih2KSB7XG5cdFx0dGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRyZXR1cm4gVVJJO1xufSkpOyIsIldvcmtmbG93ID0ge31cblxuQEltYWdlU2lnbiA9IHt9O1xuXG5AVHJhY2VzSGFuZGxlciA9IHt9O1xuXG5AVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxuQEluc3RhbmNlZm9ybVRlbXBsYXRlID0ge307XG5cbkBJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSA9IHt9O1xuXG5ASW5zdGFuY2VTaWduVGV4dCA9IHt9XG5cbkBSZWxhdGVkSW5zdGFuY2VzID0ge31cblxuQFJlbGF0ZWRSZWNvcmRzID0ge31cblxuQEluc3RhbmNlTWFjcm8gPSB7Y29udGV4dDoge319XG5cbkBUcmFjZXNNYW5hZ2VyID0ge307XG5cbkluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcgPSAoZmllbGRfZm9ybXVsYSktPlxuXHRyZXR1cm4gKGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3lpamlhbmxhbjpcIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7J3lpamlhbmxhbic6XCIpID4gLTEpXG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG5cdGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG5cblx0X2Zvcm1fdmVyc2lvbiA9IHt9XG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0X2Zvcm1fdmVyc2lvbiA9IHV1Zmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oZGIuZm9ybXMuZmluZE9uZSh7X2lkOiBmb3JtfSksIGZvcm1fdmVyc2lvbilcblx0ZWxzZVxuXHRcdF9mb3JtX3ZlcnNpb24gPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe19pZDogZm9ybV92ZXJzaW9uLCBmb3JtOiBmb3JtfSlcblxuXHRmaWVsZHMgPSBfZm9ybV92ZXJzaW9uPy5maWVsZHMgfHwgW11cblxuXHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZjEuZm9ybXVsYVxuXHRcdGVsc2Vcblx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZi5mb3JtdWxhXG5cblx0Xy5zb21lIGZpZWxkX2Zvcm11bGFzLCAoZmllbGRfZm9ybXVsYSktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cbiIsIiAgICAgICAgICAgICBcblxuV29ya2Zsb3cgPSB7fTtcblxudGhpcy5JbWFnZVNpZ24gPSB7fTtcblxudGhpcy5UcmFjZXNIYW5kbGVyID0ge307XG5cbnRoaXMuVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxudGhpcy5JbnN0YW5jZWZvcm1UZW1wbGF0ZSA9IHt9O1xuXG50aGlzLkluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlID0ge307XG5cbnRoaXMuSW5zdGFuY2VTaWduVGV4dCA9IHt9O1xuXG50aGlzLlJlbGF0ZWRJbnN0YW5jZXMgPSB7fTtcblxudGhpcy5SZWxhdGVkUmVjb3JkcyA9IHt9O1xuXG50aGlzLkluc3RhbmNlTWFjcm8gPSB7XG4gIGNvbnRleHQ6IHt9XG59O1xuXG50aGlzLlRyYWNlc01hbmFnZXIgPSB7fTtcblxuSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyA9IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgcmV0dXJuIChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8IChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7eWlqaWFubGFuOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwieyd5aWppYW5sYW4nOlwiKSA6IHZvaWQgMCkgPiAtMTtcbn07XG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgdmFyIF9mb3JtX3ZlcnNpb24sIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHM7XG4gIGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG4gIF9mb3JtX3ZlcnNpb24gPSB7fTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIF9mb3JtX3ZlcnNpb24gPSB1dWZsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmb3JtXG4gICAgfSksIGZvcm1fdmVyc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgX2Zvcm1fdmVyc2lvbiA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZvcm1fdmVyc2lvbixcbiAgICAgIGZvcm06IGZvcm1cbiAgICB9KTtcbiAgfVxuICBmaWVsZHMgPSAoX2Zvcm1fdmVyc2lvbiAhPSBudWxsID8gX2Zvcm1fdmVyc2lvbi5maWVsZHMgOiB2b2lkIDApIHx8IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYxLmZvcm11bGEpO1xuICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYuZm9ybXVsYSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF8uc29tZShmaWVsZF9mb3JtdWxhcywgZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9KTtcbn07XG4iLCJkYi5pbnN0YW5jZV90YXNrcyA9IG5ldyBNZXRlb3IuQ29sbGVjdGlvbignaW5zdGFuY2VfdGFza3MnKVxuXG5kYi5pbnN0YW5jZV90YXNrcy5fc2ltcGxlU2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYVxuICAgIGluc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICB0cmFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaXNfZmluaXNoZWQ6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXI6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBoYW5kbGVyX29yZ2FuaXphdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHN0YXJ0X2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkdWVfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGlzX3JlYWQ6XG4gICAgICAgIHR5cGU6IEJvb2xlYW5cbiAgICBpc19lcnJvcjpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIHZhbHVlczpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgZGVhZGxpbmU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICByZW1pbmRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIHJlbWluZGVkX2NvdW50OlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICByZWFkX2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgbW9kaWZpZWQ6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBtb2RpZmllZF9ieTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc2lnbl9zaG93OlxuICAgICAgICB0eXBlOiBCb29sZWFuXG4gICAganVkZ2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIG5leHRfc3RlcHM6XG4gICAgICAgIHR5cGU6IEFycmF5XG4gICAgXCJuZXh0X3N0ZXBzLiRcIjpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgXCJuZXh0X3N0ZXBzLiQuc3RlcFwiOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBcIm5leHRfc3RlcHMuJC51c2Vyc1wiOlxuICAgICAgICB0eXBlOiBbU3RyaW5nXVxuICAgIGZpbmlzaF9kYXRlOlxuICAgICAgICB0eXBlOiBEYXRlXG4gICAgY29zdF90aW1lOlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICBzcGFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaW5zdGFuY2VfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3VibWl0dGVyOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXR0ZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBhcHBsaWNhbnRfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGZsb3c6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGZsb3dfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZm9ybTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcDpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcF9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBjYXRlZ29yeV9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpbnN0YW5jZV9zdGF0ZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBmb3J3YXJkX2Zyb21faW5zdGFuY2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGtleXdvcmRzOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpc19hcmNoaXZlZDpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIGNhdGVnb3J5OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiIsImRiLmF1dGhfdG9rZW5zID0gbmV3IE1ldGVvci5Db2xsZWN0aW9uKCdhdXRoX3Rva2VucycpIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5zdGFuY2VfYXR0YWNobWVudCA9IFwiXCJcIlxuXHQ8dHI+XG5cdFx0PHRkIGNsYXNzPVwiaW5zLWF0dGFjaC12aWV3XCI+XG5cdFx0XHQ8YSBocmVmPVwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVwiIGNsYXNzPVwiaW5zX2F0dGFjaF9ocmVmXCIgdGFyZ2V0PVwiX3BhcmVudFwiIGRhdGEtbmFtZT1cInt7dGhpcy5uYW1lfX1cIiBkYXRhLXR5cGU9XCJ7e3RoaXMub3JpZ2luYWwudHlwZX19XCIgZGF0YS1pZD1cInt7X2lkfX1cIj57e3RoaXMubmFtZX19PC9hPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0nc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCc+e3t2YWx1ZX19PC9kaXY+XG5cIlwiXCJcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCJcIlwiXG5cdDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAnPlxuXHRcdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjBweDtcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiA+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJlYWRvbmx5LXRhYmxlXCIgc3R5bGU9XCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cInt7dGhpcy5jb2RlfX1UYWJsZVwiIG5hbWU9XCJ7e3RoaXMuY29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3t0aGlzLm5hbWV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XCJ7e3RoaXMubmFtZX19VGhlYWRcIiBuYW1lPVwie3t0aGlzLm5hbWV9fVRoZWFkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cInt7dGhpcy5uYW1lfX1UYm9keVwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBzaG93TGFiZWx9fVxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdFx0e3sjaWYgaXNUZXh0YXJlYSB0aGlzfX1cblx0XHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2lmfX1cblx0XHR7ey93aXRofX1cblx0PC9kaXY+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcIlwiXG5cblx0e3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cblx0XHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxuXHRcdFx0XHRcdDwvZGl2PlxuICBcdFx0XHRcdDwvZGl2PlxuXHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MHB4O1wiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiID5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVhZG9ubHktdGFibGVcIiBzdHlsZT1cInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVwie3t0aGlzLmNvZGV9fVRhYmxlXCIgbmFtZT1cInt7dGhpcy5jb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e3RoaXMubmFtZX19XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cInt7dGhpcy5uYW1lfX1UaGVhZFwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGhlYWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVwie3t0aGlzLm5hbWV9fVRib2R5XCIgbmFtZT1cInt7dGhpcy5uYW1lfX1UYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdpbnB1dCd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLXJlcXVpcmVkPVwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XCI+XG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0e3sjaWYgaXNfdGV4dGFyZWF9fVxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG5cdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJudW1iZXJcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlJ319XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXR5cGU9XCJkYXRlXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlVGltZSd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS10eXBlPSdkYXRldGltZScgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdwYXNzd29yZCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgdGl0bGU9XCJ7e2dldExhYmVsIGNvZGV9fVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGRhdGEtc2NoZW1hLWtleT1cInt7Z2V0TGFiZWwgY29kZX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInt7dmFsdWV9fVwiPnt7bGFiZWx9fTwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWYtcmFkaW8tZ3JvdXBcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cbiAgICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7e3ZhbHVlfX1cIiBuYW1lPVwie3suLi9jb2RlfX1cIiBjbGFzcz1cInJhZGlvLWlubGluZSBmaXgtaW5kZW50XCI+IHt7bGFiZWx9fTwvbGFiZWw+XG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFmLWNoZWNrYm94LWdyb3VwXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3t2YWx1ZX19XCIgbmFtZT1cInt7Li4vY29kZX19XCIgY2xhc3M9XCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFwiPiB7e2xhYmVsfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInVybFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2VtYWlsJ319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwiZW1haWxcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdjaGVja2JveCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwidHJ1ZVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGNsYXNzPVwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcIj48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svaWZ9fVxuXHRcdHt7L3dpdGh9fVxuXCJcIlwiXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUgPSAodGVtcGFsdGVOYW1lLCBzdGVlZG9zRGF0YSkgLT5cblx0dGVtcGxhdGUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGVbdGVtcGFsdGVOYW1lXVxuXG5cdHRlbXBsYXRlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0dGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG5cblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZSh0ZW1wYWx0ZU5hbWUsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSAoc3RlZWRvc0RhdGEpLT5cblx0aW5zdGFuY2VTaWduVGV4dEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9zaWduX3RleHQuaHRtbCcpXG5cblx0aW5zdGFuY2VTaWduVGV4dENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVNpZ25UZXh0SHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VTaWduVGV4dFwiLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzIEluc3RhbmNlU2lnblRleHQuaGVscGVyc1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gKHN0ZWVkb3NEYXRhKSAtPlxuXHRpbWFnZVNpZ25IdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW1hZ2Vfc2lnbi5odG1sJylcblx0aW1hZ2VTaWduQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGltYWdlU2lnbkh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0aW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW1hZ2VTaWduLmhlbHBlcnMgSW1hZ2VTaWduLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIgPSAoc3RlZWRvc0RhdGEpIC0+XG5cdHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpXG5cdHRyYWNlc0hhbmxkZXJDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSGFubGRlckh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0dHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZXNIYW5sZGVyQ29tcGlsZWQpO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlciA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3RyYWNlc19oYW5kbGVyXCIsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbik7XG5cdFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuaGVscGVycyBUcmFjZXNIYW5kbGVyLmhlbHBlcnNcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdCA9IChzdGVlZG9zRGF0YSkgLT5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuXG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFwiLCBzdGVlZG9zRGF0YSk7XG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHthYnNvbHV0ZTogc3RlZWRvc0RhdGEuYWJzb2x1dGV9KTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduKHN0ZWVkb3NEYXRhKVxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dChzdGVlZG9zRGF0YSlcblxuZ2V0TGlua1RleHQgPSAoaXRlbSwgbGFiZWwsIGRldGFpbF91cmwpLT5cblx0aWYgZGV0YWlsX3VybFxuXHRcdGRldGFpbF91cmwgPSBkZXRhaWxfdXJsLnJlcGxhY2UoXCJ7X2lkfVwiLCBpdGVtLl9pZClcblx0XHRpZiAhL15odHRwKHM/KTpcXC9cXC8vLnRlc3QoZGV0YWlsX3VybClcblx0XHRcdGRldGFpbF91cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKGRldGFpbF91cmwpXG5cdFx0cmV0dXJuICc8YSBocmVmPVwiJytkZXRhaWxfdXJsKydcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nK2xhYmVsKyc8L2E+Jztcblx0ZWxzZVxuXHRcdHJldHVybiBsYWJlbFxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgPSAodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkgLT5cblx0aWYgIXZhbHVlICYmIHZhbHVlICE9IGZhbHNlXG5cdFx0cmV0dXJuICcnXG5cdGlmIFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xXG5cdFx0ZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAgKG4pLT5cblx0XHRcdGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG5cdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cblx0XHRcdH1cblx0c3dpdGNoIGZpZWxkLnR5cGVcblx0XHR3aGVuICdlbWFpbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgZWxzZSAnJ1xuXHRcdHdoZW4gJ3VybCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmIHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDBcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcblx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9ICcnXG5cdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdHdoZW4gJ3Bhc3N3b3JkJ1xuXHRcdFx0dmFsdWUgPSAnKioqKioqJ1xuXHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0aWYgdmFsdWUgJiYgdmFsdWUgIT0gJ2ZhbHNlJ1xuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpXG5cdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKHZhbHVlLCB1dGNPZmZzZXQpO1xuXHRcdHdoZW4gJ3RpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lKHZhbHVlKTtcblx0XHR3aGVuICdpbnB1dCdcblx0XHRcdGlmIGZpZWxkLmlzX3RleHRhcmVhXG5cdFx0XHRcdHZhbHVlID0gdmFsdWVcblx0XHR3aGVuICdzZWxlY3QnXG5cdFx0XHRzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKChpdGVtKSAtPiByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZSlcblx0XHRcdGlmIHNlbGVjdGVkT3B0aW9uXG5cdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcblx0XHR3aGVuICdyYWRpbydcblx0XHRcdHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoKGl0ZW0pIC0+IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25cblx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuXHRcdHdoZW4gJ211bHRpU2VsZWN0J1xuXHRcdFx0c3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKVxuXHRcdFx0c2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcigoaXRlbSkgLT4gcmV0dXJuIHNwbGl0ZWRWYWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+IC0xKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFxuXHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkT3B0aW9ucy5tYXAoKGl0ZW0pIC0+IHJldHVybiBpdGVtLmxhYmVsKS5qb2luKFwiLFwiKVxuXHRcdHdoZW4gJ251bWJlcidcblx0XHRcdGlmIHZhbHVlIG9yIHZhbHVlID09IDBcblx0XHRcdFx0aWYgZmllbGQuaXNfcGVyY2VudFxuXHRcdFx0XHRcdHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcgdmFsdWUsIGZpZWxkLmRpZ2l0c1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nIHZhbHVlLCBmaWVsZC5kaWdpdHNcblx0XHR3aGVuICdvZGF0YSdcblx0XHRcdGRldGFpbF91cmwgPSBmaWVsZC5kZXRhaWxfdXJsXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IF8ubWFwIHZhbHVlLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiBnZXRMaW5rVGV4dChpdGVtLCBpdGVtWydAbGFiZWwnXSwgZGV0YWlsX3VybClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSBnZXRMaW5rVGV4dCh2YWx1ZSwgdmFsdWVbJ0BsYWJlbCddLCBkZXRhaWxfdXJsKVxuXHRcdHdoZW4gJ2ltYWdlJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSBfLm1hcCB2YWx1ZSwgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZSBhbnRkLUltYWdlLS10aHVtYiBhbnRkLUltYWdlQ29udHJvbC1pbWFnZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYldyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJytpdGVtKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nK3ZhbHVlKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0d2hlbiAnZmlsZSdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmICFmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHZhbHVlID0gW3ZhbHVlXVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRyZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJytKU09OLnN0cmluZ2lmeSh2YWx1ZSkrJ11dJmZpZWxkcz1bXCJfaWRcIixcIm9yaWdpbmFsXCJdJywge2FzeW5jOmZhbHNlfSlcblx0XHRcdFx0XHRyZWNvcmRzID0gcmVzLmRhdGEuaXRlbXNcblx0XHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRyZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwgeyBmaWx0ZXJzOiBbW1wiX2lkXCIsICdpbicsIHZhbHVlXV0sIGZpZWxkczogW1wiX2lkXCIsIFwib3JpZ2luYWxcIl0gfSk7XG5cblx0XHRcdFx0dmFsdWUgPSBfLm1hcCByZWNvcmRzLCAoaXRlbSktPlxuXHRcdFx0XHRcdGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuXHRcdFx0XHRcdGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycraXRlbS5faWQpO1xuXHRcdFx0XHRcdGZpbGVQcmV2aWV3SHRtbCA9ICcnO1xuXHRcdFx0XHRcdGlmIFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoLTQpKSA+IC0xXG5cdFx0XHRcdFx0XHRmaWxlUHJldmlld0h0bWwgPSBcIiZlbnNwOzxhIGhyZWY9JyN7ZmlsZVVybH0nIHRhcmdldD0nX2JsYW5rJyBjbGFzcz0nYW50ZC1MaW5rJz48c3BhbiBjbGFzcz0nYW50ZC1UcGxGaWVsZCc+PHNwYW4+6aKE6KeIPC9zcGFuPjwvc3Bhbj48L2E+XCJcblx0XHRcdFx0XHRyZXR1cm4gXCI8ZGl2PjxhIGhyZWY9JyN7ZmlsZVVybCsnP2Rvd25sb2FkPXRydWUnfScgdGFyZ2V0PSdfYmxhbmsnPiN7ZmlsZU5hbWV9PC9hPiAje2ZpbGVQcmV2aWV3SHRtbCA/IGZpbGVQcmV2aWV3SHRtbCA6ICcnfTwvZGl2PlwiXG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuXHRcdHdoZW4gJ2xvb2t1cCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmICFmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHZhbHVlID0gW3ZhbHVlXVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHR1aVNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0KGZpZWxkLnJlZmVyZW5jZV90bylcblx0XHRcdFx0XHRuYW1lRmllbGQgPSB1aVNjaGVtYT8uTkFNRV9GSUVMRF9LRVkgfHwgJ25hbWUnXG5cdFx0XHRcdFx0cmVzID0gU3RlZWRvcy5hdXRoUmVxdWVzdCgnL2FwaS92MS8nK2ZpZWxkLnJlZmVyZW5jZV90bysnP2ZpbHRlcnM9W1tcIicrKGZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJykrJ1wiLFwiaW5cIiwgJytKU09OLnN0cmluZ2lmeSh2YWx1ZSkrJ11dJmZpZWxkcz1bXCJfaWRcIixcIicrbmFtZUZpZWxkKydcIl0nLCB7YXN5bmM6ZmFsc2V9KVxuXHRcdFx0XHRcdHJlY29yZHMgPSByZXMuZGF0YS5pdGVtc1xuXHRcdFx0XHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdG5hbWVGaWVsZCA9IFN0ZWVkb3MuZ2V0T2JqZWN0TmFtZUZpZWxkS2V5KGZpZWxkLnJlZmVyZW5jZV90byk7XG5cdFx0XHRcdFx0cmVjb3JkcyA9IFN0ZWVkb3Mub2JqZWN0RmluZChmaWVsZC5yZWZlcmVuY2VfdG8sIHsgZmlsdGVyczogW1soZmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnKSwgJ2luJywgdmFsdWVdXSwgZmllbGRzOiBbXCJfaWRcIiwgbmFtZUZpZWxkXSB9KTtcblx0XHRcdFx0dmFsdWUgPSBfLm1hcCByZWNvcmRzLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiBcIjxhIGhyZWY9JyN7U3RlZWRvcy5hYnNvbHV0ZVVybCgnL2FwcC8tLycrZmllbGQucmVmZXJlbmNlX3RvKycvdmlldy8nK2l0ZW0uX2lkKX0nIHRhcmdldD0nX2JsYW5rJz4je2l0ZW1bbmFtZUZpZWxkXX08L2E+XCJcblxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLmpvaW4oXCIgLCBcIik7XHRcblx0XHR3aGVuICdodG1sJ1xuXHRcdFx0dmFsdWUgPSBpZiB2YWx1ZSB0aGVuIFwiPGRpdiBjbGFzcz1cXFwic3RlZWRvcy1odG1sXFxcIj4je3ZhbHVlfTwvZGl2PlwiIGVsc2UgJydcblxuXHRyZXR1cm4gdmFsdWU7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCA9IChmaWVsZHMsIGNvZGUpIC0+XG5cdGZpZWxkID0gZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpXG5cdGlmIGZpZWxkXG5cdFx0aWYgZmllbGQubmFtZVxuXHRcdFx0cmV0dXJuIGZpZWxkLm5hbWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmllbGQuY29kZVxuXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uID0gKGluc3RhbmNlKS0+XG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXG5cdGZvcm1fdmVyc2lvbiA9IHt9XG5cblx0Zm9ybV9maWVsZHMgPSBbXTtcblxuXHRpZiBmb3JtLmN1cnJlbnQuX2lkID09IGluc3RhbmNlLmZvcm1fdmVyc2lvblxuXHRcdGZvcm1fdmVyc2lvbiA9IGZvcm0uY3VycmVudFxuXHRlbHNlXG5cdFx0Zm9ybV92ZXJzaW9uID0gXy53aGVyZShmb3JtLmhpc3RvcnlzLCB7X2lkOiBpbnN0YW5jZS5mb3JtX3ZlcnNpb259KVswXVxuXG5cdGZvcm1fdmVyc2lvbi5maWVsZHMuZm9yRWFjaCAoZmllbGQpLT5cblx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cdFx0XHRpZiBmaWVsZC5maWVsZHNcblx0XHRcdFx0ZmllbGQuZmllbGRzLmZvckVhY2ggKGYpIC0+XG5cdFx0XHRcdFx0Zm9ybV9maWVsZHMucHVzaChmKTtcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0ZmllbGRbJ3NmaWVsZHMnXSA9IGZpZWxkWydmaWVsZHMnXVxuXHRcdFx0ZGVsZXRlIGZpZWxkWydmaWVsZHMnXVxuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cblx0Zm9ybV92ZXJzaW9uLmZpZWxkcyA9IGZvcm1fZmllbGRzO1xuXG5cdHJldHVybiBmb3JtX3ZlcnNpb247XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbiA9IChpbnN0YW5jZSktPlxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcblx0Zmxvd192ZXJzaW9uID0ge31cblx0aWYgZmxvdy5jdXJyZW50Ll9pZCA9PSBpbnN0YW5jZS5mbG93X3ZlcnNpb25cblx0XHRmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnRcblx0ZWxzZVxuXHRcdGZsb3dfdmVyc2lvbiA9IF8ud2hlcmUoZmxvdy5oaXN0b3J5cywge19pZDogaW5zdGFuY2UuZmxvd192ZXJzaW9ufSlbMF1cblxuXHRyZXR1cm4gZmxvd192ZXJzaW9uO1xuXG5cbl9nZXRWaWV3SHRtbCA9IChwYXRoKSAtPlxuXHR2aWV3SHRtbCA9IEFzc2V0cy5nZXRUZXh0KHBhdGgpXG5cblx0aWYgdmlld0h0bWxcblx0XHR2aWV3SHRtbCA9IHZpZXdIdG1sLnJlcGxhY2UoLzx0ZW1wbGF0ZVtcXHdcXHNcXFwiXFw9J10rPi9pLFwiXCIpLnJlcGxhY2UoLzxcXC90ZW1wbGF0ZT4vaSxcIlwiKVxuXG5cdHJldHVybiB2aWV3SHRtbDtcblxuX2dldExvY2FsZSA9ICh1c2VyKS0+XG5cdGlmIHVzZXI/LmxvY2FsZT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdGVsc2UgaWYgdXNlcj8ubG9jYWxlPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdlbi11cydcblx0XHRsb2NhbGUgPSBcImVuXCJcblx0ZWxzZVxuXHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRyZXR1cm4gbG9jYWxlXG5cblxuX2dldFJlcXVpcmVkRmllbGRzID0gKGZpZWxkcywgcmV2KS0+XG5cdGlmICFyZXZcblx0XHRyZXYgPSBbXTtcblxuXHRmaWVsZHMuZm9yRWFjaCAoZmllbGQpLT5cblx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0X2dldFJlcXVpcmVkRmllbGRzKGZpZWxkLmZpZWxkcywgcmV2KVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAndGFibGUnXG5cblx0XHRlbHNlXG5cdFx0XHRpZiBmaWVsZC5pc19yZXF1aXJlZFxuXHRcdFx0XHRyZXYucHVzaCBmaWVsZC5jb2RlXG5cdHJldHVybiByZXY7XG5cbl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IChmaWVsZHMsIHN0ZXBzKS0+XG5cdHN0YXJ0U3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJzdGVwX3R5cGVcIixcInN0YXJ0XCIpXG5cblx0ZWRpdGFibGVDb2RlID0gW11cblxuXHRfLmtleXMoc3RhcnRTdGVwLnBlcm1pc3Npb25zKS5mb3JFYWNoIChrZXkpLT5cblx0XHRpZiBzdGFydFN0ZXAucGVybWlzc2lvbnNba2V5XSA9PSAnZWRpdGFibGUnXG5cdFx0XHRlZGl0YWJsZUNvZGUucHVzaCBrZXlcblxuXHRyZXR1cm4gZWRpdGFibGVDb2RlXG5cbl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyA9IChmaWVsZHMsIHN0ZXBzKS0+XG5cdHJlcXVpcmVkRmllbGRzID0gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkcylcblxuXHRlZGl0YWJsZUNvZGUgPSBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMoZmllbGRzLCBzdGVwcylcblxuXHRyZXR1cm4gXy5pbnRlcnNlY3Rpb24ocmVxdWlyZWRGaWVsZHMsIGVkaXRhYmxlQ29kZSlcblxuX2dldFRlbXBsYXRlRGF0YSA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0Zm9ybV92ZXJzaW9uID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpXG5cdGVsc2Vcblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbihpbnN0YW5jZSlcblxuXHRsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpXG5cblx0c3RlZWRvc0RhdGEgPSB7fVxuXG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHN0ZWVkb3NEYXRhID0gXy5jbG9uZShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCkpXG5cdFx0c3RlZWRvc0RhdGEuaW5zbmFtZSA9IGluc3RhbmNlLm5hbWVcblx0XHRzdGVlZG9zRGF0YS5pbnNfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZVxuXHRcdHN0ZWVkb3NEYXRhLmluc19maW5hbF9kZWNpc2lvbiA9IGluc3RhbmNlLmluc19maW5hbF9kZWNpc2lvblxuXHRcdHN0ZWVkb3NEYXRhLmluc19jb2RlID0gaW5zdGFuY2UuY29kZVxuXHRcdHN0ZWVkb3NEYXRhLmluc19pc19hcmNoaXZlZCA9IGluc3RhbmNlLmlzX2FyY2hpdmVkXG5cdFx0c3RlZWRvc0RhdGEuaW5zX2lzX2RlbGV0ZWQgPSBpbnN0YW5jZS5pbnNfaXNfZGVsZXRlZFxuXHRcdHN0ZWVkb3NEYXRhLmFwcGxpY2FudF9uYW1lID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblx0XHRzdGVlZG9zRGF0YS5hcHBsaWNhbnRDb250ZXh0ID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblxuXHRzdGVlZG9zRGF0YS5pbnN0YW5jZSA9IGluc3RhbmNlXG5cdHN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbiA9IGZvcm1fdmVyc2lvblxuXHRzdGVlZG9zRGF0YS5sb2NhbGUgPSBsb2NhbGVcblx0c3RlZWRvc0RhdGEudXRjT2Zmc2V0ID0gdXNlci51dGNPZmZzZXRcblx0c3RlZWRvc0RhdGEuc3BhY2UgPSBpbnN0YW5jZS5zcGFjZVxuXHRzdGVlZG9zRGF0YS5zZXNzaW9uVXNlcklkID0gdXNlci5faWRcblxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRpZiBvcHRpb25zPy5lZGl0YWJsZVxuXHRcdFx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe19pZDogaW5zdGFuY2UuZm9ybX0pXG5cblx0XHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQ6IGluc3RhbmNlLmZsb3d9KVxuXG5cdFx0XHRzdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmb3JtLmN1cnJlbnQuZmllbGRzLCBmbG93LmN1cnJlbnQuc3RlcHMpO1xuXG5cdHJldHVybiBzdGVlZG9zRGF0YTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdERhdGUgPSAoZGF0ZSwgdXRjT2Zmc2V0KS0+XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdHBhc3NpbmcgPSBmYWxzZTtcblx0ZWxzZVxuXHRcdHBhc3NpbmcgPSB0cnVlO1xuXG5cdGlmICF1dGNPZmZzZXQgJiYgdXRjT2Zmc2V0ICE9MFxuXHRcdHV0Y09mZnNldCA9IDhcblxuXHRyZXR1cm4gbW9tZW50KGRhdGUpLnV0Y09mZnNldCh1dGNPZmZzZXQsIHBhc3NpbmcpLmZvcm1hdChcIllZWVktTU0tREQgSEg6bW1cIik7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lID0gKGRhdGUpLT5cblx0dXRjT2Zmc2V0ID0gMFxuXHRyZXR1cm4gbW9tZW50KGRhdGUpLnV0Y09mZnNldCh1dGNPZmZzZXQpLmZvcm1hdChcIkhIOm1tXCIpO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cblx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcblxuXHRpZiBvcHRpb25zPy5hYnNvbHV0ZVxuXHRcdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gdHJ1ZTtcblxuXHRpbnN0YW5jZVRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlLCBvcHRpb25zPy50ZW1wbGF0ZU5hbWUpO1xuXG5cdGluc3RhbmNlVGVtcGxhdGUgPSBpbnN0YW5jZVRlbXBsYXRlLnJlcGxhY2UoL2FmU2VsZWN0VXNlci9nLFwiYWZTZWxlY3RVc2VyUmVhZFwiKVxuXG5cdGlmICFvcHRpb25zPy5lZGl0YWJsZVxuXHRcdGluc3RhbmNlVGVtcGxhdGUgPSBpbnN0YW5jZVRlbXBsYXRlLnJlcGxhY2UoL2FmRm9ybUdyb3VwL2csXCJhZkZvcm1Hcm91cFJlYWRcIilcblxuXHRpbnN0YW5jZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0aW5zdGFuY2VSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VDb21waWxlZCk7XG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3JlYWRvbmx5X3ZpZXdcIiwgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuXHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdChzdGVlZG9zRGF0YSk7XG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcsIHN0ZWVkb3NEYXRhKVxuXG5cdHJldHVybiBcIlwiXCJcblx0XHQ8ZGl2IGlkPSdpbnN0YW5jZWZvcm0nID5cblx0XHRcdCN7Ym9keX1cblx0XHQ8L2Rpdj5cblx0XCJcIlwiXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRUcmFjZXNWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG5cdGlmIGZvcm0uaW5zdGFuY2Vfc3R5bGUgPT0gXCJ0YWJsZVwiIHx8IG9wdGlvbnM/LnRlbXBsYXRlTmFtZSA9PSBcInRhYmxlXCJcblx0XHR0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX3RhYmxlLmh0bWwnKVxuXHRlbHNlXG5cdFx0dHJhY2VzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3RyYWNlcy5odG1sJylcblxuXHR0cmFjZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0cmFjZXNIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0dHJhY2VSZW5kZXJGdW5jdGlvbiA9IGV2YWwodHJhY2VDb21waWxlZCk7XG5cblx0VGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInRyYWNlX3JlYWRvbmx5X3ZpZXdcIiwgdHJhY2VSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldywgaW5zdGFuY2UudHJhY2VzKVxuXG5cdHJldHVybiBib2R5O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlKS0+XG5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblxuXHRhdHRhY2htZW50SHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2luc3RhbmNlX2F0dGFjaG1lbnRzLmh0bWwnKVxuXG5cdGF0dGFjaG1lbnRDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoYXR0YWNobWVudEh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblxuXHRhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24gPSBldmFsKGF0dGFjaG1lbnRDb21waWxlZCk7XG5cblx0VGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXdcIiwgYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3LmhlbHBlcnMgSW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVyc1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3KVxuXG5cdHJldHVybiBib2R5O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZEluc3RhbmNlc1ZpZXcgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cblx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcblxuXHRpZiBvcHRpb25zPy5hYnNvbHV0ZVxuXHRcdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gdHJ1ZTtcblxuXHRyZWxhdGVkSW5zdGFuY2VzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3JlbGF0ZWRfaW5zdGFuY2VzLmh0bWwnKVxuXG5cdHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZEluc3RhbmNlc0h0bWwsIHtpc0JvZHk6IHRydWV9KTtcblxuXHRyZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24gPSBldmFsKHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCk7XG5cblx0VGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXdcIiwgcmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LmhlbHBlcnMgUmVsYXRlZEluc3RhbmNlcy5oZWxwZXJzXG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcsIHN0ZWVkb3NEYXRhKVxuXG5cdHJldHVybiBib2R5O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG5cblx0aWYgb3B0aW9ucz8uYWJzb2x1dGVcblx0XHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG5cblx0cmVsYXRlZFJlY29yZHNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9yZWNvcmRzLmh0bWwnKVxuXG5cdHJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRSZWNvcmRzSHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdHJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24gPSBldmFsKHJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwicmVsYXRlZF9yZWNvcmRzX3ZpZXdcIiwgcmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LmhlbHBlcnMgUmVsYXRlZFJlY29yZHMuaGVscGVyc1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldywgc3RlZWRvc0RhdGEpXG5cblx0cmV0dXJuIGJvZHk7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRPbkxvYWRTY3JpcHQgPSAoaW5zdGFuY2UpLT5cblx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbilcblxuXHRmb3JtX3NjcmlwdCA9IGZvcm1fdmVyc2lvbi5mb3JtX3NjcmlwdDtcblxuXHRpZiBmb3JtX3NjcmlwdCAmJiBmb3JtX3NjcmlwdC5yZXBsYWNlKC9cXG4vZyxcIlwiKS5yZXBsYWNlKC9cXHMvZyxcIlwiKS5sZW5ndGggPiAwXG5cdFx0Zm9ybV9zY3JpcHQgPSBcIkNvcmVGb3JtID0ge307Q29yZUZvcm0uaW5zdGFuY2Vmb3JtID0ge307XCIgKyBmb3JtX3NjcmlwdFxuXHRcdGZvcm1fc2NyaXB0ICs9IFwiO2lmKENvcmVGb3JtLmZvcm1fT25Mb2FkKXt3aW5kb3cub25sb2FkID0gQ29yZUZvcm0uZm9ybV9PbkxvYWQoKTt9XCJcblx0ZWxzZVxuXHRcdGZvcm1fc2NyaXB0ID0gXCJcIlxuXG5cblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblxuXHRib2R5ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuXG5cdG9uTG9hZFNjcmlwdCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRPbkxvYWRTY3JpcHQoaW5zdGFuY2UpO1xuXG5cdGNyZWF0b3JTZXJ2aWNlID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53ZWJzZXJ2aWNlcz8uY3JlYXRvcj8udXJsXG5cdGluc19yZWNvcmRfaWRzID0gaW5zdGFuY2UucmVjb3JkX2lkc1xuXHRsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuXHRvcGVuRmlsZVNjcmlwdCA9IFwiXCJcIlxuXHRcdFx0aWYod2luZG93LmlzTm9kZSAmJiBpc05vZGUoKSl7XG5cdFx0XHRcdGF0dGFjaHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiaW5zX2F0dGFjaF9ocmVmXCIpO1xuXHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgYXR0YWNocy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0YXR0YWNoID0gYXR0YWNoc1tpXTtcblx0XHRcdFx0XHRhdHRhY2guYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdFx0aWYoaXNJbWFnZSh0aGlzLmRhdGFzZXQudHlwZSkgfHwgaXNIdG1sKHRoaXMuZGF0YXNldC50eXBlKSl7XG5cdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0b3BlbldpbmRvdyhcIi9hcGkvZmlsZXMvaW5zdGFuY2VzL1wiICsgdGhpcy5kYXRhc2V0LmlkKTtcblx0XHRcdFx0XHRcdH1lbHNlIGlmKG53X2NvcmUuY2FuT3BlbkZpbGUodGhpcy5kYXRhc2V0Lm5hbWUpKXtcblx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRud19jb3JlLm9wZW5GaWxlKHRoaXMuaHJlZiwgdGhpcy5kYXRhc2V0Lm5hbWUpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGZsb3cgPSBcIiN7aW5zdGFuY2UuZmxvd31cIjtcblx0XHRcdHZhciBzcGFjZSA9IFwiI3tpbnN0YW5jZS5zcGFjZX1cIjtcblxuXHRcdFx0ZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpe1xuXHRcdFx0XHRsZXQgcGF0dGVybiA9IFJlZ0V4cChuYW1lICsgXCI9LlteO10qXCIpXG5cdFx0XHRcdGxldCBtYXRjaGVkID0gZG9jdW1lbnQuY29va2llLm1hdGNoKHBhdHRlcm4pXG5cdFx0XHRcdGlmKG1hdGNoZWQpe1xuXHRcdFx0XHRcdGxldCBjb29raWUgPSBtYXRjaGVkWzBdLnNwbGl0KCc9Jylcblx0XHRcdFx0XHRyZXR1cm4gY29va2llWzFdXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICcnXG5cdFx0XHR9XG5cblx0XHRcdHZhciByZWNvcmRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImlucy1yZWxhdGVkLXJlY29yZHNcIik7XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0dmFyIHJlY29yZCA9IHJlY29yZHNbaV07XG5cdFx0XHRcdFx0cmVjb3JkLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRcdHZhciBjcmVhdG9yU2VydmljZSA9IFwiI3tjcmVhdG9yU2VydmljZX1cIlxuXHRcdFx0XHRcdFx0dmFyIGluc19yZWNvcmRfaWRzID0gI3tKU09OLnN0cmluZ2lmeShpbnNfcmVjb3JkX2lkcyl9XG5cdFx0XHRcdFx0XHRpZihjcmVhdG9yU2VydmljZSAmJiBpbnNfcmVjb3JkX2lkcyAmJiBpbnNfcmVjb3JkX2lkcy5sZW5ndGggPiAwKXtcblx0XHRcdFx0XHRcdFx0dmFyIG9iamNldE5hbWUgPSBpbnNfcmVjb3JkX2lkc1swXS5vXG5cdFx0XHRcdFx0XHRcdHZhciBpZCA9IGluc19yZWNvcmRfaWRzWzBdLmlkc1swXVxuXHRcdFx0XHRcdFx0XHR2YXIgdW9iaiA9IHt9O1xuXHRcdFx0XHRcdFx0XHR1b2JqW1wiWC1Vc2VyLUlkXCJdID0gZ2V0Q29va2llKFwiWC1Vc2VyLUlkXCIpO1xuXHRcdFx0XHRcdFx0XHR1b2JqW1wiWC1BdXRoLVRva2VuXCJdID0gZ2V0Q29va2llKFwiWC1BdXRoLVRva2VuXCIpO1xuXHRcdFx0XHRcdFx0XHRyZWRpcmVjdFVybCA9IGNyZWF0b3JTZXJ2aWNlICsgXCJhcHAvLS9cIiArIG9iamNldE5hbWUgKyBcIi92aWV3L1wiICsgaWQgKyBcIj9cIiArICQucGFyYW0odW9iaik7XG5cdFx0XHRcdFx0XHRcdG9wZW5XaW5kb3cocmVkaXJlY3RVcmwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XCJcIlwiO1xuXG5cblx0aWYgIVN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXHRcdGlmIGZvcm0/Lmluc3RhbmNlX3N0eWxlID09ICd0YWJsZSdcblx0XHRcdGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiXG5cblx0aWYgb3B0aW9ucz8udGVtcGxhdGVOYW1lID09ICd0YWJsZSdcblx0XHRpbnN0YW5jZV9zdHlsZSA9IFwiaW5zdGFuY2UtdGFibGVcIlxuXG5cdGlmIG9wdGlvbnM/Lmluc3RhbmNlX3N0eWxlXG5cdFx0aW5zdGFuY2Vfc3R5bGUgPSBvcHRpb25zLmluc3RhbmNlX3N0eWxlXG5cblx0aWYgIW9wdGlvbnMgfHwgb3B0aW9ucy5zaG93VHJhY2UgPT0gdHJ1ZVxuXHRcdHRyYWNlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFRyYWNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXHRlbHNlXG5cdFx0dHJhY2UgPSBcIlwiXG5cblx0aW5zdGFuY2VCb3hTdHlsZSA9IFwiXCI7XG5cblx0aWYgaW5zdGFuY2UgJiYgaW5zdGFuY2UuZmluYWxfZGVjaXNpb25cblx0XHRpZiBpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PSBcImFwcHJvdmVkXCJcblx0XHRcdGluc3RhbmNlQm94U3R5bGUgPSBcImJveC1zdWNjZXNzXCJcblx0XHRlbHNlIGlmIChpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtZGFuZ2VyXCJcblx0aWYgIW9wdGlvbnMgfHwgb3B0aW9ucy5zaG93QXR0YWNobWVudHMgPT0gdHJ1ZVxuXHRcdGF0dGFjaG1lbnQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXHRcdHJlbGF0ZWRfaW5zdGFuY2VzID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucylcblx0XHRyZWxhdGVkX3JlY29yZHMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucylcblx0ZWxzZVxuXHRcdGF0dGFjaG1lbnQgPSBcIlwiXG5cdFx0cmVsYXRlZF9pbnN0YW5jZXMgPSBcIlwiXG5cdFx0cmVsYXRlZF9yZWNvcmRzID0gXCJcIlxuXG5cblx0d2lkdGggPSBcIjk2MHB4XCJcblx0I1x05aaC5p6c57uZdGFibGXnmoRwYXJlbnTorr7nva53aWR0aO+8jOWImeS8muWvvOiHtOmYv+mHjOS6kemCrueuseaYvuekunRhYmxlIOW8guW4uFxuXHRpZiBvcHRpb25zPy53aWR0aFxuXHRcdHdpZHRoID0gXCJcIlxuXG5cdGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJzdGVlZG9zLWNzc1wiKVxuXHRcblx0anFIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwid2Vic2l0ZS9saWJzL2pxdWVyeS5taW4uanNcIilcblxuXHRhbGxDc3NMaW5rID0gXCJcIlwiPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGNsYXNzPVwiX19tZXRlb3ItY3NzX19cIiBocmVmPVwiI3tjc3NIcmVmfVwiPlwiXCJcIlxuXG5cdHRyYWNlQ2hlY2sgPSBcIlwiXG5cdGlmICFfLmlzRW1wdHkodHJhY2UpXG5cdFx0dHJhY2VDaGVjayA9IFwiY2hlY2tlZFwiXG5cdGlmIG9wdGlvbnM/LnRhZ2dlciA9PSAnZW1haWwnIHx8IG9wdGlvbnM/LmVkaXRhYmxlXG5cdFx0c2hvd1RyYWNlc0J0biA9IFwiXCJcblx0ZWxzZVxuXHRcdHNob3dUcmFjZXNCdG4gPSBcIlwiXCJcblx0XHRcdDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWJhciBidG4tZ3JvdXAgbm8tcHJpbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IHotaW5kZXg6IDk5OTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInByaW50LXRvb2xcIj5cblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjYngtbGFiZWxcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjYngtcHJpbnQgY2J4LXByaW50LWF0dGFjaG1lbnRzXCIgaWQ9XCJjYngtcHJpbnQtYXR0YWNobWVudHNcIiBjaGVja2VkPVwiY2hlY2tlZFwiPjxzcGFuPiN7VEFQaTE4bi5fXygnaW5zdGFuY2VfYXR0YWNobWVudCcsIHt9LCBsb2NhbGUpfTwvc3Bhbj48L2xhYmVsPlxuXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNieC1sYWJlbFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNieC1wcmludCBjYngtcHJpbnQtdHJhY2VzXCIgaWQ9XCJjYngtcHJpbnQtdHJhY2VzXCIgY2hlY2tlZD1cIiN7dHJhY2VDaGVja31cIj48c3Bhbj4je1RBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmFsX2hpc3RvcnknLCB7fSwgbG9jYWxlKX08L3NwYW4+PC9sYWJlbD5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdFwiXCJcIlxuXG5cdHNob3dUcmFjZXNTY3JpcHQgPSBcIlwiXCJcblx0XHQkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtdHJhY2VzJyk7XG5cdFx0XHR2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2luc3RhbmNlLXRyYWNlcycpWzBdO1xuXHRcdFx0aWYgKGIgJiYgYi5jaGVja2VkICYmIHQpe1xuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcblx0XHRcdH0gZWxzZSBpZih0KXtcblx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdH1cblx0XHRcdGlmKGIpe1xuXHRcdFx0XHRiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdGlmIChlLnRhcmdldC5jaGVja2VkKXtcblx0XHRcdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblxuXHRcdFx0dmFyIGF0dGFjaG1lbnRzQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LWF0dGFjaG1lbnRzJyk7XG5cdFx0XHR2YXIgYXR0YWNobWVudHNWaWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0YWNobWVudHMtc2VjdGlvbicpWzBdO1xuXHRcdFx0aWYgKGF0dGFjaG1lbnRzQ2hlY2tib3ggJiYgYXR0YWNobWVudHNDaGVja2JveC5jaGVja2VkICYmIGF0dGFjaG1lbnRzVmlldyl7XG5cdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHR9IGVsc2UgaWYoYXR0YWNobWVudHNWaWV3KXtcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xuXHRcdFx0fVxuXHRcdFx0aWYoYXR0YWNobWVudHNDaGVja2JveCl7XG5cdFx0XHRcdGF0dGFjaG1lbnRzQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpe1xuXHRcdFx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XCJcIlwiXG5cblx0aWYgb3B0aW9ucz8uc3R5bGVzXG5cdFx0YWxsQ3NzTGluayA9IFwiXCJcblxuXHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZS5mb3JtfSk7XG5cdGZvcm1EZXNjcmlwdGlvbkh0bWwgPSBcIlwiXG5cdGlmIGZvcm1cblx0XHRmb3JtRGVzY3JpcHRpb24gPSBmb3JtLmRlc2NyaXB0aW9uXG5cdFx0aWYgZm9ybURlc2NyaXB0aW9uXG5cdFx0XHRmb3JtRGVzY3JpcHRpb24gPSBmb3JtRGVzY3JpcHRpb24ucmVwbGFjZSgvXFxuL2csXCI8YnIvPlwiKVxuXHRcdFx0Zm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiXCJcIlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm94LWhlYWRlciAgd2l0aC1ib3JkZXIgaW5zdGFuY2UtaGVhZGVyXCI+XG5cdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdCN7Zm9ybURlc2NyaXB0aW9ufVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XCJcIlwiXG5cblx0aHRtbCA9IFwiXCJcIlxuXHRcdDwhRE9DVFlQRSBodG1sPlxuXHRcdDxodG1sPlxuXHRcdFx0PGhlYWQ+XG5cdFx0XHRcdDxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCIvPlxuXHRcdFx0XHQje2FsbENzc0xpbmt9XG5cdFx0XHRcdDxzY3JpcHQgc3JjPVwiI3tqcUhyZWZ9XCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXHRcdFx0XHQ8c2NyaXB0IHNyYz1cIi9qcy9ud19jb3JlLmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXHRcdFx0XHQje29wdGlvbnMucGx1Z2lucyB8fCBcIlwifVxuXG5cdFx0XHRcdDxzdHlsZT5cblx0XHRcdFx0XHQuc3RlZWRvc3tcblx0XHRcdFx0XHRcdHdpZHRoOiAje3dpZHRofTtcblx0XHRcdFx0XHRcdG1hcmdpbi1sZWZ0OiBhdXRvO1xuXHRcdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiBhdXRvO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC5pbnN0YW5jZS12aWV3IC5pbnN0YW5jZS1uYW1le1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmJveC10b29sc3tcblx0XHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5ib3guY29sbGFwc2VkLWJveCAuYm94LWJvZHksLmJveC5jb2xsYXBzZWQtYm94IC5ib3gtZm9vdGVyIHtcblx0XHRcdFx0XHQgIGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJvZHl7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kOiBhenVyZSAhaW1wb3J0YW50O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC5pbnN0YW5jZS12aWV3IC5pbnN0YW5jZS10cmFjZXN7XG5cdFx0XHRcdFx0XHRwYWRkaW5nLWxlZnQ6IDE1cHg7XG5cdFx0XHRcdFx0XHRwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtYWRkQnRuLWJvcmRlclJhZGl1cyk7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcblx0XHRcdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWdhcC1iYXNlKTtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1nYXAtYmFzZSk7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdHdpZHRoOiA3LjVyZW07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQge1xuXHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSBzdmcuaWNvbi1yZWZyZXNoIHtcblx0XHRcdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tRmlsZUNvbnRyb2wtZGFuZ2VyLWNvbG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3ZnLmljb24taW1hZ2Uge1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDhweDtcblx0XHRcdFx0XHR3aWR0aDogMjRweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDI0cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSA+IHNwYW4ge1xuXHRcdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdFx0XHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pbWFnZSB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0Ym9yZGVyOiBub25lO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcblx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRcdGNvbG9yOiAjOTk5O1xuXHRcdFx0XHRcdHRvcDogNXB4O1xuXHRcdFx0XHRcdHJpZ2h0OiA1cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIgPiBzdmcge1xuXHRcdFx0XHRcdHRvcDogMDtcblx0XHRcdFx0XHR3aWR0aDogMTBweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRcdFx0d2lkdGg6IDExMHB4O1xuXHRcdFx0XHRcdGhlaWdodDogMTEwcHg7XG5cdFx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0XHRhbGlnbi1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHRcdFx0ZmxleC13cmFwOiB3cmFwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUluZm8gPiBwIHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxMnB4O1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDVweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXByb2dyZXNzIHtcblx0XHRcdFx0XHR3aWR0aDogNzBweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDVweDtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjZWJlYmViO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3NWYWx1ZSB7XG5cdFx0XHRcdFx0aGVpZ2h0OiA1cHg7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tSW1hZ2VDb250cm9sLXByb2dyZXNzLWJvcmRlclJhZGl1cyk7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogdmFyKC0taW5mbyk7XG5cdFx0XHRcdFx0bWluLXdpZHRoOiAxMCU7XG5cdFx0XHRcdFx0dHJhbnNpdGlvbjogZWFzZS1vdXQgd2lkdGggdmFyKC0tYW5pbWF0aW9uLWR1cmF0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkOmhvdmVyIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZXJyb3JNc2cge1xuXHRcdFx0XHRcdGNvbG9yOiB2YXIoLS1kYW5nZXIpO1xuXHRcdFx0XHRcdG1hcmdpbjogNXB4IDAgMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXVwbG9hZEJ0biB7XG5cdFx0XHRcdFx0bWFyZ2luLXRvcDogNXB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BwZXJXcmFwcGVyIGltZyB7XG5cdFx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdG1heC1oZWlnaHQ6IDQwMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdHJpZ2h0OiAwO1xuXHRcdFx0XHRcdGJvdHRvbTogMDtcblx0XHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IDRweDtcblx0XHRcdFx0XHRtYXJnaW46IDAuNXJlbTtcblx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciA+IGEge1xuXHRcdFx0XHRcdGNvbG9yOiB2YXIoLS1Gb3JtLWl0ZW0tZm9udENvbG9yKTtcblx0XHRcdFx0XHRwYWRkaW5nOiAycHggNXB4O1xuXHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYTpob3ZlciB7XG5cdFx0XHRcdFx0Y29sb3I6IHZhcigtLWxpbmstY29sb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtYWNjZXB0VGlwIHtcblx0XHRcdFx0XHRoZWlnaHQ6IDEyMHB4O1xuXHRcdFx0XHRcdGNvbG9yOiAjOTk5O1xuXHRcdFx0XHRcdGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1ib3JkZXJDb2xvcik7XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1pbmZvKTtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjZjNmOWZlO1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cyk7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDEyMHB4O1xuXHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpeGVkLXNpemUge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbU92ZXJsYXkge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuYW50ZC1JbWFnZXMge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRcdFx0XHRcdG1hcmdpbjogY2FsYyh2YXIoLS1nYXAteHMpICogLTEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2VzLWl0ZW0ge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0XHRcdG1hcmdpbjogdmFyKC0tZ2FwLXhzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlIHtcblx0XHRcdFx0XHRcdGJvcmRlcjogdmFyKC0tYm9yZGVyV2lkdGgpIHNvbGlkIHZhcigtLWJvcmRlckNvbG9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLS10aHVtYiB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWJXcmFwIHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtaW1hZ2UtLWxvYWRpbmcge1xuXHRcdFx0XHRcdFx0dmlzaWJpbGl0eTogaGlkZGVuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtLW9yaWdpbmFsIC5hbnRkLUltYWdlLWltYWdlIHtcblx0XHRcdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdG1heC1oZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR3aWR0aDogYXV0bztcblx0XHRcdFx0XHRcdG1hcmdpbjogYXV0bztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iIHtcblx0XHRcdFx0XHRcdHdpZHRoOiA2Ljg3NXJlbTtcblx0XHRcdFx0XHRcdGhlaWdodDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0bGVmdDogNTAlO1xuXHRcdFx0XHRcdFx0dG9wOiA1MCU7XG5cdFx0XHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLWluZm8ge1xuXHRcdFx0XHRcdFx0cGFkZGluZzogNXB4IDEwcHg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIgLmFudGQtSW1hZ2UtaW5mbyB7XG5cdFx0XHRcdFx0XHR3aWR0aDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTQtMyB7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDUuMTU2MjVyZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tMTYtOSB7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDMuODY3MTg3NXJlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIHtcblx0XHRcdFx0XHRcdG1pbi13aWR0aDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHRtaW4taGVpZ2h0OiA2Ljg3NXJlbTtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iIHtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLWZpeGVkLXNpemUgLmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xuXHRcdFx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tdy1mdWxsID4gaW1nIHtcblx0XHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0I3tvcHRpb25zPy5zdHlsZXMgfHwgXCJcIn1cblxuXHRcdFx0XHRcdCN7b3B0aW9ucz8uYWRkX3N0eWxlcyB8fCBcIlwifVxuXHRcdFx0XHQ8L3N0eWxlPlxuXHRcdFx0PC9oZWFkPlxuXHRcdFx0PGJvZHk+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVlZG9zIHdvcmtmbG93IGluc3RhbmNlLXByaW50XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNraW4tZ3JlZW4gc2tpbi1hZG1pbi1sdGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb250ZW50LXdyYXBwZXJcIj5cblx0XHRcdFx0XHRcdFx0XHQje3Nob3dUcmFjZXNCdG59XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlLXByaW50XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zdGFuY2UgI3tpbnN0YW5jZV9zdHlsZX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGZvcm0gbmFtZT1cImluc3RhbmNlRm9ybVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZS1mb3JtIGJveCAje2luc3RhbmNlQm94U3R5bGV9XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje2Zvcm1EZXNjcmlwdGlvbkh0bWx9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm94LWJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIHN0eWxlPVwiYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdhdHRhY2htZW50cy1zZWN0aW9uJz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCN7YXR0YWNobWVudH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCN7cmVsYXRlZF9pbnN0YW5jZXN9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje3JlbGF0ZWRfcmVjb3Jkc31cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje2JvZHl9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZm9ybT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0I3t0cmFjZX1cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9ib2R5PlxuXHRcdFx0PHNjcmlwdD4je29wZW5GaWxlU2NyaXB0fTsje29uTG9hZFNjcmlwdH07I3tzaG93VHJhY2VzU2NyaXB0fTwvc2NyaXB0PlxuXHRcdDwvaHRtbD5cblx0XCJcIlwiXG5cblx0cmV0dXJuIGh0bWwiLCJ2YXIgX2dldExvY2FsZSwgX2dldFJlcXVpcmVkRmllbGRzLCBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMsIF9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcywgX2dldFRlbXBsYXRlRGF0YSwgX2dldFZpZXdIdG1sLCBnZXRMaW5rVGV4dCwgbWFya2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIik7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZSA9IHt9O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5zdGFuY2VfYXR0YWNobWVudCA9IFwiPHRyPlxcblx0PHRkIGNsYXNzPVxcXCJpbnMtYXR0YWNoLXZpZXdcXFwiPlxcblx0XHQ8YSBocmVmPVxcXCJ7e2luc19hdHRhY2hfZG93bmxvYWRfdXJsIF9pZCBhYnNvbHV0ZX19XFxcIiBjbGFzcz1cXFwiaW5zX2F0dGFjaF9ocmVmXFxcIiB0YXJnZXQ9XFxcIl9wYXJlbnRcXFwiIGRhdGEtbmFtZT1cXFwie3t0aGlzLm5hbWV9fVxcXCIgZGF0YS10eXBlPVxcXCJ7e3RoaXMub3JpZ2luYWwudHlwZX19XFxcIiBkYXRhLWlkPVxcXCJ7e19pZH19XFxcIj57e3RoaXMubmFtZX19PC9hPlxcblx0PC90ZD5cXG48L3RyPlwiO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZTZWxlY3RVc2VyUmVhZCA9IFwiPGRpdiBjbGFzcz0nc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCc+e3t2YWx1ZX19PC9kaXY+XCI7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5hZkZvcm1Hcm91cFJlYWQgPSBcIjxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAnPlxcblx0e3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxcblx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VjdGlvbid9fVxcblx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XFxuXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdHt7ZWxzZX19XFxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcXFwiPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7XFxcIj5cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1oZWFkaW5nXFxcIiA+XFxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicmVhZG9ubHktdGFibGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PHRhYmxlIHR5cGU9J3RhYmxlJyBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXFxcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVxcXCJ7e3RoaXMuY29kZX19VGFibGVcXFwiIG5hbWU9XFxcInt7dGhpcy5jb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3t0aGlzLm5hbWV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PHRoZWFkIGlkPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiIG5hbWU9XFxcInt7dGhpcy5uYW1lfX1UaGVhZFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RoZWFkPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGJvZHlcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVCb2R5IHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5Plxcblx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHR7eyNpZiBzaG93TGFiZWx9fVxcblx0XHRcdFx0XHQ8bGFiZWw+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0e3sjaWYgaXNUZXh0YXJlYSB0aGlzfX1cXG5cdFx0XHRcdFx0PHAgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9wPlxcblx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cXG5cdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHR7ey9pZn19XFxuXHRcdHt7L2lmfX1cXG5cdHt7L3dpdGh9fVxcbjwvZGl2PlwiO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXAgPSBcIlxcbnt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cXG5cdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J3NlY3Rpb24gY2FsbG91dCBjYWxsb3V0LWRlZmF1bHQnPlxcblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Zl9sYWJlbCB0aGlzfX08L2xhYmVsPlxcblx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cXG5cdFx0XHRcdDwvZGl2PlxcbiAgXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0e3tlbHNlfX1cXG5cdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAndGFibGUnfX1cXG5cdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVxcXCI+XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOjBweDtcXFwiPlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiID5cXG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz0nY29udHJvbC1sYWJlbCc+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XFxcImRlc2NyaXB0aW9uXFxcIj57e3tkZXNjcmlwdGlvbn19fTwvc3Bhbj5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJyZWFkb25seS10YWJsZVxcXCIgc3R5bGU9XFxcInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcXFwiIHN0eWxlPSdtYXJnaW4tYm90dG9tOjBweDsnIHt7dGhpcy5hdHRzfX0gaWQ9XFxcInt7dGhpcy5jb2RlfX1UYWJsZVxcXCIgbmFtZT1cXFwie3t0aGlzLmNvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e3RoaXMubmFtZX19XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XFxcInt7dGhpcy5uYW1lfX1UaGVhZFxcXCIgbmFtZT1cXFwie3t0aGlzLm5hbWV9fVRoZWFkXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlVGhlYWQgdGhpc319fVxcblx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVxcXCJ7e3RoaXMubmFtZX19VGJvZHlcXFwiIG5hbWU9XFxcInt7dGhpcy5uYW1lfX1UYm9keVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxcblx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XFxuXHRcdFx0XHRcdFx0XHRcdDwvdGFibGU+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdpbnB1dCd9fVxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiBkYXRhLXJlcXVpcmVkPVxcXCJ7eyNpZiBpc19yZXF1aXJlZH19dHJ1ZXt7L2lmfX1cXFwiPlxcblx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdHt7I2lmIGlzX3RleHRhcmVhfX1cXG5cdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiB7e2dldFBlcm1pc3Npb25zIGNvZGV9fSBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj48L3RleHRhcmVhPlxcblx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHR7eyN1bmxlc3MgaXNfdGV4dGFyZWF9fVxcblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIHt7Z2V0UGVybWlzc2lvbnMgY29kZX19IGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdHt7L3VubGVzc319XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ251bWJlcid9fVxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwibnVtYmVyXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnZGF0ZSd9fVxcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS10eXBlPVxcXCJkYXRlXFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnZGF0ZVRpbWUnfX1cXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtdHlwZT0nZGF0ZXRpbWUnIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdwYXNzd29yZCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwicGFzc3dvcmRcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWxlY3QnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNlbGVjdCBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjZWFjaCBvcHRpb25zIHRoaXN9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cXFwie3t2YWx1ZX19XFxcIj57e2xhYmVsfX08L29wdGlvbj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9zZWxlY3Q+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3JhZGlvJ319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImFmLXJhZGlvLWdyb3VwXFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cXG4gICAgICAgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcXFwiPjxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgdmFsdWU9XFxcInt7dmFsdWV9fVxcXCIgbmFtZT1cXFwie3suLi9jb2RlfX1cXFwiIGNsYXNzPVxcXCJyYWRpby1pbmxpbmUgZml4LWluZGVudFxcXCI+IHt7bGFiZWx9fTwvbGFiZWw+XFxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XFxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdtdWx0aVNlbGVjdCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJhZi1jaGVja2JveC1ncm91cFxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFxcXCI+PGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiB2YWx1ZT1cXFwie3t2YWx1ZX19XFxcIiBuYW1lPVxcXCJ7ey4uL2NvZGV9fVxcXCIgY2xhc3M9XFxcImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XFxcIj4ge3tsYWJlbH19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAndXJsJ319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ1cmxcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdlbWFpbCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwiZW1haWxcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdjaGVja2JveCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBzdHlsZT1cXFwid2lkdGg6IDEwMCU7XFxcIj48aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIHZhbHVlPVxcXCJ0cnVlXFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgY2xhc3M9XFxcImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XFxcIj48L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHR7ey9pZn19XFxuXHRcdHt7L2lmfX1cXG5cdHt7L3dpdGh9fVwiO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlID0gZnVuY3Rpb24odGVtcGFsdGVOYW1lLCBzdGVlZG9zRGF0YSkge1xuICB2YXIgdGVtcGxhdGUsIHRlbXBsYXRlQ29tcGlsZWQsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb247XG4gIHRlbXBsYXRlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlW3RlbXBhbHRlTmFtZV07XG4gIHRlbXBsYXRlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICB0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uID0gZXZhbCh0ZW1wbGF0ZUNvbXBpbGVkKTtcbiAgVGVtcGxhdGVbdGVtcGFsdGVOYW1lXSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZSh0ZW1wYWx0ZU5hbWUsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIHJldHVybiBUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLmhlbHBlcnMoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dCA9IGZ1bmN0aW9uKHN0ZWVkb3NEYXRhKSB7XG4gIHZhciBpbnN0YW5jZVNpZ25UZXh0Q29tcGlsZWQsIGluc3RhbmNlU2lnblRleHRIdG1sLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb247XG4gIGluc3RhbmNlU2lnblRleHRIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW5zdGFuY2Vfc2lnbl90ZXh0Lmh0bWwnKTtcbiAgaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVNpZ25UZXh0SHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgaW5zdGFuY2VTaWduVGV4dFJlbmRlckZ1bmN0aW9uID0gZXZhbChpbnN0YW5jZVNpZ25UZXh0Q29tcGlsZWQpO1xuICBUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VTaWduVGV4dFwiLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMoSW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVJbWFnZVNpZ24gPSBmdW5jdGlvbihzdGVlZG9zRGF0YSkge1xuICB2YXIgaW1hZ2VTaWduQ29tcGlsZWQsIGltYWdlU2lnbkh0bWwsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uO1xuICBpbWFnZVNpZ25IdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW1hZ2Vfc2lnbi5odG1sJyk7XG4gIGltYWdlU2lnbkNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbWFnZVNpZ25IdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBpbWFnZVNpZ25SZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW1hZ2VTaWduQ29tcGlsZWQpO1xuICBUZW1wbGF0ZS5pbWFnZVNpZ24gPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbWFnZVNpZ25cIiwgaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbWFnZVNpZ24uc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgcmV0dXJuIFRlbXBsYXRlLmltYWdlU2lnbi5oZWxwZXJzKEltYWdlU2lnbi5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgdmFyIHRyYWNlc0hhbmxkZXJDb21waWxlZCwgdHJhY2VzSGFubGRlckh0bWwsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbjtcbiAgdHJhY2VzSGFubGRlckh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXNfaGFuZGxlci5odG1sJyk7XG4gIHRyYWNlc0hhbmxkZXJDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSGFubGRlckh0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbiA9IGV2YWwodHJhY2VzSGFubGRlckNvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZV90cmFjZXNfaGFuZGxlclwiLCB0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlci5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuaGVscGVycyhUcmFjZXNIYW5kbGVyLmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluaXQgPSBmdW5jdGlvbihzdGVlZG9zRGF0YSkge1xuICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlKFwiYWZTZWxlY3RVc2VyUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG4gIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlKFwiYWZGb3JtR3JvdXBcIiwgc3RlZWRvc0RhdGEpO1xuICB9XG4gIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImluc3RhbmNlX2F0dGFjaG1lbnRcIiwge1xuICAgICAgYWJzb2x1dGU6IHN0ZWVkb3NEYXRhLmFic29sdXRlXG4gICAgfSk7XG4gICAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUltYWdlU2lnbihzdGVlZG9zRGF0YSk7XG4gICAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIoc3RlZWRvc0RhdGEpO1xuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dChzdGVlZG9zRGF0YSk7XG4gIH1cbn07XG5cbmdldExpbmtUZXh0ID0gZnVuY3Rpb24oaXRlbSwgbGFiZWwsIGRldGFpbF91cmwpIHtcbiAgaWYgKGRldGFpbF91cmwpIHtcbiAgICBkZXRhaWxfdXJsID0gZGV0YWlsX3VybC5yZXBsYWNlKFwie19pZH1cIiwgaXRlbS5faWQpO1xuICAgIGlmICghL15odHRwKHM/KTpcXC9cXC8vLnRlc3QoZGV0YWlsX3VybCkpIHtcbiAgICAgIGRldGFpbF91cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKGRldGFpbF91cmwpO1xuICAgIH1cbiAgICByZXR1cm4gJzxhIGhyZWY9XCInICsgZGV0YWlsX3VybCArICdcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nICsgbGFiZWwgKyAnPC9hPic7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSwgZmllbGQsIGxvY2FsZSwgdXRjT2Zmc2V0KSB7XG4gIHZhciBkYXRlLCBkZXRhaWxfdXJsLCBlLCBmaWVsZE9wdGlvbnMsIGhvdXJzLCBtb250aCwgbmFtZUZpZWxkLCByZWNvcmRzLCByZXMsIHNlY29uZHMsIHNlbGVjdGVkT3B0aW9uLCBzZWxlY3RlZE9wdGlvbnMsIHNwbGl0ZWRWYWx1ZXMsIHQsIHQwLCB0MSwgdWlTY2hlbWEsIHllYXI7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IGZhbHNlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGlmIChbXCJzZWxlY3RcIiwgXCJtdWx0aVNlbGVjdFwiLCBcInJhZGlvXCJdLmluZGV4T2YoZmllbGQudHlwZSkgPiAtMSkge1xuICAgIGZpZWxkT3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHZhciBpdGVtU3BsaXRzO1xuICAgICAgaXRlbVNwbGl0cyA9IG4uc3BsaXQoXCI6XCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG4gICAgICAgIHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSAnZW1haWwnOlxuICAgICAgdmFsdWUgPSB2YWx1ZSA/ICc8YSBocmVmPVxcJ21haWx0bzonICsgdmFsdWUgKyAnXFwnPicgKyB2YWx1ZSArICc8L2E+JyA6ICcnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXJsJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihcImh0dHBcIikgPT09IDApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBcIjxhIGhyZWY9J1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldFByb3BlcnR5KFwiZnVsbG5hbWVcIikudG9TdHJpbmcoKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmZ1bGxuYW1lIDogdm9pZCAwO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXNlcic6XG4gICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKCkgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5uYW1lIDogdm9pZCAwO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFzc3dvcmQnOlxuICAgICAgdmFsdWUgPSAnKioqKioqJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJykge1xuICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiLCB7fSwgbG9jYWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIiwge30sIGxvY2FsZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID09PSAxNikge1xuICAgICAgICB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICB0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICB0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICB5ZWFyID0gdDBbMF07XG4gICAgICAgIG1vbnRoID0gdDBbMV07XG4gICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgaG91cnMgPSB0MVswXTtcbiAgICAgICAgc2Vjb25kcyA9IHQxWzFdO1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSwgaG91cnMsIHNlY29uZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKHZhbHVlLCB1dGNPZmZzZXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGltZSc6XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID09PSAxNikge1xuICAgICAgICB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICB0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICB0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICB5ZWFyID0gdDBbMF07XG4gICAgICAgIG1vbnRoID0gdDBbMV07XG4gICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgaG91cnMgPSB0MVswXTtcbiAgICAgICAgc2Vjb25kcyA9IHQxWzFdO1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSwgaG91cnMsIHNlY29uZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGlmIChmaWVsZC5pc190ZXh0YXJlYSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmFkaW8nOlxuICAgICAgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWw7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICBzcGxpdGVkVmFsdWVzID0gdmFsdWUuc3BsaXQoXCIsXCIpO1xuICAgICAgc2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBzcGxpdGVkVmFsdWVzLmluZGV4T2YoaXRlbS52YWx1ZSkgPiAtMTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZE9wdGlvbnMubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICAgIGlmIChmaWVsZC5pc19wZXJjZW50KSB7XG4gICAgICAgICAgdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvUGVyY2VudFN0cmluZyh2YWx1ZSwgZmllbGQuZGlnaXRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IFN0ZWVkb3MubnVtYmVyVG9TdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ29kYXRhJzpcbiAgICAgIGRldGFpbF91cmwgPSBmaWVsZC5kZXRhaWxfdXJsO1xuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gXy5tYXAodmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TGlua1RleHQoaXRlbSwgaXRlbVsnQGxhYmVsJ10sIGRldGFpbF91cmwpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZ2V0TGlua1RleHQodmFsdWUsIHZhbHVlWydAbGFiZWwnXSwgZGV0YWlsX3VybCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgdmFsdWUgPSBfLm1hcCh2YWx1ZSwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj4gPGRpdiBjbGFzcz1cImFudGQtSW1hZ2UgYW50ZC1JbWFnZS0tdGh1bWIgYW50ZC1JbWFnZUNvbnRyb2wtaW1hZ2VcIj4gPGRpdiBjbGFzcz1cImFudGQtSW1hZ2UtdGh1bWJXcmFwXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIiBzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nICsgaXRlbSArICdcIj48L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4nO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj4gPGRpdiBjbGFzcz1cImFudGQtSW1hZ2UgYW50ZC1JbWFnZS0tdGh1bWIgYW50ZC1JbWFnZUNvbnRyb2wtaW1hZ2VcIj4gPGRpdiBjbGFzcz1cImFudGQtSW1hZ2UtdGh1bWJXcmFwXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIiBzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nICsgdmFsdWUgKyAnXCI+PC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmICghZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICAgIHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvY2ZzX2ZpbGVzX2ZpbGVyZWNvcmQ/ZmlsdGVycz1bW1wiX2lkXCIsXCJpblwiLCAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ11dJmZpZWxkcz1bXCJfaWRcIixcIm9yaWdpbmFsXCJdJywge1xuICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVjb3JkcyA9IHJlcy5kYXRhLml0ZW1zO1xuICAgICAgICB9IGVsc2UgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICAgIHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoXCJjZnNfZmlsZXNfZmlsZXJlY29yZFwiLCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbW1wiX2lkXCIsICdpbicsIHZhbHVlXV0sXG4gICAgICAgICAgICBmaWVsZHM6IFtcIl9pZFwiLCBcIm9yaWdpbmFsXCJdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBfLm1hcChyZWNvcmRzLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgdmFyIGZpbGVOYW1lLCBmaWxlUHJldmlld0h0bWwsIGZpbGVVcmw7XG4gICAgICAgICAgZmlsZU5hbWUgPSBpdGVtLm9yaWdpbmFsLm5hbWU7XG4gICAgICAgICAgZmlsZVVybCA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoJy9hcGkvZmlsZXMvZmlsZXMvJyArIGl0ZW0uX2lkKTtcbiAgICAgICAgICBmaWxlUHJldmlld0h0bWwgPSAnJztcbiAgICAgICAgICBpZiAoW1wiLnBkZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wbmdcIiwgXCIuZ2lmXCJdLmluZGV4T2YoZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgtNCkpID4gLTEpIHtcbiAgICAgICAgICAgIGZpbGVQcmV2aWV3SHRtbCA9IFwiJmVuc3A7PGEgaHJlZj0nXCIgKyBmaWxlVXJsICsgXCInIHRhcmdldD0nX2JsYW5rJyBjbGFzcz0nYW50ZC1MaW5rJz48c3BhbiBjbGFzcz0nYW50ZC1UcGxGaWVsZCc+PHNwYW4+6aKE6KeIPC9zcGFuPjwvc3Bhbj48L2E+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXY+PGEgaHJlZj0nXCIgKyAoZmlsZVVybCArICc/ZG93bmxvYWQ9dHJ1ZScpICsgXCInIHRhcmdldD0nX2JsYW5rJz5cIiArIGZpbGVOYW1lICsgXCI8L2E+IFwiICsgKGZpbGVQcmV2aWV3SHRtbCAhPSBudWxsID8gZmlsZVByZXZpZXdIdG1sIDoge1xuICAgICAgICAgICAgZmlsZVByZXZpZXdIdG1sOiAnJ1xuICAgICAgICAgIH0pICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xvb2t1cCc6XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgICAgdWlTY2hlbWEgPSBDcmVhdG9yLmdldE9iamVjdChmaWVsZC5yZWZlcmVuY2VfdG8pO1xuICAgICAgICAgIG5hbWVGaWVsZCA9ICh1aVNjaGVtYSAhPSBudWxsID8gdWlTY2hlbWEuTkFNRV9GSUVMRF9LRVkgOiB2b2lkIDApIHx8ICduYW1lJztcbiAgICAgICAgICByZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxLycgKyBmaWVsZC5yZWZlcmVuY2VfdG8gKyAnP2ZpbHRlcnM9W1tcIicgKyAoZmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnKSArICdcIixcImluXCIsICcgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnXV0mZmllbGRzPVtcIl9pZFwiLFwiJyArIG5hbWVGaWVsZCArICdcIl0nLCB7XG4gICAgICAgICAgICBhc3luYzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWNvcmRzID0gcmVzLmRhdGEuaXRlbXM7XG4gICAgICAgIH0gZWxzZSBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgICAgbmFtZUZpZWxkID0gU3RlZWRvcy5nZXRPYmplY3ROYW1lRmllbGRLZXkoZmllbGQucmVmZXJlbmNlX3RvKTtcbiAgICAgICAgICByZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKGZpZWxkLnJlZmVyZW5jZV90bywge1xuICAgICAgICAgICAgZmlsdGVyczogW1tmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcsICdpbicsIHZhbHVlXV0sXG4gICAgICAgICAgICBmaWVsZHM6IFtcIl9pZFwiLCBuYW1lRmllbGRdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBfLm1hcChyZWNvcmRzLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPGEgaHJlZj0nXCIgKyAoU3RlZWRvcy5hYnNvbHV0ZVVybCgnL2FwcC8tLycgKyBmaWVsZC5yZWZlcmVuY2VfdG8gKyAnL3ZpZXcvJyArIGl0ZW0uX2lkKSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgaXRlbVtuYW1lRmllbGRdICsgXCI8L2E+XCI7XG4gICAgICAgIH0pO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oXCIgLCBcIik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdodG1sJzpcbiAgICAgIHZhbHVlID0gdmFsdWUgPyBcIjxkaXYgY2xhc3M9XFxcInN0ZWVkb3MtaHRtbFxcXCI+XCIgKyB2YWx1ZSArIFwiPC9kaXY+XCIgOiAnJztcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgPSBmdW5jdGlvbihmaWVsZHMsIGNvZGUpIHtcbiAgdmFyIGZpZWxkO1xuICBmaWVsZCA9IGZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKTtcbiAgaWYgKGZpZWxkKSB7XG4gICAgaWYgKGZpZWxkLm5hbWUpIHtcbiAgICAgIHJldHVybiBmaWVsZC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmllbGQuY29kZTtcbiAgICB9XG4gIH1cbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uID0gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgdmFyIGZvcm0sIGZvcm1fZmllbGRzLCBmb3JtX3ZlcnNpb247XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuICBmb3JtX3ZlcnNpb24gPSB7fTtcbiAgZm9ybV9maWVsZHMgPSBbXTtcbiAgaWYgKGZvcm0uY3VycmVudC5faWQgPT09IGluc3RhbmNlLmZvcm1fdmVyc2lvbikge1xuICAgIGZvcm1fdmVyc2lvbiA9IGZvcm0uY3VycmVudDtcbiAgfSBlbHNlIHtcbiAgICBmb3JtX3ZlcnNpb24gPSBfLndoZXJlKGZvcm0uaGlzdG9yeXMsIHtcbiAgICAgIF9pZDogaW5zdGFuY2UuZm9ybV92ZXJzaW9uXG4gICAgfSlbMF07XG4gIH1cbiAgZm9ybV92ZXJzaW9uLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgZm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICBpZiAoZmllbGQuZmllbGRzKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1fZmllbGRzLnB1c2goZik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgZmllbGRbJ3NmaWVsZHMnXSA9IGZpZWxkWydmaWVsZHMnXTtcbiAgICAgIGRlbGV0ZSBmaWVsZFsnZmllbGRzJ107XG4gICAgICByZXR1cm4gZm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH0pO1xuICBmb3JtX3ZlcnNpb24uZmllbGRzID0gZm9ybV9maWVsZHM7XG4gIHJldHVybiBmb3JtX3ZlcnNpb247XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24gPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZmxvdywgZmxvd192ZXJzaW9uO1xuICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcbiAgZmxvd192ZXJzaW9uID0ge307XG4gIGlmIChmbG93LmN1cnJlbnQuX2lkID09PSBpbnN0YW5jZS5mbG93X3ZlcnNpb24pIHtcbiAgICBmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnQ7XG4gIH0gZWxzZSB7XG4gICAgZmxvd192ZXJzaW9uID0gXy53aGVyZShmbG93Lmhpc3RvcnlzLCB7XG4gICAgICBfaWQ6IGluc3RhbmNlLmZsb3dfdmVyc2lvblxuICAgIH0pWzBdO1xuICB9XG4gIHJldHVybiBmbG93X3ZlcnNpb247XG59O1xuXG5fZ2V0Vmlld0h0bWwgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciB2aWV3SHRtbDtcbiAgdmlld0h0bWwgPSBBc3NldHMuZ2V0VGV4dChwYXRoKTtcbiAgaWYgKHZpZXdIdG1sKSB7XG4gICAgdmlld0h0bWwgPSB2aWV3SHRtbC5yZXBsYWNlKC88dGVtcGxhdGVbXFx3XFxzXFxcIlxcPSddKz4vaSwgXCJcIikucmVwbGFjZSgvPFxcL3RlbXBsYXRlPi9pLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gdmlld0h0bWw7XG59O1xuXG5fZ2V0TG9jYWxlID0gZnVuY3Rpb24odXNlcikge1xuICB2YXIgbG9jYWxlLCByZWYsIHJlZjE7XG4gIGlmICgodXNlciAhPSBudWxsID8gKHJlZiA9IHVzZXIubG9jYWxlKSAhPSBudWxsID8gcmVmLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDAgOiB2b2lkIDApID09PSAnemgtY24nKSB7XG4gICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICB9IGVsc2UgaWYgKCh1c2VyICE9IG51bGwgPyAocmVmMSA9IHVzZXIubG9jYWxlKSAhPSBudWxsID8gcmVmMS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogdm9pZCAwIDogdm9pZCAwKSA9PT0gJ2VuLXVzJykge1xuICAgIGxvY2FsZSA9IFwiZW5cIjtcbiAgfSBlbHNlIHtcbiAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gIH1cbiAgcmV0dXJuIGxvY2FsZTtcbn07XG5cbl9nZXRSZXF1aXJlZEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgcmV2KSB7XG4gIGlmICghcmV2KSB7XG4gICAgcmV2ID0gW107XG4gIH1cbiAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkLmZpZWxkcywgcmV2KTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmllbGQuaXNfcmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIHJldi5wdXNoKGZpZWxkLmNvZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXY7XG59O1xuXG5fZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMgPSBmdW5jdGlvbihmaWVsZHMsIHN0ZXBzKSB7XG4gIHZhciBlZGl0YWJsZUNvZGUsIHN0YXJ0U3RlcDtcbiAgc3RhcnRTdGVwID0gc3RlcHMuZmluZFByb3BlcnR5QnlQSyhcInN0ZXBfdHlwZVwiLCBcInN0YXJ0XCIpO1xuICBlZGl0YWJsZUNvZGUgPSBbXTtcbiAgXy5rZXlzKHN0YXJ0U3RlcC5wZXJtaXNzaW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoc3RhcnRTdGVwLnBlcm1pc3Npb25zW2tleV0gPT09ICdlZGl0YWJsZScpIHtcbiAgICAgIHJldHVybiBlZGl0YWJsZUNvZGUucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBlZGl0YWJsZUNvZGU7XG59O1xuXG5fZ2V0U3RhcnRTdGVwUmVxdWlyZWRGaWVsZHMgPSBmdW5jdGlvbihmaWVsZHMsIHN0ZXBzKSB7XG4gIHZhciBlZGl0YWJsZUNvZGUsIHJlcXVpcmVkRmllbGRzO1xuICByZXF1aXJlZEZpZWxkcyA9IF9nZXRSZXF1aXJlZEZpZWxkcyhmaWVsZHMpO1xuICBlZGl0YWJsZUNvZGUgPSBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMoZmllbGRzLCBzdGVwcyk7XG4gIHJldHVybiBfLmludGVyc2VjdGlvbihyZXF1aXJlZEZpZWxkcywgZWRpdGFibGVDb2RlKTtcbn07XG5cbl9nZXRUZW1wbGF0ZURhdGEgPSBmdW5jdGlvbih1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGZsb3csIGZvcm0sIGZvcm1fdmVyc2lvbiwgbG9jYWxlLCBzdGVlZG9zRGF0YTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIGZvcm1fdmVyc2lvbiA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbihpbnN0YW5jZSk7XG4gIH1cbiAgbG9jYWxlID0gX2dldExvY2FsZSh1c2VyKTtcbiAgc3RlZWRvc0RhdGEgPSB7fTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHN0ZWVkb3NEYXRhID0gXy5jbG9uZShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCkpO1xuICAgIHN0ZWVkb3NEYXRhLmluc25hbWUgPSBpbnN0YW5jZS5uYW1lO1xuICAgIHN0ZWVkb3NEYXRhLmluc19zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgIHN0ZWVkb3NEYXRhLmluc19maW5hbF9kZWNpc2lvbiA9IGluc3RhbmNlLmluc19maW5hbF9kZWNpc2lvbjtcbiAgICBzdGVlZG9zRGF0YS5pbnNfY29kZSA9IGluc3RhbmNlLmNvZGU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX2lzX2FyY2hpdmVkID0gaW5zdGFuY2UuaXNfYXJjaGl2ZWQ7XG4gICAgc3RlZWRvc0RhdGEuaW5zX2lzX2RlbGV0ZWQgPSBpbnN0YW5jZS5pbnNfaXNfZGVsZXRlZDtcbiAgICBzdGVlZG9zRGF0YS5hcHBsaWNhbnRfbmFtZSA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lO1xuICAgIHN0ZWVkb3NEYXRhLmFwcGxpY2FudENvbnRleHQgPSBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZTtcbiAgfVxuICBzdGVlZG9zRGF0YS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICBzdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb24gPSBmb3JtX3ZlcnNpb247XG4gIHN0ZWVkb3NEYXRhLmxvY2FsZSA9IGxvY2FsZTtcbiAgc3RlZWRvc0RhdGEudXRjT2Zmc2V0ID0gdXNlci51dGNPZmZzZXQ7XG4gIHN0ZWVkb3NEYXRhLnNwYWNlID0gaW5zdGFuY2Uuc3BhY2U7XG4gIHN0ZWVkb3NEYXRhLnNlc3Npb25Vc2VySWQgPSB1c2VyLl9pZDtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmVkaXRhYmxlIDogdm9pZCAwKSB7XG4gICAgICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogaW5zdGFuY2UuZm9ybVxuICAgICAgfSk7XG4gICAgICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7XG4gICAgICAgIF9pZDogaW5zdGFuY2UuZmxvd1xuICAgICAgfSk7XG4gICAgICBzdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmb3JtLmN1cnJlbnQuZmllbGRzLCBmbG93LmN1cnJlbnQuc3RlcHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RlZWRvc0RhdGE7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUsIHV0Y09mZnNldCkge1xuICB2YXIgcGFzc2luZztcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIHBhc3NpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBwYXNzaW5nID0gdHJ1ZTtcbiAgfVxuICBpZiAoIXV0Y09mZnNldCAmJiB1dGNPZmZzZXQgIT09IDApIHtcbiAgICB1dGNPZmZzZXQgPSA4O1xuICB9XG4gIHJldHVybiBtb21lbnQoZGF0ZSkudXRjT2Zmc2V0KHV0Y09mZnNldCwgcGFzc2luZykuZm9ybWF0KFwiWVlZWS1NTS1ERCBISDptbVwiKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lID0gZnVuY3Rpb24oZGF0ZSkge1xuICB2YXIgdXRjT2Zmc2V0O1xuICB1dGNPZmZzZXQgPSAwO1xuICByZXR1cm4gbW9tZW50KGRhdGUpLnV0Y09mZnNldCh1dGNPZmZzZXQpLmZvcm1hdChcIkhIOm1tXCIpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgaW5zdGFuY2VDb21waWxlZCwgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbiwgaW5zdGFuY2VUZW1wbGF0ZSwgc3RlZWRvc0RhdGE7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5hYnNvbHV0ZSA6IHZvaWQgMCkge1xuICAgIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gdHJ1ZTtcbiAgfVxuICBpbnN0YW5jZVRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlLCBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRlbXBsYXRlTmFtZSA6IHZvaWQgMCk7XG4gIGluc3RhbmNlVGVtcGxhdGUgPSBpbnN0YW5jZVRlbXBsYXRlLnJlcGxhY2UoL2FmU2VsZWN0VXNlci9nLCBcImFmU2VsZWN0VXNlclJlYWRcIik7XG4gIGlmICghKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApKSB7XG4gICAgaW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZGb3JtR3JvdXAvZywgXCJhZkZvcm1Hcm91cFJlYWRcIik7XG4gIH1cbiAgaW5zdGFuY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VUZW1wbGF0ZSwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VDb21waWxlZCk7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZV9yZWFkb25seV92aWV3XCIsIGluc3RhbmNlUmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyhJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzKTtcbiAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluaXQoc3RlZWRvc0RhdGEpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldywgc3RlZWRvc0RhdGEpO1xuICByZXR1cm4gXCI8ZGl2IGlkPSdpbnN0YW5jZWZvcm0nID5cXG5cdFwiICsgYm9keSArIFwiXFxuPC9kaXY+XCI7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgZm9ybSwgc3RlZWRvc0RhdGEsIHRyYWNlQ29tcGlsZWQsIHRyYWNlUmVuZGVyRnVuY3Rpb24sIHRyYWNlc0h0bWw7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcbiAgaWYgKGZvcm0uaW5zdGFuY2Vfc3R5bGUgPT09IFwidGFibGVcIiB8fCAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50ZW1wbGF0ZU5hbWUgOiB2b2lkIDApID09PSBcInRhYmxlXCIpIHtcbiAgICB0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX3RhYmxlLmh0bWwnKTtcbiAgfSBlbHNlIHtcbiAgICB0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzLmh0bWwnKTtcbiAgfVxuICB0cmFjZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0cmFjZXNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICB0cmFjZVJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZUNvbXBpbGVkKTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInRyYWNlX3JlYWRvbmx5X3ZpZXdcIiwgdHJhY2VSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzKFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldywgaW5zdGFuY2UudHJhY2VzKTtcbiAgcmV0dXJuIGJvZHk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcgPSBmdW5jdGlvbih1c2VyLCBzcGFjZSwgaW5zdGFuY2UpIHtcbiAgdmFyIGF0dGFjaG1lbnRDb21waWxlZCwgYXR0YWNobWVudEh0bWwsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiwgYm9keSwgc3RlZWRvc0RhdGE7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICBhdHRhY2htZW50SHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2luc3RhbmNlX2F0dGFjaG1lbnRzLmh0bWwnKTtcbiAgYXR0YWNobWVudENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShhdHRhY2htZW50SHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uID0gZXZhbChhdHRhY2htZW50Q29tcGlsZWQpO1xuICBUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiYXR0YWNobWVudHNfcmVhZG9ubHlfdmlld1wiLCBhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuaGVscGVycyhJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgcmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkLCByZWxhdGVkSW5zdGFuY2VzSHRtbCwgcmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIHJlbGF0ZWRJbnN0YW5jZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9pbnN0YW5jZXMuaHRtbCcpO1xuICByZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICByZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24gPSBldmFsKHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCk7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX2luc3RhbmNlc192aWV3XCIsIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5oZWxwZXJzKFJlbGF0ZWRJbnN0YW5jZXMuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgcmVsYXRlZFJlY29yZHNDb21waWxlZCwgcmVsYXRlZFJlY29yZHNIdG1sLCByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIHJlbGF0ZWRSZWNvcmRzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3JlbGF0ZWRfcmVjb3Jkcy5odG1sJyk7XG4gIHJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRSZWNvcmRzSHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgcmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZFJlY29yZHNDb21waWxlZCk7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwicmVsYXRlZF9yZWNvcmRzX3ZpZXdcIiwgcmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LmhlbHBlcnMoUmVsYXRlZFJlY29yZHMuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldywgc3RlZWRvc0RhdGEpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRPbkxvYWRTY3JpcHQgPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZm9ybV9zY3JpcHQsIGZvcm1fdmVyc2lvbjtcbiAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbik7XG4gIGZvcm1fc2NyaXB0ID0gZm9ybV92ZXJzaW9uLmZvcm1fc2NyaXB0O1xuICBpZiAoZm9ybV9zY3JpcHQgJiYgZm9ybV9zY3JpcHQucmVwbGFjZSgvXFxuL2csIFwiXCIpLnJlcGxhY2UoL1xccy9nLCBcIlwiKS5sZW5ndGggPiAwKSB7XG4gICAgZm9ybV9zY3JpcHQgPSBcIkNvcmVGb3JtID0ge307Q29yZUZvcm0uaW5zdGFuY2Vmb3JtID0ge307XCIgKyBmb3JtX3NjcmlwdDtcbiAgICByZXR1cm4gZm9ybV9zY3JpcHQgKz0gXCI7aWYoQ29yZUZvcm0uZm9ybV9PbkxvYWQpe3dpbmRvdy5vbmxvYWQgPSBDb3JlRm9ybS5mb3JtX09uTG9hZCgpO31cIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZm9ybV9zY3JpcHQgPSBcIlwiO1xuICB9XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBhbGxDc3NMaW5rLCBhdHRhY2htZW50LCBib2R5LCBjcmVhdG9yU2VydmljZSwgY3NzSHJlZiwgZm9ybSwgZm9ybURlc2NyaXB0aW9uLCBmb3JtRGVzY3JpcHRpb25IdG1sLCBodG1sLCBpbnNfcmVjb3JkX2lkcywgaW5zdGFuY2VCb3hTdHlsZSwgaW5zdGFuY2Vfc3R5bGUsIGpxSHJlZiwgbG9jYWxlLCBvbkxvYWRTY3JpcHQsIG9wZW5GaWxlU2NyaXB0LCByZWYsIHJlZjEsIHJlbGF0ZWRfaW5zdGFuY2VzLCByZWxhdGVkX3JlY29yZHMsIHNob3dUcmFjZXNCdG4sIHNob3dUcmFjZXNTY3JpcHQsIHRyYWNlLCB0cmFjZUNoZWNrLCB3aWR0aDtcbiAgYm9keSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZVZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgb25Mb2FkU2NyaXB0ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdChpbnN0YW5jZSk7XG4gIGNyZWF0b3JTZXJ2aWNlID0gKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcykgIT0gbnVsbCA/IChyZWYxID0gcmVmLmNyZWF0b3IpICE9IG51bGwgPyByZWYxLnVybCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgaW5zX3JlY29yZF9pZHMgPSBpbnN0YW5jZS5yZWNvcmRfaWRzO1xuICBsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuICBvcGVuRmlsZVNjcmlwdCA9IFwiaWYod2luZG93LmlzTm9kZSAmJiBpc05vZGUoKSl7XFxuXHRhdHRhY2hzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcXFwiaW5zX2F0dGFjaF9ocmVmXFxcIik7XFxuXHRmb3IodmFyIGkgPSAwOyBpIDwgYXR0YWNocy5sZW5ndGg7IGkrKyl7XFxuXHRcdGF0dGFjaCA9IGF0dGFjaHNbaV07XFxuXHRcdGF0dGFjaC5hZGRFdmVudExpc3RlbmVyKFxcXCJjbGlja1xcXCIsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdGlmKGlzSW1hZ2UodGhpcy5kYXRhc2V0LnR5cGUpIHx8IGlzSHRtbCh0aGlzLmRhdGFzZXQudHlwZSkpe1xcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xcblx0XHRcdFx0b3BlbldpbmRvdyhcXFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXFxcIiArIHRoaXMuZGF0YXNldC5pZCk7XFxuXHRcdFx0fWVsc2UgaWYobndfY29yZS5jYW5PcGVuRmlsZSh0aGlzLmRhdGFzZXQubmFtZSkpe1xcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xcblx0XHRcdFx0bndfY29yZS5vcGVuRmlsZSh0aGlzLmhyZWYsIHRoaXMuZGF0YXNldC5uYW1lKVxcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxufVxcblxcbnZhciBmbG93ID0gXFxcIlwiICsgaW5zdGFuY2UuZmxvdyArIFwiXFxcIjtcXG52YXIgc3BhY2UgPSBcXFwiXCIgKyBpbnN0YW5jZS5zcGFjZSArIFwiXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRDb29raWUobmFtZSl7XFxuXHRsZXQgcGF0dGVybiA9IFJlZ0V4cChuYW1lICsgXFxcIj0uW147XSpcXFwiKVxcblx0bGV0IG1hdGNoZWQgPSBkb2N1bWVudC5jb29raWUubWF0Y2gocGF0dGVybilcXG5cdGlmKG1hdGNoZWQpe1xcblx0XHRsZXQgY29va2llID0gbWF0Y2hlZFswXS5zcGxpdCgnPScpXFxuXHRcdHJldHVybiBjb29raWVbMV1cXG5cdH1cXG5cdHJldHVybiAnJ1xcbn1cXG5cXG52YXIgcmVjb3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXFxcImlucy1yZWxhdGVkLXJlY29yZHNcXFwiKTtcXG5mb3IodmFyIGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKyl7XFxuXHRcdHZhciByZWNvcmQgPSByZWNvcmRzW2ldO1xcblx0XHRyZWNvcmQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiY2xpY2tcXFwiLCBmdW5jdGlvbihlKXtcXG5cdFx0XHR2YXIgY3JlYXRvclNlcnZpY2UgPSBcXFwiXCIgKyBjcmVhdG9yU2VydmljZSArIFwiXFxcIlxcblx0XHRcdHZhciBpbnNfcmVjb3JkX2lkcyA9IFwiICsgKEpTT04uc3RyaW5naWZ5KGluc19yZWNvcmRfaWRzKSkgKyBcIlxcblx0XHRcdGlmKGNyZWF0b3JTZXJ2aWNlICYmIGluc19yZWNvcmRfaWRzICYmIGluc19yZWNvcmRfaWRzLmxlbmd0aCA+IDApe1xcblx0XHRcdFx0dmFyIG9iamNldE5hbWUgPSBpbnNfcmVjb3JkX2lkc1swXS5vXFxuXHRcdFx0XHR2YXIgaWQgPSBpbnNfcmVjb3JkX2lkc1swXS5pZHNbMF1cXG5cdFx0XHRcdHZhciB1b2JqID0ge307XFxuXHRcdFx0XHR1b2JqW1xcXCJYLVVzZXItSWRcXFwiXSA9IGdldENvb2tpZShcXFwiWC1Vc2VyLUlkXFxcIik7XFxuXHRcdFx0XHR1b2JqW1xcXCJYLUF1dGgtVG9rZW5cXFwiXSA9IGdldENvb2tpZShcXFwiWC1BdXRoLVRva2VuXFxcIik7XFxuXHRcdFx0XHRyZWRpcmVjdFVybCA9IGNyZWF0b3JTZXJ2aWNlICsgXFxcImFwcC8tL1xcXCIgKyBvYmpjZXROYW1lICsgXFxcIi92aWV3L1xcXCIgKyBpZCArIFxcXCI/XFxcIiArICQucGFyYW0odW9iaik7XFxuXHRcdFx0XHRvcGVuV2luZG93KHJlZGlyZWN0VXJsKTtcXG5cdFx0XHR9XFxuXHRcdH0pO1xcblx0fVxcblwiO1xuICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuICAgIGlmICgoZm9ybSAhPSBudWxsID8gZm9ybS5pbnN0YW5jZV9zdHlsZSA6IHZvaWQgMCkgPT09ICd0YWJsZScpIHtcbiAgICAgIGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiO1xuICAgIH1cbiAgfVxuICBpZiAoKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMudGVtcGxhdGVOYW1lIDogdm9pZCAwKSA9PT0gJ3RhYmxlJykge1xuICAgIGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiO1xuICB9XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSB7XG4gICAgaW5zdGFuY2Vfc3R5bGUgPSBvcHRpb25zLmluc3RhbmNlX3N0eWxlO1xuICB9XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnNob3dUcmFjZSA9PT0gdHJ1ZSkge1xuICAgIHRyYWNlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFRyYWNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICB0cmFjZSA9IFwiXCI7XG4gIH1cbiAgaW5zdGFuY2VCb3hTdHlsZSA9IFwiXCI7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5maW5hbF9kZWNpc2lvbikge1xuICAgIGlmIChpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICBpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtc3VjY2Vzc1wiO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgaW5zdGFuY2VCb3hTdHlsZSA9IFwiYm94LWRhbmdlclwiO1xuICAgIH1cbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zaG93QXR0YWNobWVudHMgPT09IHRydWUpIHtcbiAgICBhdHRhY2htZW50ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gICAgcmVsYXRlZF9pbnN0YW5jZXMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZEluc3RhbmNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgICByZWxhdGVkX3JlY29yZHMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXR0YWNobWVudCA9IFwiXCI7XG4gICAgcmVsYXRlZF9pbnN0YW5jZXMgPSBcIlwiO1xuICAgIHJlbGF0ZWRfcmVjb3JkcyA9IFwiXCI7XG4gIH1cbiAgd2lkdGggPSBcIjk2MHB4XCI7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLndpZHRoIDogdm9pZCAwKSB7XG4gICAgd2lkdGggPSBcIlwiO1xuICB9XG4gIGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJzdGVlZG9zLWNzc1wiKTtcbiAganFIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwid2Vic2l0ZS9saWJzL2pxdWVyeS5taW4uanNcIik7XG4gIGFsbENzc0xpbmsgPSBcIjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGNsYXNzPVxcXCJfX21ldGVvci1jc3NfX1xcXCIgaHJlZj1cXFwiXCIgKyBjc3NIcmVmICsgXCJcXFwiPlwiO1xuICB0cmFjZUNoZWNrID0gXCJcIjtcbiAgaWYgKCFfLmlzRW1wdHkodHJhY2UpKSB7XG4gICAgdHJhY2VDaGVjayA9IFwiY2hlY2tlZFwiO1xuICB9XG4gIGlmICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50YWdnZXIgOiB2b2lkIDApID09PSAnZW1haWwnIHx8IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmVkaXRhYmxlIDogdm9pZCAwKSkge1xuICAgIHNob3dUcmFjZXNCdG4gPSBcIlwiO1xuICB9IGVsc2Uge1xuICAgIHNob3dUcmFjZXNCdG4gPSBcIjxkaXYgY2xhc3M9XFxcIm5hdmlnYXRpb24tYmFyIGJ0bi1ncm91cCBuby1wcmludFxcXCIgc3R5bGU9XFxcIm1pbi13aWR0aDogNjAwcHg7IHotaW5kZXg6IDk5OTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcXFwiPlxcblx0PGRpdiBjbGFzcz1cXFwicHJpbnQtdG9vbFxcXCI+XFxuXHRcdDxsYWJlbCBjbGFzcz1cXFwiY2J4LWxhYmVsXFxcIj48aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGNsYXNzPVxcXCJjYngtcHJpbnQgY2J4LXByaW50LWF0dGFjaG1lbnRzXFxcIiBpZD1cXFwiY2J4LXByaW50LWF0dGFjaG1lbnRzXFxcIiBjaGVja2VkPVxcXCJjaGVja2VkXFxcIj48c3Bhbj5cIiArIChUQVBpMThuLl9fKCdpbnN0YW5jZV9hdHRhY2htZW50Jywge30sIGxvY2FsZSkpICsgXCI8L3NwYW4+PC9sYWJlbD5cXG5cdFx0PGxhYmVsIGNsYXNzPVxcXCJjYngtbGFiZWxcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2xhc3M9XFxcImNieC1wcmludCBjYngtcHJpbnQtdHJhY2VzXFxcIiBpZD1cXFwiY2J4LXByaW50LXRyYWNlc1xcXCIgY2hlY2tlZD1cXFwiXCIgKyB0cmFjZUNoZWNrICsgXCJcXFwiPjxzcGFuPlwiICsgKFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmFsX2hpc3RvcnknLCB7fSwgbG9jYWxlKSkgKyBcIjwvc3Bhbj48L2xhYmVsPlxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gIH1cbiAgc2hvd1RyYWNlc1NjcmlwdCA9IFwiJCggZG9jdW1lbnQgKS5yZWFkeShmdW5jdGlvbigpe1xcblx0dmFyIGIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LXRyYWNlcycpO1xcblx0dmFyIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnN0YW5jZS10cmFjZXMnKVswXTtcXG5cdGlmIChiICYmIGIuY2hlY2tlZCAmJiB0KXtcXG5cdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXFxuXHR9IGVsc2UgaWYodCl7XFxuXHRcdHQuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHR9XFxuXHRpZihiKXtcXG5cdFx0Yi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcXG5cdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XFxuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdFx0XHR9IGVsc2Uge1xcblx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcXG5cdFx0XHR9XFxuXHRcdH0pO1xcblx0fVxcblxcblxcblx0dmFyIGF0dGFjaG1lbnRzQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LWF0dGFjaG1lbnRzJyk7XFxuXHR2YXIgYXR0YWNobWVudHNWaWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0YWNobWVudHMtc2VjdGlvbicpWzBdO1xcblx0aWYgKGF0dGFjaG1lbnRzQ2hlY2tib3ggJiYgYXR0YWNobWVudHNDaGVja2JveC5jaGVja2VkICYmIGF0dGFjaG1lbnRzVmlldyl7XFxuXHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXFxuXHR9IGVsc2UgaWYoYXR0YWNobWVudHNWaWV3KXtcXG5cdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0fVxcblx0aWYoYXR0YWNobWVudHNDaGVja2JveCl7XFxuXHRcdGF0dGFjaG1lbnRzQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSl7XFxuXHRcdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpe1xcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdFx0XHR9IGVsc2Uge1xcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxufSk7XFxuXCI7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnN0eWxlcyA6IHZvaWQgMCkge1xuICAgIGFsbENzc0xpbmsgPSBcIlwiO1xuICB9XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICBfaWQ6IGluc3RhbmNlLmZvcm1cbiAgfSk7XG4gIGZvcm1EZXNjcmlwdGlvbkh0bWwgPSBcIlwiO1xuICBpZiAoZm9ybSkge1xuICAgIGZvcm1EZXNjcmlwdGlvbiA9IGZvcm0uZGVzY3JpcHRpb247XG4gICAgaWYgKGZvcm1EZXNjcmlwdGlvbikge1xuICAgICAgZm9ybURlc2NyaXB0aW9uID0gZm9ybURlc2NyaXB0aW9uLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuICAgICAgZm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiPGRpdiBjbGFzcz1cXFwiYm94LWhlYWRlciAgd2l0aC1ib3JkZXIgaW5zdGFuY2UtaGVhZGVyXFxcIj5cXG5cdDxkaXY+XFxuXHRcdFwiICsgZm9ybURlc2NyaXB0aW9uICsgXCJcXG5cdDwvZGl2PlxcbjwvZGl2PlwiO1xuICAgIH1cbiAgfVxuICBodG1sID0gXCI8IURPQ1RZUEUgaHRtbD5cXG48aHRtbD5cXG5cdDxoZWFkPlxcblx0XHQ8bWV0YSBodHRwLWVxdWl2PVxcXCJDb250ZW50LVR5cGVcXFwiIGNvbnRlbnQ9XFxcInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFxcXCIvPlxcblx0XHRcIiArIGFsbENzc0xpbmsgKyBcIlxcblx0XHQ8c2NyaXB0IHNyYz1cXFwiXCIgKyBqcUhyZWYgKyBcIlxcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cXG5cdFx0PHNjcmlwdCBzcmM9XFxcIi9qcy9ud19jb3JlLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0Plxcblx0XHRcIiArIChvcHRpb25zLnBsdWdpbnMgfHwgXCJcIikgKyBcIlxcblxcblx0XHQ8c3R5bGU+XFxuXHRcdFx0LnN0ZWVkb3N7XFxuXHRcdFx0XHR3aWR0aDogXCIgKyB3aWR0aCArIFwiO1xcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IGF1dG87XFxuXHRcdFx0XHRtYXJnaW4tcmlnaHQ6IGF1dG87XFxuXHRcdFx0fVxcblxcblx0XHRcdC5pbnN0YW5jZS12aWV3IC5pbnN0YW5jZS1uYW1le1xcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnRcXG5cdFx0XHR9XFxuXHRcdFx0LmJveC10b29sc3tcXG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XFxuXHRcdFx0fVxcblx0XHRcdC5ib3guY29sbGFwc2VkLWJveCAuYm94LWJvZHksLmJveC5jb2xsYXBzZWQtYm94IC5ib3gtZm9vdGVyIHtcXG5cdFx0XHQgIGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cXG5cdFx0XHRib2R5e1xcblx0XHRcdFx0YmFja2dyb3VuZDogYXp1cmUgIWltcG9ydGFudDtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLXRyYWNlc3tcXG5cdFx0XHRcdHBhZGRpbmctbGVmdDogMTVweDtcXG5cdFx0XHRcdHBhZGRpbmctcmlnaHQ6IDE1cHg7XFxuXHRcdFx0fVxcblxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHtcXG5cdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtYWRkQnRuLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcXG5cdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWdhcC1iYXNlKTtcXG5cdFx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1nYXAtYmFzZSk7XFxuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdHdpZHRoOiA3LjVyZW07XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQge1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSBzdmcuaWNvbi1yZWZyZXNoIHtcXG5cdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUge1xcblx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cdFx0XHRjb2xvcjogdmFyKC0tRmlsZUNvbnRyb2wtZGFuZ2VyLWNvbG9yKTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3ZnLmljb24taW1hZ2Uge1xcblx0XHRcdG1hcmdpbi1ib3R0b206IDhweDtcXG5cdFx0XHR3aWR0aDogMjRweDtcXG5cdFx0XHRoZWlnaHQ6IDI0cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSA+IHNwYW4ge1xcblx0XHRcdG1heC13aWR0aDogMTAwJTtcXG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xcblx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pbWFnZSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0Ym9yZGVyOiBub25lO1xcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcXG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xcblx0XHRcdGNvbG9yOiAjOTk5O1xcblx0XHRcdHRvcDogNXB4O1xcblx0XHRcdHJpZ2h0OiA1cHg7XFxuXHRcdFx0bGluZS1oZWlnaHQ6IDE7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIgPiBzdmcge1xcblx0XHRcdHRvcDogMDtcXG5cdFx0XHR3aWR0aDogMTBweDtcXG5cdFx0XHRoZWlnaHQ6IDEwcHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0d2lkdGg6IDExMHB4O1xcblx0XHRcdGhlaWdodDogMTEwcHg7XFxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0ZmxleC13cmFwOiB3cmFwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUluZm8gPiBwIHtcXG5cdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XFxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xcblx0XHRcdG1hcmdpbi1ib3R0b206IDVweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXByb2dyZXNzIHtcXG5cdFx0XHR3aWR0aDogNzBweDtcXG5cdFx0XHRoZWlnaHQ6IDVweDtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZWJlYmViO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3NWYWx1ZSB7XFxuXHRcdFx0aGVpZ2h0OiA1cHg7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tSW1hZ2VDb250cm9sLXByb2dyZXNzLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0YmFja2dyb3VuZDogdmFyKC0taW5mbyk7XFxuXHRcdFx0bWluLXdpZHRoOiAxMCU7XFxuXHRcdFx0dHJhbnNpdGlvbjogZWFzZS1vdXQgd2lkdGggdmFyKC0tYW5pbWF0aW9uLWR1cmF0aW9uKTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcXG5cdFx0XHRkaXNwbGF5OiBub25lO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkOmhvdmVyIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZXJyb3JNc2cge1xcblx0XHRcdGNvbG9yOiB2YXIoLS1kYW5nZXIpO1xcblx0XHRcdG1hcmdpbjogNXB4IDAgMDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXVwbG9hZEJ0biB7XFxuXHRcdFx0bWFyZ2luLXRvcDogNXB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIge1xcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BwZXJXcmFwcGVyIGltZyB7XFxuXHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xcblx0XHRcdG1heC1oZWlnaHQ6IDQwMHB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xcblx0XHRcdHJpZ2h0OiAwO1xcblx0XHRcdGJvdHRvbTogMDtcXG5cdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcblx0XHRcdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IDRweDtcXG5cdFx0XHRtYXJnaW46IDAuNXJlbTtcXG5cdFx0XHRib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciA+IGEge1xcblx0XHRcdGNvbG9yOiB2YXIoLS1Gb3JtLWl0ZW0tZm9udENvbG9yKTtcXG5cdFx0XHRwYWRkaW5nOiAycHggNXB4O1xcblx0XHRcdGN1cnNvcjogcG9pbnRlcjtcXG5cdFx0XHRmb250LXNpemU6IDE4cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYTpob3ZlciB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLWxpbmstY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtYWNjZXB0VGlwIHtcXG5cdFx0XHRoZWlnaHQ6IDEyMHB4O1xcblx0XHRcdGNvbG9yOiAjOTk5O1xcblx0XHRcdGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1ib3JkZXJDb2xvcik7XFxuXHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1pbmZvKTtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZjNmOWZlO1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0bGluZS1oZWlnaHQ6IDEyMHB4O1xcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpeGVkLXNpemUge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHRwYWRkaW5nOiAwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbU92ZXJsYXkge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0LmFudGQtSW1hZ2VzIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XFxuXHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XFxuXHRcdFx0XHRtYXJnaW46IGNhbGModmFyKC0tZ2FwLXhzKSAqIC0xKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlcy1pdGVtIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XFxuXHRcdFx0XHRtYXJnaW46IHZhcigtLWdhcC14cyk7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZSB7XFxuXHRcdFx0XHRib3JkZXI6IHZhcigtLWJvcmRlcldpZHRoKSBzb2xpZCB2YXIoLS1ib3JkZXJDb2xvcik7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIge1xcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcblx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iV3JhcCB7XFxuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS1pbWFnZSB7XFxuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlLS1sb2FkaW5nIHtcXG5cdFx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLS1vcmlnaW5hbCAuYW50ZC1JbWFnZS1pbWFnZSB7XFxuXHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XFxuXHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHRtYXJnaW46IGF1dG87XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYiB7XFxuXHRcdFx0XHR3aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRoZWlnaHQ6IDYuODc1cmVtO1xcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cdFx0XHRcdGxlZnQ6IDUwJTtcXG5cdFx0XHRcdHRvcDogNTAlO1xcblx0XHRcdFx0bWF4LWhlaWdodDogMTAwJTtcXG5cdFx0XHRcdHdpZHRoOiBhdXRvO1xcblx0XHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS1pbmZvIHtcXG5cdFx0XHRcdHBhZGRpbmc6IDVweCAxMHB4O1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtLXRodW1iIC5hbnRkLUltYWdlLWluZm8ge1xcblx0XHRcdFx0d2lkdGg6IDYuODc1cmVtO1xcblx0XHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS00LTMge1xcblx0XHRcdFx0aGVpZ2h0OiA1LjE1NjI1cmVtO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTE2LTkge1xcblx0XHRcdFx0aGVpZ2h0OiAzLjg2NzE4NzVyZW07XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSB7XFxuXHRcdFx0XHRtaW4td2lkdGg6IDYuODc1cmVtO1xcblx0XHRcdFx0bWluLWhlaWdodDogNi44NzVyZW07XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZS10aHVtYiB7XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcXG5cdFx0XHRcdHdpZHRoOiBhdXRvO1xcblx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLXctZnVsbCA+IGltZyB7XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdGhlaWdodDogYXV0bztcXG5cdFx0XHRcdH1cXG5cXG5cdFx0XHRcIiArICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5zdHlsZXMgOiB2b2lkIDApIHx8IFwiXCIpICsgXCJcXG5cXG5cdFx0XHRcIiArICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5hZGRfc3R5bGVzIDogdm9pZCAwKSB8fCBcIlwiKSArIFwiXFxuXHRcdDwvc3R5bGU+XFxuXHQ8L2hlYWQ+XFxuXHQ8Ym9keT5cXG5cdFx0PGRpdiBjbGFzcz1cXFwic3RlZWRvcyB3b3JrZmxvdyBpbnN0YW5jZS1wcmludFxcXCI+XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwic2tpbi1ncmVlbiBza2luLWFkbWluLWx0ZVxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJ3cmFwcGVyXFxcIj5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY29udGVudC13cmFwcGVyXFxcIj5cXG5cdFx0XHRcdFx0XHRcIiArIHNob3dUcmFjZXNCdG4gKyBcIlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlLXByaW50XFxcIj5cXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlIFwiICsgaW5zdGFuY2Vfc3R5bGUgKyBcIlxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDxmb3JtIG5hbWU9XFxcImluc3RhbmNlRm9ybVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UtZm9ybSBib3ggXCIgKyBpbnN0YW5jZUJveFN0eWxlICsgXCJcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBmb3JtRGVzY3JpcHRpb25IdG1sICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY29sLW1kLTEyXFxcIiBzdHlsZT1cXFwiYm94LXNpemluZzogYm9yZGVyLWJveDtcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2F0dGFjaG1lbnRzLXNlY3Rpb24nPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBhdHRhY2htZW50ICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiICsgcmVsYXRlZF9pbnN0YW5jZXMgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyByZWxhdGVkX3JlY29yZHMgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiICsgYm9keSArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdDwvZm9ybT5cXG5cdFx0XHRcdFx0XHRcdFx0XCIgKyB0cmFjZSArIFwiXFxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0PC9kaXY+XFxuXHQ8L2JvZHk+XFxuXHQ8c2NyaXB0PlwiICsgb3BlbkZpbGVTY3JpcHQgKyBcIjtcIiArIG9uTG9hZFNjcmlwdCArIFwiO1wiICsgc2hvd1RyYWNlc1NjcmlwdCArIFwiPC9zY3JpcHQ+XFxuPC9odG1sPlwiO1xuICByZXR1cm4gaHRtbDtcbn07XG4iLCJUZW1wbGF0ZU1hbmFnZXIgPSB7fTtcblxuZm9ybUlkID0gJ2luc3RhbmNlZm9ybSc7XG5cblxuVGVtcGxhdGVNYW5hZ2VyLmluc3RhbmNlX3RpdGxlID0gKCktPlxuXHRwYWdlVGl0bGUgPSBcIlwiXCJcblx0XHR7e2luc3RhbmNlLm5hbWV9fVxuXHRcIlwiXCJcblxuXHRwYWdlVGl0bGVUckNsYXNzID0gXCJpbnN0YW5jZS1uYW1lXCJcblxuXHRpZiBDb3JlRm9ybT8ucGFnZVRpdGxlRmllbGROYW1lXG5cdFx0cGFnZVRpdGxlID0gXCJcIlwiXG5cdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVwiI3tDb3JlRm9ybS5wYWdlVGl0bGVGaWVsZE5hbWV9XCIgbGFiZWw9ZmFsc2V9fVxuXHRcdFwiXCJcIlxuXHRcdHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiXG5cblx0aWYgQ29yZUZvcm0/LnBhZ2VUaXRsZVxuXHRcdHBhZ2VUaXRsZSA9IFwiXCJcIlxuXHRcdFx0I3tDb3JlRm9ybS5wYWdlVGl0bGV9XG5cdFx0XCJcIlwiXG5cdFx0cGFnZVRpdGxlVHJDbGFzcyA9IFwiXCJcblxuXHR2YWwgPVxuXHRcdHBhZ2VUaXRsZTogcGFnZVRpdGxlXG5cdFx0cGFnZVRpdGxlVHJDbGFzczogcGFnZVRpdGxlVHJDbGFzc1xuXG5cdHJldHVybiB2YWxcblxuVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUgPSAoaW5zdGFuY2UsIF9leHBvcnQpIC0+XG5cblx0dGVtcGxhdGUgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtdGl0bGUgZm9ybS10YWJsZSBuby1ib3JkZXIgdGV4dC1hbGlnbi1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcIj5cblx0XHRcdDx0ciBjbGFzcz1cIiN7dGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZVRyQ2xhc3N9XCI+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLW5hbWUtdGQgcGFnZS10aXRsZVwiPlxuXHRcdFx0XHRcdCN7dGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZX1cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cblx0XHQ8L3RhYmxlPlxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtYm9keSBmb3JtLXRhYmxlXCI+XG5cdFx0XHRcdDx0ciBzdHlsZT1cImhlaWdodDowcHhcIj5cblx0XHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XG5cdFx0XHRcdFx0PHRoPjwvdGg+XG5cdFx0XHRcdFx0PHRoIHN0eWxlPSd3aWR0aDogMTYlJz48L3RoPlxuXHRcdFx0XHRcdDx0aD48L3RoPlxuXHRcdFx0XHQ8L3RyPlxuXHRcIlwiXCI7XG5cblx0dGFibGVfZmllbGRzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50YWJsZV9maWVsZHMoaW5zdGFuY2UpXG5cblx0dGFibGVfZmllbGRzICYmIHRhYmxlX2ZpZWxkcy5mb3JFYWNoICh0YWJsZV9maWVsZCktPlxuXG5cdFx0cmVxdWlyZWQgPSBcIlwiXG5cdFx0aWYgIUNvcmVGb3JtPy5wYWdlVGl0bGVGaWVsZE5hbWUgfHwgQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSAhPSB0YWJsZV9maWVsZC5jb2RlXG5cdFx0XHRpZiB0YWJsZV9maWVsZC5pc19yZXF1aXJlZFxuXHRcdFx0XHRyZXF1aXJlZCA9IFwiaXMtcmVxdWlyZWRcIlxuXG5cdFx0XHRpZiBfZXhwb3J0XG5cdFx0XHRcdHJlcXVpcmVkID0gXCJcIjtcblxuXHRcdFx0cHVyZUNvZGUgPSBTdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIodGFibGVfZmllbGQuY29kZSk7XG5cblx0XHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGQodGFibGVfZmllbGQpXG5cdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cdFx0XHRcdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlICN7cmVxdWlyZWR9XCI+XG5cdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIn19XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkIG9waW5pb24tZmllbGQtI3twdXJlQ29kZX0gYXV0b21hdGljXCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIn19XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpZiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzKHRhYmxlX2ZpZWxkLnR5cGUsICdzZWN0aW9uLHRhYmxlJylcblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydFxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtY2hpbGRmaWVsZCB0ZC1jaGlsZGZpZWxkLSN7cHVyZUNvZGV9XCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0ICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9XCIje3RhYmxlX2ZpZWxkLmNvZGV9XCIgbGFiZWw9ZmFsc2V9fVxuXHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9lbmRcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cblx0XHRcdFx0XHRpZiBfZXhwb3J0XG5cdFx0XHRcdFx0XHR0aXRsZV9wZXJtaXNzaW9uID0gXCJcIlxuXHRcdFx0XHRcdFx0ZmllbGRfcGVybWlzc2lvbiA9IFwiXCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aXRsZV9wZXJtaXNzaW9uID0gXCJ0aXRsZS1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb25cblx0XHRcdFx0XHRcdGZpZWxkX3Blcm1pc3Npb24gPSBcImZpZWxkLVwiICsgdGFibGVfZmllbGQucGVybWlzc2lvblxuXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC10aXRsZSB0ZC10aXRsZS0je3B1cmVDb2RlfSAje3RpdGxlX3Blcm1pc3Npb259ICN7cmVxdWlyZWR9XCI+XG5cdFx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCB0ZC1maWVsZC0je3B1cmVDb2RlfSAje2ZpZWxkX3Blcm1pc3Npb259XCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXG5cdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdDwvdGFibGU+XG5cblx0XHQ8dGFibGUgY2xhc3M9XCJ0YWJsZS1wYWdlLWZvb3RlciBmb3JtLXRhYmxlIG5vLWJvcmRlclwiPlxuXHRcdFx0PHRyIGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXJcIj5cblx0XHRcdFx0PHRkIGNsYXNzPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn1977yaPC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkIGlubGluZS1sZWZ0Jz5cblx0XHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0ncHVsbC1sZWZ0Jz5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1sZWZ0Jz5cblx0XHRcdFx0XHRcdFx0PGxhYmVsPnt7X3QgXCJpbnN0YW5jZV9zdWJtaXRfZGF0ZVwifX3vvJo8L2xhYmVsPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtcmlnaHQnPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdHt7Zm9ybWF0RGF0ZSBpbnN0YW5jZS5zdWJtaXRfZGF0ZSAne1wiZm9ybWF0XCI6XCJZWVlZLU1NLUREXCJ9J319XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdDwvdGFibGU+XG5cdDwvZGl2PlxuXHRcIlwiXCJcblx0cmV0dXJuIHRlbXBsYXRlXG5cbiPmraTlpITmqKHmnb/lhaznlKjkuI7vvJppbnN0YW5jZSDnvJbovpHjgIHmn6XnnIvjgIHmiZPljbDjgIHovazlj5Hml7bnlJ/miJDpmYTku7bjgIHlj5HpgIHpgq7ku7Zib2R56YOo5YiGKHRhYmxlIOaooeadvylcbiPlpoLmnpzmnInkv67mlLnvvIzor7fmtYvor5Xnoa7orqTlhbbku5blip/og73mmK/lkKbmraPluLjjgIJcblRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUgPVxuXHRkZWZhdWx0OiAoaW5zdGFuY2UpLT5cblxuXHRcdHRlbXBsYXRlID0gXCJcIlwiXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid2l0aC1ib3JkZXIgY29sLW1kLTEyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZS1uYW1lXCI+XG5cdFx0XHRcdFx0PGgzIGNsYXNzPVwiYm94LXRpdGxlXCI+I3tUZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGV9PC9oMz5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdHt7I2VhY2ggc3RlZWRvc19mb3JtLmZpZWxkc319XG5cdFx0XHRcdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGF1dG9tYXRpYyBvcGluaW9uLWZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19PC9sYWJlbD5cblxuXHRcdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPXRoaXMuY29kZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2VhY2h9fVxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXIgZm9ybS1ncm91cCBmb3JtLWhvcml6b250YWxcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG5cdFx0XHRcdFx0ICB7e190IFwiaW5zdGFuY2VfaW5pdGlhdG9yXCJ9fSZuYnNwOzpcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cImFmU2VsZWN0VXNlclwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XG5cdFx0XHRcdCAgPC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XCJcIlwiXG5cdFx0cmV0dXJuIHRlbXBsYXRlXG5cblx0dGFibGU6IChpbnN0YW5jZSktPlxuXHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZShpbnN0YW5jZSlcbiNcdHRhYmxlOiAnJydcbiNcdFx0PHRhYmxlIGNsYXNzPVwiYm94LWhlYWRlciAgd2l0aC1ib3JkZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcIj5cbiNcdFx0XHQ8dHIgY2xhc3M9XCJpbnN0YW5jZS1uYW1lXCI+XG4jXHRcdFx0XHQ8dGQgY2xhc3M9XCJpbnN0YW5jZS10YWJsZS1uYW1lLXRkXCI+XG4jXHRcdFx0XHRcdDxoMyBjbGFzcz1cImJveC10aXRsZVwiPnt7aW5zdGFuY2UubmFtZX19PC9oMz5cbiNcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJoZWxwLWJsb2NrXCI+PC9zcGFuPlxuI1x0XHRcdFx0PC90ZD5cbiNcdFx0XHQ8L3RyPlxuIyAgICAgICAgICAgIDx0ciBjbGFzcz1cImFwcGxpY2FudC13cmFwcGVyXCI+XG4jXHRcdFx0XHQ8dGQgY2xhc3M9XCJpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkXCI+XG4jXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e190IFwiaW5zdGFuY2VfaW5pdGlhdG9yXCJ9fSZuYnNwOzo8L2xhYmVsPlxuI1x0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cImFmU2VsZWN0VXNlclwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XG4jXHRcdFx0XHQ8L3RkPlxuI1x0XHRcdDwvdHI+XG4jICAgICAgICA8L3RhYmxlPlxuI1x0XHQ8dGFibGUgY2xhc3M9XCJmb3JtLXRhYmxlXCI+XG4jXHRcdCAgICB7eyNlYWNoIHRhYmxlX2ZpZWxkc319XG4jXHRcdFx0XHR7eyNpZiBpc09waW5pb25GaWVsZCB0aGlzfX1cbiNcdFx0XHRcdFx0e3t7dHJfc3RhcnR9fX1cbiNcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC10aXRsZSB7eyNpZiBpc19yZXF1aXJlZH19aXMtcmVxdWlyZWR7ey9pZn19XCI+XG4jXHRcdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT10aGlzLmNvZGV9fVxuI1x0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtZmllbGQgb3Bpbmlvbi1maWVsZFwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgc3RlcD0oZ2V0T3BpbmlvbkZpZWxkU3RlcE5hbWUgdGhpcykgZGVmYXVsdD0nJ319XG4jXHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0e3t7dHJfZW5kfX19XG4jXHRcdFx0XHR7e2Vsc2V9fVxuI1x0XHRcdFx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cbiNcdFx0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtY2hpbGRmaWVsZFwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0ICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlIGxhYmVsPWZhbHNlfX1cbiNcdFx0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0e3t7dHJfZW5kfX19XG4jXHRcdFx0XHRcdHt7ZWxzZX19XG4jXHRcdFx0XHRcdFx0e3t7dHJfc3RhcnR9fX1cbiNcdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHt7I2lmIGlzX3JlcXVpcmVkfX1pcy1yZXF1aXJlZHt7L2lmfX1cIj5cbiNcdFx0XHRcdFx0XHRcdFx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX1cbiNcdFx0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCB7e3Blcm1pc3Npb259fVwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdFx0e3svaWZ9fVxuI1x0XHRcdFx0e3svaWZ9fVxuI1xuI1x0XHQgICAge3svZWFjaH19XG4jXHRcdDwvdGFibGU+XG4jXHQnJydcblxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZUhlbHBzID1cblx0YXBwbGljYW50Q29udGV4dDogLT5cblx0XHRzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZGF0YSA9IHtcblx0XHRcdG5hbWU6ICdpbnNfYXBwbGljYW50Jyxcblx0XHRcdGF0dHM6IHtcblx0XHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0XHRpZDogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0XHRjbGFzczogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sJyxcblx0XHRcdFx0c3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4O3dpZHRoOjE0MHB4O2Rpc3BsYXk6aW5saW5lJ1xuXHRcdFx0fVxuXHRcdH1cbiNcdFx0aWYgbm90IHN0ZWVkb3NfaW5zdGFuY2UgfHwgc3RlZWRvc19pbnN0YW5jZS5zdGF0ZSAhPSBcImRyYWZ0XCJcblx0XHRkYXRhLmF0dHMuZGlzYWJsZWQgPSB0cnVlXG5cdFx0cmV0dXJuIGRhdGE7XG5cbmluc3RhbmNlSWQ6IC0+XG5cdHJldHVybiAnaW5zdGFuY2Vmb3JtJzsjXCJpbnN0YW5jZV9cIiArIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKTtcblxuZm9ybV90eXBlczogLT5cblx0aWYgQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cdFx0cmV0dXJuICdkaXNhYmxlZCc7XG5cdGVsc2Vcblx0XHRyZXR1cm4gJ21ldGhvZCc7XG5cbnN0ZWVkb3NfZm9ybTogLT5cblx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0cmV0dXJuIGZvcm1fdmVyc2lvblxuXG5pbm5lcnN1YmZvcm1Db250ZXh0OiAob2JqKS0+XG5cdGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cdG9ialtcInRhYmxlVmFsdWVzXCJdID0gaWYgZG9jX3ZhbHVlcyB0aGVuIGRvY192YWx1ZXNbb2JqLmNvZGVdIGVsc2UgW11cblx0b2JqW1wiZm9ybUlkXCJdID0gZm9ybUlkO1xuXHRyZXR1cm4gb2JqO1xuXG5pbnN0YW5jZTogLT5cblx0U2Vzc2lvbi5nZXQoXCJjaGFuZ2VfZGF0ZVwiKVxuXHRpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKVxuXHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRyZXR1cm4gc3RlZWRvc19pbnN0YW5jZTtcblxuZXF1YWxzOiAoYSwgYikgLT5cblx0cmV0dXJuIChhID09IGIpXG5cbmluY2x1ZGVzOiAoYSwgYikgLT5cblx0cmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcblxuZmllbGRzOiAtPlxuXHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRpZiBmb3JtX3ZlcnNpb25cblx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuXG5kb2NfdmFsdWVzOiAtPlxuXHRXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cbmluc3RhbmNlX2JveF9zdHlsZTogLT5cblx0Ym94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIilcblx0aWYgYm94ID09IFwiaW5ib3hcIiB8fCBib3ggPT0gXCJkcmFmdFwiXG5cdFx0anVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpXG5cdFx0aWYganVkZ2Vcblx0XHRcdGlmIChqdWRnZSA9PSBcImFwcHJvdmVkXCIpXG5cdFx0XHRcdHJldHVybiBcImJveC1zdWNjZXNzXCJcblx0XHRcdGVsc2UgaWYgKGp1ZGdlID09IFwicmVqZWN0ZWRcIilcblx0XHRcdFx0cmV0dXJuIFwiYm94LWRhbmdlclwiXG5cdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRpZiBpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uXG5cdFx0aWYgaW5zLmZpbmFsX2RlY2lzaW9uID09IFwiYXBwcm92ZWRcIlxuXHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblxuXG5UZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUgPSAoaW5zdGFuY2UsIHRlbXBsYXRlTmFtZSkgLT5cblx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoaW5zdGFuY2UuZmxvdyk7XG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXG5cdGlmIHRlbXBsYXRlTmFtZVxuXHRcdGlmIHRlbXBsYXRlTmFtZSA9PSAndGFibGUnXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG5cdGlmIFNlc3Npb24/LmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRpZiBmbG93Py5wcmludF90ZW1wbGF0ZVxuXHRcdFx0cmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5wcmludF90ZW1wbGF0ZSArIFwiPC9kaXY+XCJcblx0XHRlbHNlXG5cdFx0XHRpZiBmbG93Py5pbnN0YW5jZV90ZW1wbGF0ZVxuXHRcdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0ZWxzZVxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblxuXHRcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG5cdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXG5cdFx0aWYgZm9ybT8uaW5zdGFuY2Vfc3R5bGVcblx0XHRcdGlmIGZvcm0uaW5zdGFuY2Vfc3R5bGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLmRlZmF1bHQoaW5zdGFuY2UpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblxuI1RlbXBsYXRlTWFuYWdlci5leHBvcnRUZW1wbGF0ZSA9IChmbG93SWQpIC0+XG4jXHR0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShmbG93SWQpO1xuI1xuI1x0ZmxvdyA9IFdvcmtmbG93TWFuYWdlci5nZXRGbG93KGZsb3dJZCk7XG4jXG4jXHRpZiBmbG93Py5pbnN0YW5jZV90ZW1wbGF0ZVxuI1x0XHRyZXR1cm4gdGVtcGxhdGU7XG4jXG4jXHRyZXR1cm4gdGVtcGxhdGU7XG5cbiIsInZhciBmb3JtSWQ7ICAgICAgICAgICAgICAgICBcblxuVGVtcGxhdGVNYW5hZ2VyID0ge307XG5cbmZvcm1JZCA9ICdpbnN0YW5jZWZvcm0nO1xuXG5UZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhZ2VUaXRsZSwgcGFnZVRpdGxlVHJDbGFzcywgdmFsO1xuICBwYWdlVGl0bGUgPSBcInt7aW5zdGFuY2UubmFtZX19XCI7XG4gIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcImluc3RhbmNlLW5hbWVcIjtcbiAgaWYgKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkge1xuICAgIHBhZ2VUaXRsZSA9IFwie3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lICsgXCJcXFwiIGxhYmVsPWZhbHNlfX1cIjtcbiAgICBwYWdlVGl0bGVUckNsYXNzID0gXCJcIjtcbiAgfVxuICBpZiAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlIDogdm9pZCAwKSB7XG4gICAgcGFnZVRpdGxlID0gXCJcIiArIENvcmVGb3JtLnBhZ2VUaXRsZTtcbiAgICBwYWdlVGl0bGVUckNsYXNzID0gXCJcIjtcbiAgfVxuICB2YWwgPSB7XG4gICAgcGFnZVRpdGxlOiBwYWdlVGl0bGUsXG4gICAgcGFnZVRpdGxlVHJDbGFzczogcGFnZVRpdGxlVHJDbGFzc1xuICB9O1xuICByZXR1cm4gdmFsO1xufTtcblxuVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUgPSBmdW5jdGlvbihpbnN0YW5jZSwgX2V4cG9ydCkge1xuICB2YXIgdGFibGVfZmllbGRzLCB0ZW1wbGF0ZTtcbiAgdGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cXG5cdDx0YWJsZSBjbGFzcz1cXFwidGFibGUtcGFnZS10aXRsZSBmb3JtLXRhYmxlIG5vLWJvcmRlciB0ZXh0LWFsaWduLWNlbnRlclxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcXFwiPlxcblx0XHQ8dHIgY2xhc3M9XFxcIlwiICsgKHRoaXMuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGVUckNsYXNzKSArIFwiXFxcIj5cXG5cdFx0XHQ8dGQgY2xhc3M9XFxcImluc3RhbmNlLXRhYmxlLW5hbWUtdGQgcGFnZS10aXRsZVxcXCI+XFxuXHRcdFx0XHRcIiArICh0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlKSArIFwiXFxuXHRcdFx0PC90ZD5cXG5cdFx0PC90cj5cXG5cXG5cdDwvdGFibGU+XFxuXHQ8dGFibGUgY2xhc3M9XFxcInRhYmxlLXBhZ2UtYm9keSBmb3JtLXRhYmxlXFxcIj5cXG5cdFx0XHQ8dHIgc3R5bGU9XFxcImhlaWdodDowcHhcXFwiPlxcblx0XHRcdFx0PHRoIHN0eWxlPSd3aWR0aDogMTYlJz48L3RoPlxcblx0XHRcdFx0PHRoPjwvdGg+XFxuXHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XFxuXHRcdFx0XHQ8dGg+PC90aD5cXG5cdFx0XHQ8L3RyPlwiO1xuICB0YWJsZV9maWVsZHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRhYmxlX2ZpZWxkcyhpbnN0YW5jZSk7XG4gIHRhYmxlX2ZpZWxkcyAmJiB0YWJsZV9maWVsZHMuZm9yRWFjaChmdW5jdGlvbih0YWJsZV9maWVsZCkge1xuICAgIHZhciBmaWVsZF9wZXJtaXNzaW9uLCBwdXJlQ29kZSwgcmVxdWlyZWQsIHRpdGxlX3Blcm1pc3Npb247XG4gICAgcmVxdWlyZWQgPSBcIlwiO1xuICAgIGlmICghKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkgfHwgKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkgIT09IHRhYmxlX2ZpZWxkLmNvZGUpIHtcbiAgICAgIGlmICh0YWJsZV9maWVsZC5pc19yZXF1aXJlZCkge1xuICAgICAgICByZXF1aXJlZCA9IFwiaXMtcmVxdWlyZWRcIjtcbiAgICAgIH1cbiAgICAgIGlmIChfZXhwb3J0KSB7XG4gICAgICAgIHJlcXVpcmVkID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIHB1cmVDb2RlID0gU3RlZWRvcy5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVyKHRhYmxlX2ZpZWxkLmNvZGUpO1xuICAgICAgaWYgKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGQodGFibGVfZmllbGQpKSB7XG4gICAgICAgIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0O1xuICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtdGl0bGUgXCIgKyByZXF1aXJlZCArIFwiXFxcIj5cXG5cdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkIG9waW5pb24tZmllbGQtXCIgKyBwdXJlQ29kZSArIFwiIGF1dG9tYXRpY1xcXCIgY29sc3BhbiA9IFxcXCJcIiArIHRhYmxlX2ZpZWxkLnRkX2NvbHNwYW4gKyBcIlxcXCI+XFxuXHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XCI7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9lbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlcyh0YWJsZV9maWVsZC50eXBlLCAnc2VjdGlvbix0YWJsZScpKSB7XG4gICAgICAgICAgdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnQ7XG4gICAgICAgICAgdGVtcGxhdGUgKz0gXCI8dGQgY2xhc3M9XFxcInRkLWNoaWxkZmllbGQgdGQtY2hpbGRmaWVsZC1cIiArIHB1cmVDb2RlICsgXCJcXFwiIGNvbHNwYW4gPSBcXFwiXCIgKyB0YWJsZV9maWVsZC50ZF9jb2xzcGFuICsgXCJcXFwiPlxcbiAgIHt7PiBhZkZvcm1Hcm91cCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVxcbjwvdGQ+XCI7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydDtcbiAgICAgICAgICBpZiAoX2V4cG9ydCkge1xuICAgICAgICAgICAgdGl0bGVfcGVybWlzc2lvbiA9IFwiXCI7XG4gICAgICAgICAgICBmaWVsZF9wZXJtaXNzaW9uID0gXCJcIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGl0bGVfcGVybWlzc2lvbiA9IFwidGl0bGUtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uO1xuICAgICAgICAgICAgZmllbGRfcGVybWlzc2lvbiA9IFwiZmllbGQtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtdGl0bGUgdGQtdGl0bGUtXCIgKyBwdXJlQ29kZSArIFwiIFwiICsgdGl0bGVfcGVybWlzc2lvbiArIFwiIFwiICsgcmVxdWlyZWQgKyBcIlxcXCI+XFxuXHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT1cXFwiXCIgKyB0YWJsZV9maWVsZC5jb2RlICsgXCJcXFwifX1cXG48L3RkPlxcbjx0ZCBjbGFzcz1cXFwidGQtZmllbGQgdGQtZmllbGQtXCIgKyBwdXJlQ29kZSArIFwiIFwiICsgZmllbGRfcGVybWlzc2lvbiArIFwiXFxcIiBjb2xzcGFuID0gXFxcIlwiICsgdGFibGVfZmllbGQudGRfY29sc3BhbiArIFwiXFxcIj5cXG5cdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVxcbjwvdGQ+XCI7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRlbXBsYXRlICs9IFwiXHQ8L3RhYmxlPlxcblxcblx0PHRhYmxlIGNsYXNzPVxcXCJ0YWJsZS1wYWdlLWZvb3RlciBmb3JtLXRhYmxlIG5vLWJvcmRlclxcXCI+XFxuXHRcdDx0ciBjbGFzcz1cXFwiYXBwbGljYW50LXdyYXBwZXJcXFwiPlxcblx0XHRcdDx0ZCBjbGFzcz1cXFwibm93cmFwXFxcIj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1sZWZ0Jz5cXG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e190IFxcXCJpbnN0YW5jZV9pbml0aWF0b3JcXFwifX3vvJo8L2xhYmVsPlxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkIGlubGluZS1sZWZ0Jz5cXG5cdFx0XHRcdFx0e3s+VGVtcGxhdGUuZHluYW1pYyAgdGVtcGxhdGU9XFxcImFmU2VsZWN0VXNlclxcXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvdGQ+XFxuXHRcdFx0PHRkIGNsYXNzPVxcXCJub3dyYXBcXFwiPlxcblx0XHRcdFx0PGRpdiBjbGFzcz0ncHVsbC1sZWZ0Jz5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHRcdDxsYWJlbD57e190IFxcXCJpbnN0YW5jZV9zdWJtaXRfZGF0ZVxcXCJ9fe+8mjwvbGFiZWw+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtcmlnaHQnPlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0e3tmb3JtYXREYXRlIGluc3RhbmNlLnN1Ym1pdF9kYXRlICd7XFxcImZvcm1hdFxcXCI6XFxcIllZWVktTU0tRERcXFwifSd9fVxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvdGQ+XFxuXHRcdDwvdHI+XFxuXHQ8L3RhYmxlPlxcbjwvZGl2PlwiO1xuICByZXR1cm4gdGVtcGxhdGU7XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlID0ge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgdGVtcGxhdGU7XG4gICAgdGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9XFxcIndpdGgtYm9yZGVyIGNvbC1tZC0xMlxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJpbnN0YW5jZS1uYW1lXFxcIj5cXG5cdFx0PGgzIGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlwiICsgKFRlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZSkgKyBcIjwvaDM+XFxuXHRcdDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj48L3NwYW4+XFxuXHQ8L2Rpdj5cXG5cdDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj48L3NwYW4+XFxuPC9kaXY+XFxue3sjZWFjaCBzdGVlZG9zX2Zvcm0uZmllbGRzfX1cXG5cdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxcblx0XHQ8ZGl2IGNsYXNzPVxcXCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cXFwiPlxcblx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgYXV0b21hdGljIG9waW5pb24tZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19PC9sYWJlbD5cXG5cXG5cdFx0XHRcdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9dGhpcy5jb2RlfX1cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0PC9kaXY+XFxuXHR7e2Vsc2V9fVxcblx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTIgZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxcblx0XHRcdDwvZGl2Plxcblx0XHR7e2Vsc2V9fVxcblx0XHRcdDxkaXYgY2xhc3M9XFxcInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlfX1cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0e3svaWZ9fVxcblx0e3svaWZ9fVxcbnt7L2VhY2h9fVxcbjxkaXYgY2xhc3M9XFxcImNvbC1tZC0xMlxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJhcHBsaWNhbnQtd3JhcHBlciBmb3JtLWdyb3VwIGZvcm0taG9yaXpvbnRhbFxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxuXHRcdDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uXFxcIj5cXG5cdFx0ICB7e190IFxcXCJpbnN0YW5jZV9pbml0aWF0b3JcXFwifX0mbmJzcDs6XFxuXHRcdDwvZGl2Plxcblx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cXFwiYWZTZWxlY3RVc2VyXFxcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxcblx0ICA8L2Rpdj5cXG5cdDwvZGl2PlxcbjwvZGl2PlwiO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfSxcbiAgdGFibGU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5oYW5kbGVUYWJsZVRlbXBsYXRlKGluc3RhbmNlKTtcbiAgfVxufTtcblxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZUhlbHBzID0ge1xuICBhcHBsaWNhbnRDb250ZXh0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0YSwgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgZGF0YSA9IHtcbiAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgIGF0dHM6IHtcbiAgICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBpZDogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBcImNsYXNzXCI6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCcsXG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo2cHggMTJweDt3aWR0aDoxNDBweDtkaXNwbGF5OmlubGluZSdcbiAgICAgIH1cbiAgICB9O1xuICAgIGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWU7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn07XG5cbih7XG4gIGluc3RhbmNlSWQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW5zdGFuY2Vmb3JtJztcbiAgfSxcbiAgZm9ybV90eXBlczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgICAgcmV0dXJuICdkaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbWV0aG9kJztcbiAgICB9XG4gIH0sXG4gIHN0ZWVkb3NfZm9ybTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gICAgfVxuICB9LFxuICBpbm5lcnN1YmZvcm1Db250ZXh0OiBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgZG9jX3ZhbHVlcztcbiAgICBkb2NfdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIG9ialtcInRhYmxlVmFsdWVzXCJdID0gZG9jX3ZhbHVlcyA/IGRvY192YWx1ZXNbb2JqLmNvZGVdIDogW107XG4gICAgb2JqW1wiZm9ybUlkXCJdID0gZm9ybUlkO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIGluc3RhbmNlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpO1xuICAgIGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpIHtcbiAgICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuICAgIH1cbiAgfSxcbiAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH0sXG4gIGluY2x1ZGVzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcbiAgfSxcbiAgZmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcbiAgICB9XG4gIH0sXG4gIGRvY192YWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gIH0sXG4gIGluc3RhbmNlX2JveF9zdHlsZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJveCwgaW5zLCBqdWRnZTtcbiAgICBib3ggPSBTZXNzaW9uLmdldChcImJveFwiKTtcbiAgICBpZiAoYm94ID09PSBcImluYm94XCIgfHwgYm94ID09PSBcImRyYWZ0XCIpIHtcbiAgICAgIGp1ZGdlID0gU2Vzc2lvbi5nZXQoXCJqdWRnZVwiKTtcbiAgICAgIGlmIChqdWRnZSkge1xuICAgICAgICBpZiAoanVkZ2UgPT09IFwiYXBwcm92ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoanVkZ2UgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBpZiAoaW5zICYmIGlucy5maW5hbF9kZWNpc2lvbikge1xuICAgICAgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICB9IGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuXG5UZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbihpbnN0YW5jZSwgdGVtcGxhdGVOYW1lKSB7XG4gIHZhciBmbG93LCBmb3JtO1xuICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gIGlmICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICBpZiAodGVtcGxhdGVOYW1lID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBTZXNzaW9uICE9PSBcInVuZGVmaW5lZFwiICYmIFNlc3Npb24gIT09IG51bGwgPyBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgOiB2b2lkIDApIHtcbiAgICBpZiAoZmxvdyAhPSBudWxsID8gZmxvdy5wcmludF90ZW1wbGF0ZSA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5wcmludF90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUudGFibGUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH1cbiAgICBpZiAoZmxvdyAhPSBudWxsID8gZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgfVxuICAgIGlmIChmb3JtICE9IG51bGwgPyBmb3JtLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSB7XG4gICAgICBpZiAoZm9ybS5pbnN0YW5jZV9zdHlsZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufTtcbiIsIlN0ZWVkb3NUYWJsZSA9IHt9O1xuXG5TdGVlZG9zVGFibGUuZm9ybUlkID0gXCJpbnN0YW5jZWZvcm1cIjtcblxuU3RlZWRvc1RhYmxlLmNoZWNrSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCkge1xuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YXIgZmllbGRWYWwgPSBTdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUoZmllbGQsIGl0ZW1faW5kZXgpO1xuXG4gICAgdmFyIHNmX25hbWUgPSAnJztcbiAgICB2YXIgcmV2ID0gdHJ1ZTtcbiAgICBmaWVsZE9iai5zZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKHNmKSB7XG4gICAgICAgIGlmIChzZi5wZXJtaXNzaW9uID09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgIHNmX25hbWUgPSBmaWVsZE9iai5jb2RlICsgXCIuXCIgKyBzZi5jb2RlO1xuICAgICAgICAgICAgaWYgKCFJbnN0YW5jZU1hbmFnZXIuY2hlY2tGb3JtRmllbGRWYWx1ZSgkKFwiW25hbWU9J1wiICsgc2ZfbmFtZSArIFwiJ11cIilbMF0sIHNmX25hbWUsIGZpZWxkVmFsW3NmLmNvZGVdKSkge1xuICAgICAgICAgICAgICAgIHJldiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV2O1xufVxuXG5TdGVlZG9zVGFibGUuc2V0VGFibGVJdGVtVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgsIGl0ZW1fdmFsdWUpIHtcblxuICAgIHZhciB0YWJsZVZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpO1xuICAgIHRhYmxlVmFsdWVbaXRlbV9pbmRleF0gPSBpdGVtX3ZhbHVlO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcbiAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpW2l0ZW1faW5kZXhdO1xufVxuXG5TdGVlZG9zVGFibGUucmVtb3ZlVGFibGVJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGl0ZW1faW5kZXgpO1xuICAgIGl0ZW1fdmFsdWUucmVtb3ZlZCA9IHRydWU7XG59XG5cblN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlID0gZnVuY3Rpb24gKGZpZWxkLCB2YWx1ZSkge1xuICAgICQoXCJ0YWJsZVtuYW1lPSdcIiArIGZpZWxkICsgXCInXVwiKS52YWwoe1xuICAgICAgICB2YWw6IHZhbHVlXG4gICAgfSk7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgcmV0dXJuICQoXCJ0YWJsZVtuYW1lPSdcIiArIGZpZWxkICsgXCInXVwiKS52YWwoKS52YWw7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRWYWxpZFZhbHVlID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIHZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgdmFsaWRWYWx1ZSA9IFtdO1xuXG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAoIXYucmVtb3ZlZCkge1xuICAgICAgICAgICAgdmFsaWRWYWx1ZS5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkVmFsdWU7XG59XG5cblxuU3RlZWRvc1RhYmxlLmhhbmRsZURhdGEgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlcykge1xuXG4gICAgaWYgKCF2YWx1ZXMgfHwgISh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgZmllbGRPYmogPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpO1xuXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgZmllbGRPYmouc2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgICAgICBpZiAoZi50eXBlID09ICd1c2VyJyB8fCBmLnR5cGUgPT0gJ2dyb3VwJykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZbZi5jb2RlXVxuICAgICAgICAgICAgICAgIGlmIChmLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiAodmFsdWVbMF0pID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2W2YuY29kZV0gPSB2W2YuY29kZV0uZ2V0UHJvcGVydHkoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlKSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdltmLmNvZGVdID0gdltmLmNvZGVdLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmLnR5cGUgPT0gJ2RhdGVUaW1lJykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZbZi5jb2RlXVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQxID0gdFsxXS5zcGxpdChcIjpcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSB0MFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gdDBbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBob3VycyA9IHQxWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9IHQxWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbZi5jb2RlXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIHZhciBpbnN0YW5jZUZpZWxkcyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZpZWxkcygpO1xuICAgIGlmICghaW5zdGFuY2VGaWVsZHMpXG4gICAgICAgIHJldHVybjtcblxuICAgIHZhciBmaWVsZE9iaiA9IGluc3RhbmNlRmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGZpZWxkKTtcblxuICAgIHJldHVybiBmaWVsZE9iajtcbn1cblxuXG5TdGVlZG9zVGFibGUuZ2V0TW9kYWxEYXRhID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCkge1xuXG4gICAgdmFyIGRhdGEgPSB7fTtcblxuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICBpZiAoIWZpZWxkT2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkYXRhLmZpZWxkID0gZmllbGRPYmo7XG5cbiAgICBkYXRhLmZpZWxkLmZvcm11bGEgPSBGb3JtX2Zvcm11bGEuZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUoXCJGb3JtX2Zvcm11bGEuZmllbGRfdmFsdWVzXCIsIGZpZWxkT2JqLnNmaWVsZHMpO1xuXG4gICAgZGF0YS52YWx1ZSA9IHt9O1xuXG4gICAgZGF0YS52YWx1ZVtmaWVsZF0gPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGluZGV4KTtcblxuICAgIGRhdGEuaW5kZXggPSBpbmRleDtcblxuICAgIHJldHVybiBkYXRhO1xufVxuXG5cblxuU3RlZWRvc1RhYmxlLmdldEl0ZW1Nb2RhbFZhbHVlID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG5cbiAgICBpZiAoIUF1dG9Gb3JtLmdldEZvcm1WYWx1ZXMoXCJzdGVlZG9zX3RhYmxlX21vZGFsX1wiICsgZmllbGQgKyBcIl9cIiArIGl0ZW1faW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIHZhciBpdGVtX3ZhbHVlID0gQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcInN0ZWVkb3NfdGFibGVfbW9kYWxfXCIgKyBmaWVsZCArIFwiX1wiICsgaXRlbV9pbmRleCkuaW5zZXJ0RG9jW2ZpZWxkXTtcbiAgICByZXR1cm4gaXRlbV92YWx1ZTtcbn1cblxuXG5TdGVlZG9zVGFibGUuYWRkSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIF9pdGVtX3ZhbHVlKSB7XG4gICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBfaXRlbV92YWx1ZSB8fCBTdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUoZmllbGQsIGluZGV4KTtcbiAgICAkKFwidGJvZHlbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGJvZHknXVwiKS5hcHBlbmQoU3RlZWRvc1RhYmxlLmdldFRyKGtleXMsIGl0ZW1fdmFsdWUsIGluZGV4LCBmaWVsZCwgdHJ1ZSkpXG5cbn1cblxuU3RlZWRvc1RhYmxlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4LCBfaXRlbV92YWx1ZSkge1xuXG4gICAgdmFyIGl0ZW0gPSAkKFwidHJbbmFtZT0nXCIgKyBmaWVsZCArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJ11cIik7XG5cbiAgICB2YXIgaXRlbV92YWx1ZSA9IF9pdGVtX3ZhbHVlIHx8IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaW5kZXgpO1xuXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gU3RlZWRvc1RhYmxlLmdldEtleXMoZmllbGQpO1xuICAgICAgICB2YXIgdGRzID0gU3RlZWRvc1RhYmxlLmdldFJlbW92ZVRkKGZpZWxkLCBpbmRleCk7XG5cbiAgICAgICAgdmFyIHNmaWVsZHMgPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpLnNmaWVsZHM7XG5cbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBzZmllbGQgPSBzZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGtleSk7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGl0ZW1fdmFsdWVba2V5XTtcblxuICAgICAgICAgICAgdGRzID0gdGRzICsgU3RlZWRvc1RhYmxlLmdldFRkKHNmaWVsZCwgaW5kZXgsIHZhbHVlKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdGVtLmVtcHR5KCk7XG5cbiAgICAgICAgaXRlbS5hcHBlbmQodGRzKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgU3RlZWRvc1RhYmxlLmFkZEl0ZW0oZmllbGQsIGluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAoU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpKSB7XG5cbiAgICAgICAgU3RlZWRvc1RhYmxlLnNldFRhYmxlSXRlbVZhbHVlKGZpZWxkLCBpbmRleCwgaXRlbV92YWx1ZSk7XG5cbiAgICAgICAgLy9TdGVlZG9zVGFibGUudmFsdWVIYXNoW2ZpZWxkXVtpbmRleF0gPSBpdGVtX3ZhbHVlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9TdGVlZG9zVGFibGUudmFsdWVIYXNoW2ZpZWxkXSA9IFtpdGVtX3ZhbHVlXTtcblxuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVWYWx1ZShmaWVsZCwgW2l0ZW1fdmFsdWVdKVxuXG4gICAgfVxuXG4gICAgLy/miafooYzkuLvooajlhazlvI/orqHnrpdcbiAgICBJbnN0YW5jZU1hbmFnZXIucnVuRm9ybXVsYShmaWVsZCk7XG5cbn1cblxuU3RlZWRvc1RhYmxlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG5cbiAgICAkKFwidHJbbmFtZT0nXCIgKyBmaWVsZCArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJ11cIikuaGlkZSgpO1xuXG4gICAgU3RlZWRvc1RhYmxlLnJlbW92ZVRhYmxlSXRlbShmaWVsZCwgaW5kZXgpO1xuXG4gICAgSW5zdGFuY2VNYW5hZ2VyLnJ1bkZvcm11bGEoZmllbGQpO1xufVxuXG5TdGVlZG9zVGFibGUuc2hvd01vZGFsID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgbWV0aG9kKSB7XG5cblxuICAgIHZhciBtb2RhbERhdGEgPSBTdGVlZG9zVGFibGUuZ2V0TW9kYWxEYXRhKGZpZWxkLCBpbmRleCk7XG5cbiAgICBtb2RhbERhdGEubWV0aG9kID0gbWV0aG9kO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgTW9kYWwuc2hvdyhcInN0ZWVkb3NUYWJsZU1vZGFsXCIsIG1vZGFsRGF0YSk7XG4gICAgfSwgMzAwKVxufVxuXG5TdGVlZG9zVGFibGUuZ2V0S2V5cyA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIGlmICghQXV0b0Zvcm0uZ2V0Q3VycmVudERhdGFGb3JGb3JtKFN0ZWVkb3NUYWJsZS5mb3JtSWQpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgc3MgPSBBdXRvRm9ybS5nZXRGb3JtU2NoZW1hKFN0ZWVkb3NUYWJsZS5mb3JtSWQpO1xuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmIChzcy5zY2hlbWEoZmllbGQgKyBcIi4kXCIpLnR5cGUgPT09IE9iamVjdCkge1xuICAgICAgICBrZXlzID0gc3Mub2JqZWN0S2V5cyhTaW1wbGVTY2hlbWEuX21ha2VHZW5lcmljKGZpZWxkKSArICcuJCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXM7XG5cbn1cblxuU3RlZWRvc1RhYmxlLmdldFRoZWFkID0gZnVuY3Rpb24gKGZpZWxkLCBlZGl0YWJsZSkge1xuXG4gICAgdmFyIGZpZWxkT2JqID0gZmllbGQ7XG4gICAgaWYgKCFfLmlzT2JqZWN0KGZpZWxkKSlcbiAgICAgICAgZmllbGRPYmogPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpO1xuXG4gICAgaWYgKCFmaWVsZE9iaikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgdmFyIHRoZWFkID0gJycsXG4gICAgICAgIHRycyA9ICcnLFxuICAgICAgICBsYWJlbCA9ICcnLFxuICAgICAgICB3aWR0aCA9IDEwMDtcblxuICAgIGlmIChlZGl0YWJsZSkge1xuICAgICAgICAvLyB0cnMgPSBcIjx0aCBjbGFzcz0ncmVtb3ZlZCc+PC90aD5cIlxuICAgICAgICB0cnMgPSBcIlwiXG4gICAgfVxuXG4gICAgdmFyIHNmaWVsZHMgPSBmaWVsZE9iai5zZmllbGRzO1xuXG4gICAgaWYgKCFzZmllbGRzKSB7XG4gICAgICAgIHJldHVybiB0aGVhZDtcbiAgICB9XG5cbiAgICB2YXIgc2ZfbGVuZ3RoID0gc2ZpZWxkcy5sZW5ndGg7XG5cbiAgICBpZiAoc2ZfbGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgd2lkZV9maWVsZHMgPSBzZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfd2lkZVwiLCB0cnVlKTtcblxuICAgICAgICB3aWR0aCA9IDEwMCAvIChzZl9sZW5ndGggKyB3aWRlX2ZpZWxkcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHNmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoc2YsIGluZGV4KSB7XG5cbiAgICAgICAgbGFiZWwgPSAoc2YubmFtZSAhPSBudWxsICYmIHNmLm5hbWUubGVuZ3RoID4gMCkgPyBzZi5uYW1lIDogc2YuY29kZTtcblxuICAgICAgICB0cnMgPSB0cnMgKyBcIjx0ZCBcIjsgLy8gbm93cmFwPSdub3dyYXAnXG5cbiAgICAgICAgdHJzID0gdHJzICsgXCIgY2xhc3M9J3RpdGxlIFwiICsgc2YudHlwZSArIFwiJ1wiO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSAoc2ZfbGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIGlmIChzZi5pc193aWRlKSB7XG4gICAgICAgICAgICAgICAgdHJzID0gdHJzICsgXCJzdHlsZT0nd2lkdGg6XCIgKyB3aWR0aCAqIDIgKyBcIiUnXCJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJzID0gdHJzICsgXCJzdHlsZT0nd2lkdGg6XCIgKyB3aWR0aCArIFwiJSdcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJzID0gdHJzICsgXCI+XCIgKyBsYWJlbCArIFwiPC90ZD5cIlxuICAgIH0pO1xuXG4gICAgdGhlYWQgPSAnPHRyPicgKyB0cnMgKyAnPC90cj4nO1xuXG4gICAgcmV0dXJuIHRoZWFkO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGJvZHkgPSBmdW5jdGlvbiAoa2V5cywgZmllbGQsIHZhbHVlcywgZWRpdGFibGUsIHNmaWVsZHNFZGl0YWJsZSkge1xuICAgIHZhciB0Ym9keSA9IFwiXCI7XG5cbiAgICBpZiAodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgdGJvZHkgPSB0Ym9keSArIFN0ZWVkb3NUYWJsZS5nZXRUcihrZXlzLCB2YWx1ZSwgaW5kZXgsIGZpZWxkLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRib2R5O1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VHIgPSBmdW5jdGlvbiAoa2V5cywgaXRlbV92YWx1ZSwgaW5kZXgsIGZpZWxkLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSB7XG5cbiAgICB2YXIgZmllbGRPYmogPSBmaWVsZDtcbiAgICBpZiAoIV8uaXNPYmplY3QoZmllbGQpKVxuICAgICAgICBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YXIgdHIgPSBcIjx0ciBpZD0nXCIgKyBmaWVsZE9iai5jb2RlICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInIG5hbWU9J1wiICsgZmllbGRPYmouY29kZSArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJyBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInXCJcblxuICAgIGlmIChlZGl0YWJsZSB8fCBzZmllbGRzRWRpdGFibGUpIHtcbiAgICAgICAgdHIgPSB0ciArIFwiJyBjbGFzcz0naXRlbSBlZGl0J1wiXG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgdHIgPSB0ciArIFwiIGNsYXNzPSdpdGVtIGl0ZW0tcmVhZG9ubHknXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyID0gdHIgKyBcIiBjbGFzcz0naXRlbSAnXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpdGVtX3ZhbHVlLnJlbW92ZWQpIHtcbiAgICAgICAgdHIgPSB0ciArIFwiIHN0eWxlPSdkaXNwbGF5Om5vbmUnIFwiO1xuICAgIH1cblxuICAgIHRyID0gdHIgKyBcIic+XCI7XG5cbiAgICB2YXIgdGRzID0gXCJcIjtcblxuICAgIGlmIChlZGl0YWJsZSkge1xuICAgICAgICB0ZHMgPSBTdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQoZmllbGRPYmouY29kZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciBzZmllbGRzID0gZmllbGRPYmouc2ZpZWxkcztcblxuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzZmllbGQgPSBzZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGtleSk7XG5cbiAgICAgICAgdmFyIHZhbHVlID0gaXRlbV92YWx1ZVtrZXldO1xuXG4gICAgICAgIHRkcyA9IHRkcyArIFN0ZWVkb3NUYWJsZS5nZXRUZChzZmllbGQsIGluZGV4LCB2YWx1ZSk7XG5cbiAgICB9KTtcblxuICAgIHRyID0gdHIgKyB0ZHMgKyBcIjwvdHI+XCI7XG4gICAgcmV0dXJuIHRyO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG4gICAgLy8gcmV0dXJuIFwiPHRkIGNsYXNzPSdzdGVlZG9zVGFibGUtaXRlbS1yZW1vdmUgcmVtb3ZlZCcgZGF0YS1pbmRleD0nXCIgKyBpbmRleCArIFwiJz48aSBjbGFzcz0nZmEgZmEtdGltZXMnIGFyaWEtaGlkZGVuPSd0cnVlJz48L3RkPlwiO1xuICAgIHJldHVybiBcIlwiXG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUZCA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgdmFyIHRkID0gXCI8dGQgXCI7XG5cbiAgICB0ZCA9IHRkICsgXCIgY2xhc3M9J3N0ZWVkb3NUYWJsZS1pdGVtLWZpZWxkIFwiICsgZmllbGQudHlwZSArIFwiJyBcIjtcblxuICAgIHZhciB0ZF92YWx1ZSA9IFwiXCI7XG5cbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFREVmFsdWUoZmllbGQsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblxuICAgICAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0XG5cbiAgICAgICAgdGRfdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldClcbiAgICB9XG5cbiAgICB0ZCA9IHRkICsgXCIgZGF0YS1pbmRleD0nXCIgKyBpbmRleCArIFwiJz5cIiArIHRkX3ZhbHVlICsgXCI8L3RkPlwiXG5cbiAgICByZXR1cm4gdGQ7XG59XG5cblxuU3RlZWRvc1RhYmxlLmdldFREVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlKSB7XG4gICAgdmFyIHRkX3ZhbHVlID0gXCJcIjtcbiAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgIHJldHVybiB0ZF92YWx1ZVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB2YXIgZmllbGRPcHRpb25zID0gW107XG4gICAgICAgIGlmKFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xKXtcbiAgICAgICAgICAgIGZpZWxkT3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuICAgICAgICAgICAgICAgIHZhciBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIilcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaXRlbVNwbGl0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhU3BhY2VVc2Vycyh2YWx1ZSkuZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhU3BhY2VVc2Vycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB1ID8gdS5uYW1lIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gdmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhT3JnYW5pemF0aW9ucyh2YWx1ZSkuZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhT3JnYW5pemF0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IG8gPyBvLm5hbWUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZSA/IFwiPGEgaHJlZj0nbWFpbHRvOlwiICsgdmFsdWUgKyBcIic+XCIgKyB2YWx1ZSArIFwiPC9hPlwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiaHR0cFwiKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+aHR0cDovL1wiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSAnKioqKioqJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZhbHVlLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSB0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gJC5mb3JtYXQuZGF0ZSh2YWx1ZSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQwID0gdFswXS5zcGxpdChcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0MFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0gdDFbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXRlLCBob3Vycywgc2Vjb25kcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9ICQuZm9ybWF0LmRhdGUodmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0udmFsdWUgPT0gdmFsdWU7IH0pXG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRPcHRpb24pe1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZTsgfSlcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0ZWRWYWx1ZXMgPSB2YWx1ZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IGZpZWxkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7IHJldHVybiBzcGxpdGVkVmFsdWVzLmluZGV4T2YoaXRlbS52YWx1ZSkgPiAtMTsgfSk7XG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0ubGFiZWw7IH0pLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX3BlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFN0ZWVkb3MubnVtYmVyVG9TdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgY2FzZSAnbG9va3VwJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlKHZhbHVlLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZSA/IHZhbHVlIDogJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGU7XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGRfdmFsdWU7XG59O1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgQXV0b0Zvcm0uYWRkSW5wdXRUeXBlKFwidGFibGVcIiwge1xuICAgICAgICB0ZW1wbGF0ZTogXCJhZlRhYmxlXCIsXG4gICAgICAgIHZhbHVlT3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZGF0YShcInNjaGVtYUtleVwiKTtcbiAgICAgICAgICAgIHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VmFsaWRWYWx1ZShuYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVDb252ZXJ0ZXJzOiB7XG4gICAgICAgICAgICBcInN0cmluZ0FycmF5XCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb1N0cmluZ0FycmF5LFxuICAgICAgICAgICAgXCJudW1iZXJcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvTnVtYmVyLFxuICAgICAgICAgICAgXCJudW1lckFycmF5XCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb051bWJlckFycmF5LFxuICAgICAgICAgICAgXCJib29sZWFuXCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb0Jvb2xlYW4sXG4gICAgICAgICAgICBcImJvb2xlYW5BcnJheVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9Cb29sZWFuQXJyYXksXG4gICAgICAgICAgICBcImRhdGVcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvRGF0ZSxcbiAgICAgICAgICAgIFwiZGF0ZUFycmF5XCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb0RhdGVBcnJheVxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0QWRqdXN0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZXh0LmF0dHMubWF4bGVuZ3RoID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29udGV4dC5tYXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5hdHRzLm1heGxlbmd0aCA9IGNvbnRleHQubWF4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFRlbXBsYXRlLmFmVGFibGUuZXZlbnRzKHtcbiAgICAgICAgJ3RhcCAuc3RlZWRvcy10YWJsZSAuc3RlZWRvc1RhYmxlLWl0ZW0tYWRkLC5hZGQtaXRlbS10cic6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuXG4gICAgICAgICAgICB2YXIgdGFibGVWYWx1ZSA9IFN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlKG5hbWUpO1xuXG4gICAgICAgICAgICB2YXIgbmV3X2l0ZW1faW5kZXggPSB0YWJsZVZhbHVlID8gdGFibGVWYWx1ZS5sZW5ndGggOiAwO1xuXG4gICAgICAgICAgICBTdGVlZG9zVGFibGUuc2hvd01vZGFsKG5hbWUsIG5ld19pdGVtX2luZGV4LCBcImFkZFwiKTtcbiAgICAgICAgfSxcblxuICAgICAgICAndGFwIC5zdGVlZG9zLXRhYmxlIC5zdGVlZG9zVGFibGUtaXRlbS1maWVsZCc6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5kYXRhLmF0dHMuZWRpdGFibGUgfHwgdGVtcGxhdGUuZGF0YS5hdHRzLnNmaWVsZHNFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IHRlbXBsYXRlLmRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnNob3dNb2RhbChmaWVsZCwgaW5kZXgsIFwiZWRpdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAndGFwIC5zdGVlZG9zLXRhYmxlIC5zdGVlZG9zVGFibGUtaXRlbS1yZW1vdmUnOiBmdW5jdGlvbiAoZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSB0ZW1wbGF0ZS5kYXRhLm5hbWU7XG4gICAgICAgICAgICB2YXIgaXRlbV9pbmRleCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICAgICAgICAgIFNlc3Npb24uc2V0KFwiaW5zdGFuY2VfY2hhbmdlXCIsIHRydWUpO1xuICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnJlbW92ZUl0ZW0oZmllbGQsIGl0ZW1faW5kZXgpO1xuICAgICAgICB9LFxuXG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLml0ZW0tcmVhZG9ubHknOiBmdW5jdGlvbiAoZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRlbXBsYXRlLmRhdGEuYXR0cy5lZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IHRlbXBsYXRlLmRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnNob3dNb2RhbChmaWVsZCwgaW5kZXgsIFwicmVhZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG5cblxuICAgIFRlbXBsYXRlLmFmVGFibGUucmVuZGVyZWQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5kYXRhLm5hbWU7XG5cbiAgICAgICAgdmFyIHNmaWVsZHNFZGl0YWJsZSA9IHRoaXMuZGF0YS5hdHRzLnNmaWVsZHNFZGl0YWJsZTtcblxuICAgICAgICB2YXIga2V5cyA9IFN0ZWVkb3NUYWJsZS5nZXRLZXlzKGZpZWxkKTtcbiAgICAgICAgdmFyIHZhbGlkVmFsdWUgPSBTdGVlZG9zVGFibGUuaGFuZGxlRGF0YShmaWVsZCwgdGhpcy5kYXRhLnZhbHVlKTtcbiAgICAgICAgU3RlZWRvc1RhYmxlLnNldFRhYmxlVmFsdWUoZmllbGQsIHZhbGlkVmFsdWUpO1xuXG4gICAgICAgICQoXCJ0aGVhZFtuYW1lPSdcIiArIGZpZWxkICsgXCJUaGVhZCddXCIpLmh0bWwoU3RlZWRvc1RhYmxlLmdldFRoZWFkKGZpZWxkLCB0aGlzLmRhdGEuYXR0cy5lZGl0YWJsZSkpO1xuXG4gICAgICAgICQoXCJ0Ym9keVtuYW1lPSdcIiArIGZpZWxkICsgXCJUYm9keSddXCIpLmh0bWwoU3RlZWRvc1RhYmxlLmdldFRib2R5KGtleXMsIGZpZWxkLCBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCksIHRoaXMuZGF0YS5hdHRzLmVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpKTtcblxuICAgICAgICBzdHIgPSB0KFwic3RlZWRvc190YWJsZV9hZGRfaXRlbVwiKTtcbiAgICAgICAgYWRkSXRlbVRyID0gXCI8dHIgY2xhc3M9J2FkZC1pdGVtLXRyJz48dGQgY29sc3Bhbj0nXCIgKyBrZXlzLmxlbmd0aCArIFwiJz48aSBjbGFzcz0naW9uIGlvbi1wbHVzLXJvdW5kJz48L2k+XCIgKyBzdHIgKyBcIjwvdGQ+PC90cj5cIjtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLmF0dHMuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICQoXCJ0Zm9vdFtuYW1lPSdcIiArIGZpZWxkICsgXCJUZm9vdCddXCIpLmFwcGVuZChhZGRJdGVtVHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcbiAgICAgICAgaWYgKGMuc3RlcF90eXBlID09ICdjb3VudGVyU2lnbicgfHwgSW5zdGFuY2VNYW5hZ2VyLmNjSGFzRWRpdFBlcm1pc3Npb24oKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvcnVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFRlbXBsYXRlLmN1cnJlbnREYXRhKCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gU3RlZWRvc1RhYmxlLmdldEtleXMoZmllbGQpO1xuICAgICAgICAgICAgICAgIHZhciB2YWxpZFZhbHVlID0gU3RlZWRvc1RhYmxlLmhhbmRsZURhdGEoZmllbGQsIGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlKGZpZWxkLCB2YWxpZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAkKFwidGJvZHlbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGJvZHknXVwiKS5odG1sKFN0ZWVkb3NUYWJsZS5nZXRUYm9keShrZXlzLCBmaWVsZCwgU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpLCBkYXRhLmF0dHMuZWRpdGFibGUsIHNmaWVsZHNFZGl0YWJsZSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgfTtcbn0iLCJJbWFnZVNpZ24uaGVscGVycyA9XG5cdHNwYWNlVXNlclNpZ246ICh1c2VySWQpLT5cblx0XHRzcGFjZSA9IFwiXCJcblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0c3BhY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuc3BhY2Vcblx0XHRlbHNlXG5cdFx0XHRzcGFjZSA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXG5cdFx0c3BhY2VVc2VyU2lnbiA9IGRiLnNwYWNlX3VzZXJfc2lnbnMuZmluZE9uZSh7c3BhY2U6IHNwYWNlLCB1c2VyOiB1c2VySWR9KTtcblx0XHRyZXR1cm4gc3BhY2VVc2VyU2lnblxuXG5cdGltYWdlVVJMOiAodXNlcklkKS0+XG5cblx0XHRzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbih1c2VySWQpO1xuXG5cdFx0YWJzb2x1dGUgPSBmYWxzZVxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRhYnNvbHV0ZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5hYnNvbHV0ZVxuXG5cdFx0aWYgc3BhY2VVc2VyU2lnbj8uc2lnblxuXHRcdFx0aWYgYWJzb2x1dGVcblx0XHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgc3BhY2VVc2VyU2lnbi5zaWduKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcGkvZmlsZXMvYXZhdGFycy9cIiArIHNwYWNlVXNlclNpZ24uc2lnbik7XG4iLCJJbWFnZVNpZ24uaGVscGVycyA9IHtcbiAgc3BhY2VVc2VyU2lnbjogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgdmFyIHNwYWNlLCBzcGFjZVVzZXJTaWduO1xuICAgIHNwYWNlID0gXCJcIjtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBzcGFjZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zcGFjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3BhY2UgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgfVxuICAgIHNwYWNlVXNlclNpZ24gPSBkYi5zcGFjZV91c2VyX3NpZ25zLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlLFxuICAgICAgdXNlcjogdXNlcklkXG4gICAgfSk7XG4gICAgcmV0dXJuIHNwYWNlVXNlclNpZ247XG4gIH0sXG4gIGltYWdlVVJMOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgYWJzb2x1dGUsIHNwYWNlVXNlclNpZ247XG4gICAgc3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24odXNlcklkKTtcbiAgICBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGFic29sdXRlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmFic29sdXRlO1xuICAgIH1cbiAgICBpZiAoc3BhY2VVc2VyU2lnbiAhPSBudWxsID8gc3BhY2VVc2VyU2lnbi5zaWduIDogdm9pZCAwKSB7XG4gICAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgc3BhY2VVc2VyU2lnbi5zaWduKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIlRyYWNlc0hhbmRsZXIuaGVscGVycyA9XG5cdHNob3dTaWduSW1hZ2U6IChoYW5kbGVyLCBpc19maW5pc2hlZCwganVkZ2UsIHRyYWNlU2hvd1NpZ25JbWFnZSkgLT5cblx0XHRpZiB0cmFjZVNob3dTaWduSW1hZ2UgPT0gZmFsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmICFpc19maW5pc2hlZFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgWydyZXR1cm5lZCcsICd0ZXJtaW5hdGVkJywgJ3JldHJpZXZlZCddLmluY2x1ZGVzKGp1ZGdlKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0c3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24oaGFuZGxlcilcblxuXHRcdGlmIHNwYWNlVXNlclNpZ24/LnNpZ25cblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0b2JqZWN0VXJsOiAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKS0+XG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkiLCJUcmFjZXNIYW5kbGVyLmhlbHBlcnMgPSB7XG4gIHNob3dTaWduSW1hZ2U6IGZ1bmN0aW9uKGhhbmRsZXIsIGlzX2ZpbmlzaGVkLCBqdWRnZSwgdHJhY2VTaG93U2lnbkltYWdlKSB7XG4gICAgdmFyIHNwYWNlVXNlclNpZ247XG4gICAgaWYgKHRyYWNlU2hvd1NpZ25JbWFnZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFpc19maW5pc2hlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoWydyZXR1cm5lZCcsICd0ZXJtaW5hdGVkJywgJ3JldHJpZXZlZCddLmluY2x1ZGVzKGp1ZGdlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKTtcbiAgICBpZiAoc3BhY2VVc2VyU2lnbiAhPSBudWxsID8gc3BhY2VVc2VyU2lnbi5zaWduIDogdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgb2JqZWN0VXJsOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKTtcbiAgfVxufTtcbiIsIm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIilcbkluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMgPVxuXHRhcHBsaWNhbnRDb250ZXh0OiAtPlxuXHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRkYXRhID0ge1xuXHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0YXR0czoge25hbWU6ICdpbnNfYXBwbGljYW50JywgaWQ6ICdpbnNfYXBwbGljYW50JywgY2xhc3M6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J30sXG5cdFx0XHR2YWx1ZTogc3RlZWRvc19pbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuXHRcdH1cblx0XHRpZiBub3Qgc3RlZWRvc19pbnN0YW5jZSB8fCBzdGVlZG9zX2luc3RhbmNlLnN0YXRlICE9IFwiZHJhZnRcIlxuXHRcdFx0ZGF0YS5hdHRzLmRpc2FibGVkID0gdHJ1ZVxuXHRcdHJldHVybiBkYXRhO1xuXG5cdGluc3RhbmNlSWQ6IC0+XG5cdFx0cmV0dXJuICdpbnN0YW5jZWZvcm0nOyNcImluc3RhbmNlX1wiICsgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpO1xuXG5cdGZvcm1fdHlwZXM6IC0+XG5cdFx0aWYgQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cdFx0XHRyZXR1cm4gJ2Rpc2FibGVkJztcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gJ21ldGhvZCc7XG5cblx0c3RlZWRvc19mb3JtOiAtPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uXG5cblx0aW5uZXJzdWJmb3JtQ29udGV4dDogKG9iaiktPlxuXHRcdGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cdFx0b2JqW1widGFibGVWYWx1ZXNcIl0gPSBpZiBkb2NfdmFsdWVzIHRoZW4gZG9jX3ZhbHVlc1tvYmouY29kZV0gZWxzZSBbXVxuXHRcdG9ialtcImZvcm1JZFwiXSA9IFwiaW5zdGFuY2Vmb3JtXCI7XG5cdFx0cmV0dXJuIG9iajtcblxuXHRpbnN0YW5jZTogLT5cblx0XHRTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSlcblx0XHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuXG5cdGVtcHR5OiAodmFsKSAtPlxuXHRcdGlmIHZhbFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0dW5lbXB0eTogKHZhbCkgLT5cblx0XHRpZiB2YWxcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRlcXVhbHM6IChhLCBiKSAtPlxuXHRcdHJldHVybiAoYSA9PSBiKVxuXG5cdHVuZXF1YWxzOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gIShhID09IGIpXG5cblx0aW5jbHVkZXM6IChhLCBiKSAtPlxuXHRcdHJldHVybiBiLnNwbGl0KCcsJykuaW5jbHVkZXMoYSk7XG5cblx0aW5jbHVkZTogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcblxuXHRmaWVsZHM6IC0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG5cblx0Zm9ybWF0RGF0ZTogKGRhdGUsIG9wdGlvbnMpLT5cblx0XHRpZiAhZGF0ZVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0aWYgb3B0aW9ucyAmJiB0eXBlb2Yob3B0aW9ucykgPT0gJ3N0cmluZydcblx0XHRcdG9wdGlvbnMgPSBKU09OLnBhcnNlKG9wdGlvbnMpO1xuXG5cdFx0aWYgIW9wdGlvbnMuZm9ybWF0XG5cdFx0XHRvcHRpb25zID0ge2Zvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tXCJ9XG5cblx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdChvcHRpb25zLmZvcm1hdCk7XG5cblx0dHJhY2VzOiAtPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0c3RlZWRvc0RhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy52aWV3Py50ZW1wbGF0ZT8uc3RlZWRvc0RhdGFcblx0XHRcdGluc3RhbmNlID0gc3RlZWRvc0RhdGE/Lmluc3RhbmNlXG5cdFx0XHRmbG93ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEZsb3dWZXJzaW9uKGluc3RhbmNlKTtcblx0XHRcdGxvY2FsZSA9IHN0ZWVkb3NEYXRhPy5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0ZmxvdyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZsb3dWZXJzaW9uKClcblxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXG5cdFx0aWYgIWluc3RhbmNlIHx8ICFmbG93XG5cdFx0XHRyZXR1cm4ge307XG5cblx0XHRzdGVwcyA9IGZsb3cuc3RlcHM7XG5cblx0XHR0cmFjZXMgPSB7fTtcblxuXHRcdGluc3RhbmNlLnRyYWNlcz8uZm9yRWFjaCAodHJhY2UpLT5cblx0XHRcdHN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHRyYWNlLnN0ZXApXG5cblx0XHRcdGFwcHJvdmVzID0gW11cblxuXHRcdFx0dHJhY2UuYXBwcm92ZXM/LmZvckVhY2ggKGFwcHJvdmUpIC0+XG5cdFx0XHRcdGlmIHRyYWNlLmlzX2ZpbmlzaGVkID09IHRydWVcbiMg5bey57uT5p2f55qE5pi+56S65Li65qC45YeGL+mps+Wbni/lj5bmtojnlLPor7dcblx0XHRcdFx0XHRpZiBhcHByb3ZlLmp1ZGdlID09ICdhcHByb3ZlZCdcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgYXBwcm92ZWRcIiwge30sIGxvY2FsZSlcblx0XHRcdFx0XHRlbHNlIGlmIGFwcHJvdmUuanVkZ2UgPT0gJ3JlamVjdGVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWplY3RlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAndGVybWluYXRlZCdcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAncmVhc3NpZ25lZCdcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVhc3NpZ25lZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAncmVsb2NhdGVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWxvY2F0ZWRcIiwge30sIGxvY2FsZSlcblx0XHRcdFx0XHRlbHNlIGlmIGFwcHJvdmUuanVkZ2UgPT0gJydcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBcIlwiXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFwiXCJcblxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBwZW5kaW5nXCIsIHt9LCBsb2NhbGUpXG5cblx0XHRcdFx0YXBwcm92ZXMucHVzaFxuXHRcdFx0XHRcdF9pZDogYXBwcm92ZS5faWRcblx0XHRcdFx0XHRoYW5kbGVyOiBhcHByb3ZlLnVzZXJcblx0XHRcdFx0XHRoYW5kbGVyX25hbWU6IGFwcHJvdmUuaGFuZGxlcl9uYW1lXG5cdFx0XHRcdFx0aGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTogYXBwcm92ZS5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lXG5cdFx0XHRcdFx0aGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWVcblx0XHRcdFx0XHRmaW5pc2hfZGF0ZTogYXBwcm92ZS5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdGp1ZGdlOiBhcHByb3ZlLmp1ZGdlXG5cdFx0XHRcdFx0anVkZ2VfbmFtZToganVkZ2VfbmFtZVxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBhcHByb3ZlLmRlc2NyaXB0aW9uXG5cdFx0XHRcdFx0aXNfZmluaXNoZWQ6IGFwcHJvdmUuaXNfZmluaXNoZWRcblx0XHRcdFx0XHR0eXBlOiBhcHByb3ZlLnR5cGVcblx0XHRcdFx0XHRvcGluaW9uX2ZpZWxkc19jb2RlOiBhcHByb3ZlLm9waW5pb25fZmllbGRzX2NvZGVcblx0XHRcdFx0XHRzaWduX2ZpZWxkX2NvZGU6IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlXG5cdFx0XHRcdFx0aXNfcmVhZDogYXBwcm92ZS5pc19yZWFkXG5cdFx0XHRcdFx0c2lnbl9zaG93OiBhcHByb3ZlLnNpZ25fc2hvd1xuXG5cblx0XHRcdGlmIHN0ZXBcblx0XHRcdFx0aWYgc3RlcC5uYW1lIG9mIHRyYWNlc1xuXHRcdFx0XHRcdHRyYWNlc1tzdGVwLm5hbWVdID0gdHJhY2VzW3N0ZXAubmFtZV0uY29uY2F0KGFwcHJvdmVzKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dHJhY2VzW3N0ZXAubmFtZV0gPSBhcHByb3Zlc1xuXG5cdFx0cmV0dXJuIHRyYWNlcztcblxuXG5cblx0ZG9jX3ZhbHVlczogLT5cblx0XHRXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cblx0aW5zdGFuY2VfYm94X3N0eWxlOiAtPlxuXHRcdGJveCA9IFNlc3Npb24uZ2V0KFwiYm94XCIpXG5cdFx0aWYgYm94ID09IFwiaW5ib3hcIiB8fCBib3ggPT0gXCJkcmFmdFwiXG5cdFx0XHRqdWRnZSA9IFNlc3Npb24uZ2V0KFwianVkZ2VcIilcblx0XHRcdGlmIGp1ZGdlXG5cdFx0XHRcdGlmIChqdWRnZSA9PSBcImFwcHJvdmVkXCIpXG5cdFx0XHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdFx0XHRlbHNlIGlmIChqdWRnZSA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRcdFx0cmV0dXJuIFwiYm94LWRhbmdlclwiXG5cdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgaW5zICYmIGlucy5maW5hbF9kZWNpc2lvblxuXHRcdFx0aWYgaW5zLmZpbmFsX2RlY2lzaW9uID09IFwiYXBwcm92ZWRcIlxuXHRcdFx0XHRyZXR1cm4gXCJib3gtc3VjY2Vzc1wiXG5cdFx0XHRlbHNlIGlmIChpbnMuZmluYWxfZGVjaXNpb24gPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblxuI2lzX2Rpc2FibGVkOiAtPlxuIyAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiMgICAgaWYgIWluc1xuIyAgICAgICAgcmV0dXJuO1xuIyAgICBpZiBpbnMuc3RhdGUhPVwiZHJhZnRcIlxuIyAgICAgICAgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiMgICAgcmV0dXJuO1xuXG5cdHRhYmxlX2ZpZWxkczogKGluc3RhbmNlKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRcdGVsc2Vcblx0XHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtVmVyc2lvbihpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pXG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRmaWVsZHMgPSBfLmNsb25lKGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuXG5cdFx0XHRmaWVsZHMuZm9yRWFjaCAoZmllbGQsIGluZGV4KSAtPlxuXHRcdFx0XHRmaWVsZC50cl9zdGFydCA9IFwiXCI7XG5cdFx0XHRcdGZpZWxkLnRyX2VuZCA9IFwiXCI7XG5cdFx0XHRcdHRkX2NvbHNwYW4gPSAxO1xuI1x0XHRcdFx05by65Yi26K6+572u5qCH5aS05a2X5q615Li65a695a2X5q61XG5cdFx0XHRcdGlmIENvcmVGb3JtPy5wYWdlVGl0bGVGaWVsZE5hbWUgPT0gZmllbGQuY29kZVxuXHRcdFx0XHRcdGZpZWxkLmlzX3dpZGUgPSB0cnVlXG5cblx0XHRcdFx0aWYgZmllbGQuZm9ybXVsYSAmJiBmaWVsZC50eXBlICE9ICdvZGF0YSdcblx0XHRcdFx0XHRmaWVsZC5wZXJtaXNzaW9uID0gXCJyZWFkb25seVwiO1xuXG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuIyDlpoLmnpzlvZPliY3lrZfmrrXmmK/liIbnu4TjgIHooajmoLzjgIHlrr3lrZfmrrVcblx0XHRcdFx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0XHRcdGZpZWxkLnRkX2NvbHNwYW4gPSA0O1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGZpZWxkLnRkX2NvbHNwYW4gPSAzO1xuXG5cdFx0XHRcdFx0aWYgaW5kZXggIT0gMFxuXHRcdFx0XHRcdFx0ZmllbGQudHJfc3RhcnQgPSBcIjx0cj5cIjtcblx0XHRcdFx0XHRcdGZpZWxkLnRyX2VuZCA9IFwiPC90cj5cIjtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHByZV9maWVsZHMgPSBmaWVsZHMuc2xpY2UoMCwgaW5kZXgpO1xuXG5cdFx0XHRcdFx0cHJlX3dpZGVfZmllbGRzID0gcHJlX2ZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcImlzX3dpZGVcIiwgdHJ1ZSk7XG5cblx0XHRcdFx0XHR0cl9zdGFydCA9IFwiXCI7XG5cblx0XHRcdFx0XHR0cl9lbmQgPSBcIlwiO1xuXG5cdFx0XHRcdFx0IyDlhYjorqHnrpflvZPliY3lrZfmrrXmmK/lkKbkuLrlrr3lrZfmrrVcblx0XHRcdFx0XHRiZWZvcmVfZmllbGQgPSBudWxsO1xuXHRcdFx0XHRcdGFmdGVyX2ZpZWxkID0gbnVsbDtcblxuXHRcdFx0XHRcdGlmIGluZGV4ID4gMFxuXHRcdFx0XHRcdFx0YmVmb3JlX2ZpZWxkID0gZmllbGRzW2luZGV4IC0gMV1cblxuXHRcdFx0XHRcdGlmIGluZGV4IDwgZmllbGRzLmxlbmd0aCAtIDFcblx0XHRcdFx0XHRcdGFmdGVyX2ZpZWxkID0gZmllbGRzW2luZGV4ICsgMV1cblxuXHRcdFx0XHRcdCMg5aaC5p6c5b2T5YmN5a2X5q615piv5YiG57uE44CB6KGo5qC844CB5a695a2X5q61XG5cdFx0XHRcdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSAndGFibGUnXG5cdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gNDtcblx0XHRcdFx0XHRlbHNlIGlmIGZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSAzO1xuXHRcdFx0XHRcdGVsc2VcbiMg5YmN5ZCO6YO95piv5a695a2X5q61XG5cdFx0XHRcdFx0XHRpZiBiZWZvcmVfZmllbGQgJiYgYWZ0ZXJfZmllbGQgJiYgYmVmb3JlX2ZpZWxkLmlzX3dpZGUgJiYgYWZ0ZXJfZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0XHRmaWVsZC5pc193aWRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRcdCMg5b2T5YmN5pivdHIg5LiL55qEIOesrOS4gOS4qnRkICYg5ZCO6L6555qE5a2X5q615piv5a695a2X5q61XG5cdFx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT0gMCAmJiBhZnRlcl9maWVsZCAmJiBhZnRlcl9maWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gMztcblxuXHRcdFx0XHRcdFx0IyDlvZPliY3mmK90ciDkuIvnmoQg56ys5LiA5LiqdGQgJiDlvZPliY3lrZfmrrXmmK/mnIDlkI7kuIDkuKrlrZfmrrVcblx0XHRcdFx0XHRcdGlmIChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PSAwICYmIGFmdGVyX2ZpZWxkID09IG51bGxcblx0XHRcdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSAzO1xuXG5cdFx0XHRcdFx0ZmllbGQudGRfY29sc3BhbiA9IHRkX2NvbHNwYW47XG5cblxuXHRcdFx0XHRcdGlmIGluZGV4ID09IDBcbiMgdHJfc3RhcnQgPSBcIjx0cj5cIjsg55Sx5LqOVGVtcGxhdGXnmoTnvJbor5FidWfvvIzlr7zoh7Tmr4/mrKHnu5nkuIDkuKp0cuW8gOWni+aXtu+8jOS8muiHquWKqOihpeWktOaIluihpeWwvuOAguWboOatpOWcqOesrOS4gOihjOi/lOWbnuS4gOS4quepuuWtl+espuS4si5cblx0XHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCI8dHI+XCI7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aWYgKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09IDAgfHwgZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0XHRpZiBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0XHRcdFx0XHR0cl9zdGFydCA9IFwiPHRyIGNsYXNzID0gXFxcInRyLWNoaWxkLXRhYmxlXFxcIj5cIjtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCI8dHI+XCI7XG5cblx0XHRcdFx0XHRmaWVsZC50cl9zdGFydCA9IHRyX3N0YXJ0O1xuXG5cblx0XHRcdFx0XHRpZiBpbmRleCArIDEgPT0gZmllbGRzLmxlbmd0aCB8fCBmaWVsZC50eXBlID09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09ICd0YWJsZScgfHwgZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0dHJfZW5kID0gXCI8L3RyPlwiO1xuXG5cdFx0XHRcdFx0aWYgKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyICE9IDBcblx0XHRcdFx0XHRcdHRyX2VuZCA9IFwiPC90cj5cIjtcblxuXHRcdFx0XHRcdGZpZWxkLnRyX2VuZCA9IHRyX2VuZDtcblxuXHRcdFx0cmV0dXJuIGZpZWxkcztcblxuXHRzb3J0X2FwcHJvdmU6IChhcHByb3Zlcywgb3JkZXIpLT5cblx0XHRpZiAhYXBwcm92ZXNcblx0XHRcdHJldHVybiBbXVxuXG5cdFx0aWYgIWFwcHJvdmVzIGluc3RhbmNlb2YgQXJyYXlcblx0XHRcdHJldHVybiBbXVxuXHRcdGVsc2Vcblx0XHRcdGlmIG9yZGVyID09ICdkZXNjJ1xuXHRcdFx0XHRhcHByb3Zlcy5zb3J0IChwMSwgcDIpIC0+XG5cdFx0XHRcdFx0X3AxID0gMFxuXHRcdFx0XHRcdF9wMiA9IDBcblxuXHRcdFx0XHRcdGlmIHAxLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRfcDEgPSBwMS5maW5pc2hfZGF0ZS5nZXRUaW1lKClcblxuXHRcdFx0XHRcdGlmIHAyLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRfcDIgPSBwMi5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gX3AyIC0gX3AxXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGFwcHJvdmVzLnNvcnQgKHAxLCBwMikgLT5cblx0XHRcdFx0XHRfcDEgPSAwXG5cdFx0XHRcdFx0X3AyID0gMFxuXG5cdFx0XHRcdFx0aWYgcDEuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMSA9IHAxLmZpbmlzaF9kYXRlLmdldFRpbWUoKVxuXG5cdFx0XHRcdFx0aWYgcDIuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcblxuXHRcdFx0XHRcdHJldHVybiBfcDEgLSBfcDJcblx0XHRyZXR1cm4gYXBwcm92ZXNcblxuXHRfdDogKGtleSktPlxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSlcblx0Z2V0RmllbGQ6IChjb2RlKS0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvblxuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSlcblxuXHRnZXRWYWx1ZTogKGNvZGUpLT5cblx0XHRpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZVxuXG5cdFx0Zm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvblxuXG5cdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXG5cdFx0dXRjT2Zmc2V0ID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnV0Y09mZnNldFxuXG5cdFx0dmFsdWVzID0gaW5zdGFuY2UudmFsdWVzIHx8IHt9XG5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKVxuXG5cdFx0cmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSB2YWx1ZXNbY29kZV0sIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSksIGxvY2FsZSwgdXRjT2Zmc2V0XG5cblx0Z2V0TGFiZWw6IChjb2RlKS0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvblxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCBmb3JtX3ZlcnNpb24uZmllbGRzLCBjb2RlXG5cblx0aXNUZXh0YXJlYTogKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQ/LnR5cGUgPT0gXCJpbnB1dFwiICYmIGZpZWxkPy5pc190ZXh0YXJlYVxuXHRcdFx0cmV0dXJuIHRydWVcblxuXHRnZXRDZkNsYXNzOiAoZmllbGQpLT5cblx0XHRpZiBmaWVsZD8udHlwZSA9PSBcImlucHV0XCIgJiYgZmllbGQ/LmlzX3RleHRhcmVhXG5cdFx0XHRyZXR1cm4gXCJjZlRleHRhcmVhXCJcblxuXHRnZXRUYWJsZVRoZWFkOiAoZmllbGQpLT5cblx0XHRyZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRoZWFkKGZpZWxkLCBmYWxzZSlcblxuXHRnZXRUYWJsZUJvZHk6IChmaWVsZCktPlxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZVxuXHRcdFx0dmFsdWVzID0gaW5zdGFuY2UudmFsdWVzIHx8IHt9XG5cdFx0ZWxzZVxuXHRcdFx0dmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpXG5cblx0XHR0YWJsZVZhbHVlID0gdmFsdWVzW2ZpZWxkLmNvZGVdO1xuXHRcdHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGJvZHkoZmllbGQuc2ZpZWxkcy5nZXRQcm9wZXJ0eShcImNvZGVcIiksIGZpZWxkLCB0YWJsZVZhbHVlLCBmYWxzZSlcblxuXHRzaG93TGFiZWw6IChmaWVsZCktPlxuXHRcdHRlbXBsYXRlRGF0YSA9IFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YVxuXHRcdGlmIHRlbXBsYXRlRGF0YS5sYWJlbCA9PSBmYWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuIHRydWVcblxuI1x0YWZGaWVsZExhYmVsVGV4dDogKG9wKS0+XG4jXHRcdGlmICFUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGFcbiNcdFx0XHRyZXR1cm4gQXV0b0Zvcm0uZ2V0TGFiZWxGb3JGaWVsZChvcC5uYW1lKVxuI1x0XHRlbHNlXG4jXHRcdFx0Zm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvblxuI1x0XHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCBmb3JtX3ZlcnNpb24uZmllbGRzLCBvcD8uaGFzaD8ubmFtZVxuXG5cdGlzT3BpbmlvbkZpZWxkOiAoZmllbGQpLT5cblx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZC5mb3JtdWxhKVxuXG5cdGlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nOiAoZmllbGRfZm9ybXVsYSktPlxuXHRcdHJldHVybiBJbnN0YW5jZVNpZ25UZXh0LmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cblx0aW5jbHVkZXNPcGluaW9uRmllbGQ6IChmb3JtLCBmb3JtX3ZlcnNpb24pLT5cblxuXHRcdGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG5cblx0XHRmaWVsZHMgPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe19pZDogZm9ybV92ZXJzaW9uLCBmb3JtOiBmb3JtfSk/LmZpZWxkcyB8fCBbXVxuXG5cdFx0ZmllbGRzLmZvckVhY2ggKGYpLT5cblx0XHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRcdGNvbnNvbGUubG9nICdpZ25vcmUgb3BpbmlvbiBmaWVsZCBpbiB0YWJsZSdcblx0XHRcdGVsc2UgaWYgZi50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdFx0ZmllbGRfZm9ybXVsYXMucHVzaCBmMS5mb3JtdWxhXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZi5mb3JtdWxhXG5cblx0XHRfLnNvbWUgZmllbGRfZm9ybXVsYXMsIChmaWVsZF9mb3JtdWxhKS0+XG5cdFx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKVxuXG5cdGdldE9waW5pb25GaWVsZFN0ZXBzTmFtZTogKGZpZWxkX2Zvcm11bGEsIHRvcF9rZXl3b3JkcyktPlxuXG5cdFx0b3BpbmlvbkZpZWxkcyA9IG5ldyBBcnJheSgpO1xuI1x0XHRjb25zb2xlLmxvZyhcImZpZWxkX2Zvcm11bGFcIiwgZmllbGRfZm9ybXVsYSlcblx0XHRpZiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cdFx0XHRpZiBmaWVsZF9mb3JtdWxhXG5cbiNcdFx0XHRcdGZvbzEgPSBmaWVsZF9mb3JtdWxhLnNwbGl0KFwiLFwiKVxuXHRcdFx0XHRmb28xID0gZmllbGRfZm9ybXVsYS5zcGxpdChcIjtcIilcblxuI1x0XHRcdFx0aWYgdG9wX2tleXdvcmRzXG4jXHRcdFx0XHRcdGZvbzEgPSBmaWVsZF9mb3JtdWxhLnNwbGl0KFwiO1wiKVxuXG5cdFx0XHRcdGZvbzEuZm9yRWFjaCAoZm9vKS0+XG5cdFx0XHRcdFx0anNvbl9mb3JtdWxhID0ge31cblxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0anNvbl9mb3JtdWxhID0gZXZhbChcIihcIiArIGZvbyArIFwiKVwiKVxuXHRcdFx0XHRcdGNhdGNoXG5cdFx0XHRcdFx0XHRqc29uX2Zvcm11bGEgPSB7fVxuXG5cdFx0XHRcdFx0aWYganNvbl9mb3JtdWxhPy55aWppYW5sYW5cblx0XHRcdFx0XHRcdHNmID0ge31cblxuXHRcdFx0XHRcdFx0c2Yuc3RlcE5hbWUgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLnN0ZXBcblxuXHRcdFx0XHRcdFx0c2YuaW1hZ2Vfc2lnbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uaW1hZ2Vfc2lnbiB8fCBmYWxzZVxuXG5cdFx0XHRcdFx0XHRzZi5vbmx5X2NjX29waW5pb24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLm9ubHlfY2MgfHwgZmFsc2VcblxuXHRcdFx0XHRcdFx0c2YuZGVmYXVsdF9kZXNjcmlwdGlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uZGVmYXVsdFxuXG5cdFx0XHRcdFx0XHRzZi5vbmx5X2hhbmRsZXIgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLm9ubHlfaGFuZGxlclxuXG5cdFx0XHRcdFx0XHRzZi50b3Bfa2V5d29yZHMgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLnRvcF9rZXl3b3JkcyB8fCB0b3Bfa2V5d29yZHNcblxuXHRcdFx0XHRcdFx0b3BpbmlvbkZpZWxkcy5wdXNoKHNmKTtcblxuXHRcdFx0XHRcdGVsc2UgaWYoZmllbGRfZm9ybXVsYT8uaW5kZXhPZihcInt0cmFjZXMuXCIpID4gLTEgfHwgZmllbGRfZm9ybXVsYT8uaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA+IC0xKVxuXG5cdFx0XHRcdFx0XHRzZiA9IHtvbmx5X2NjX29waW5pb246IGZhbHNlLCBpbWFnZV9zaWduOiBmYWxzZSwgdG9wX2tleXdvcmRzOiB0b3Bfa2V5d29yZHN9XG5cblx0XHRcdFx0XHRcdGlmIGZvby5pbmRleE9mKFwie3NpZ25hdHVyZS5cIikgPiAtMVxuXHRcdFx0XHRcdFx0XHRzZi5pbWFnZV9zaWduID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRmb28gPSBmb28ucmVwbGFjZShcIntzaWduYXR1cmUuXCIsXCJcIik7XG5cblx0XHRcdFx0XHRcdHMxID0gZm9vLnJlcGxhY2UoXCJ7XCIsXCJcIikucmVwbGFjZShcIn1cIixcIlwiKVxuXHRcdFx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDFcblx0XHRcdFx0XHRcdFx0c2Yuc3RlcE5hbWUgPSBzMS5zcGxpdChcIi5cIilbMV1cblx0XHRcdFx0XHRcdFx0aWYgb3BpbmlvbkZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcInN0ZXBOYW1lXCIsc2Yuc3RlcE5hbWUpLmxlbmd0aCA+IDBcblx0XHRcdFx0XHRcdFx0XHRvcGluaW9uRmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJzdGVwTmFtZVwiLCBzZi5zdGVwTmFtZSk/Lm9ubHlfY2Nfb3BpbmlvbiA9IHRydWVcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBzMS5zcGxpdChcIi5cIilbMl0/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ2NjJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZi5vbmx5X2NjX29waW5pb24gPSB0cnVlXG5cdFx0XHRcdFx0XHRvcGluaW9uRmllbGRzLnB1c2goc2YpO1xuXG5cdFx0cmV0dXJuIG9waW5pb25GaWVsZHNcblxuXHRzaG93Q0NPcGluaW9uOiAoZmllbGQpLT5cblx0XHRpZiBmaWVsZC5mb3JtdWxhPy5pbmRleE9mKFwie3RyYWNlcy5cIikgPiAtMSB8fCBmaWVsZC5mb3JtdWxhPy5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpID4gLTFcblx0XHRcdHMxID0gZmllbGQuZm9ybXVsYS5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIixcIlwiKS5yZXBsYWNlKFwie1wiLFwiXCIpLnJlcGxhY2UoXCJ9XCIsXCJcIilcblx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAyXG5cdFx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKVsyXT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnY2MnXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRtYXJrRG93blRvSHRtbDogKG1hcmtEb3duU3RyaW5nKS0+XG5cdFx0aWYgbWFya0Rvd25TdHJpbmdcblx0XHRcdCMgcmVuZGVyZXIgPSBuZXcgTWFya2Rvd24uUmVuZGVyZXIoKTtcblx0XHRcdCMgcmVuZGVyZXIubGluayA9ICggaHJlZiwgdGl0bGUsIHRleHQgKSAtPlxuXHRcdFx0IyBcdHJldHVybiBcIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScje2hyZWZ9JyB0aXRsZT0nI3t0aXRsZX0nPiN7dGV4dH08L2E+XCJcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJylcblx0XHRcdHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKVxuXG5cdGZfbGFiZWw6ICh0aGF0KS0+XG5cdFx0cmV0dXJuIHRoYXQubmFtZSB8fCB0aGF0LmNvZGVcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuc3RlZWRvc19mb3JtID0gLT5cblx0XHRyZXR1cm4gdGhpcy5mb3JtX3ZlcnNpb25cblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzU2VjdGlvbiA9IChjb2RlKS0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gdGhpcy5mb3JtX3ZlcnNpb25cblx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKS50eXBlID09ICdzZWN0aW9uJ1xuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZG9jX3ZhbHVlcyA9IC0+XG5cdFx0aW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlO1xuXHRcdHJldHVybiBpbnN0YW5jZS52YWx1ZXM7XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5hcHBsaWNhbnRDb250ZXh0ID0gLT5cblx0XHRpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG5cdFx0ZGF0YSA9IHtcblx0XHRcdG5hbWU6ICdpbnNfYXBwbGljYW50Jyxcblx0XHRcdGF0dHM6IHtuYW1lOiAnaW5zX2FwcGxpY2FudCcsIGlkOiAnaW5zX2FwcGxpY2FudCcsIGNsYXNzOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCd9LFxuXHRcdFx0dmFsdWU6IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cdFx0fVxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UgPSAtPlxuXHRcdHJldHVybiB0aGlzLmluc3RhbmNlXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5maWVsZHMgPSAtPlxuXHRcdGZvcm1fdmVyc2lvbiA9IHRoaXMuZm9ybV92ZXJzaW9uXG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZm9ybV90eXBlcyA9IC0+XG5cdFx0cmV0dXJuIFwiZGlzYWJsZWRcIlxuXG5cdFRlbXBsYXRlLnJlZ2lzdGVySGVscGVyIFwiYWZGaWVsZExhYmVsVGV4dFwiLCAob3ApLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cdFx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsIGZvcm1fdmVyc2lvbi5maWVsZHMsIG9wPy5oYXNoPy5uYW1lXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5fdCA9IChrZXkpLT5cblx0XHRsb2NhbGUgPSB0aGlzLmxvY2FsZVxuXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zX2F0dGFjaF9kb3dubG9hZF91cmwgPSAoX2lkLCBhYnNvbHV0ZSktPlxuXHRcdGlmIGFic29sdXRlXG5cdFx0XHRyZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvI3tfaWR9P2Rvd25sb2FkPXRydWVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvI3tfaWR9P2Rvd25sb2FkPXRydWVcIjtcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLm9wdGlvbnMgPSAoZmllbGQpLT5cblx0XHRvcHRpb25zID0gZmllbGQ/Lm9wdGlvbnM/LnNwbGl0KFwiXFxuXCIpXG5cdFx0cmV2ID0gW11cblx0XHRvcHRpb25zPy5mb3JFYWNoIChpdGVtKS0+XG5cdFx0XHRyZXYucHVzaCh7bGFiZWw6IGl0ZW0sIHZhbHVlOiBpdGVtfSlcblxuXHRcdHJldHVybiByZXZcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmdldFBlcm1pc3Npb25zID0gKGNvZGUpLT5cblx0XHRpZiAhVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzPy5pbmNsdWRlcyhjb2RlKVxuXHRcdFx0cmV0dXJuIFwicmVhZG9ubHkgZGlzYWJsZWRcIlxuXHRcdHJldHVybiBcIlwiXG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLmV2ZW50cyA9XG5cdCdjaGFuZ2UgLmZvcm0tY29udHJvbCwuY2hlY2tib3ggaW5wdXQsLmFmLXJhZGlvLWdyb3VwIGlucHV0LC5hZi1jaGVja2JveC1ncm91cCBpbnB1dCc6IChldmVudCktPlxuXHRcdEluc3RhbmNlTWFuYWdlci5pbnN0YW5jZWZvcm1DaGFuZ2VFdmVudChldmVudClcblxuXHQndHlwZWFoZWFkOmNoYW5nZSAuZm9ybS1jb250cm9sJzogKGV2ZW50KSAtPlxuXHRcdEluc3RhbmNlTWFuYWdlci5pbnN0YW5jZWZvcm1DaGFuZ2VFdmVudChldmVudClcblxuXHQnY2xpY2sgLmNmVGV4dGFyZWEgYSc6IChldmVudCktPlxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0U3RlZWRvcy5vcGVuV2luZG93KGV2ZW50LnRhcmdldC5ocmVmKTtcblxuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5vbkNyZWF0ZWQgPSAoKS0+XG5cdGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdGlmICFpbnN0YW5jZVxuXHRcdHJldHVybjtcblxuXHR0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShpbnN0YW5jZSk7XG5cblx0dHJ5XG5cdFx0Y29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cdGNhdGNoIGVcblx0XHRjb25zb2xlLmxvZyBcIkluc3RhbmNlIFRlbXBsYXRlIEVycm9yXCIsIGVcblx0XHRjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoXCJcIiwge2lzQm9keTogdHJ1ZX0pO1xuXG5cblx0cmVuZGVyRnVuY3Rpb24gPSBldmFsKGNvbXBpbGVkKTtcblxuXHRpbnN0YW5jZVZpZXcgPSBuZXcgQmxhemUuVmlldyhcImN1c3RvbV9pbnN0YW5jZV90ZW1wbGF0ZVwiLCByZW5kZXJGdW5jdGlvbik7XG5cblx0aW5zdGFuY2VDdXN0b21UZW1wbGF0ZSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShpbnN0YW5jZVZpZXcubmFtZSwgcmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLmluc3RhbmNlX2N1c3RvbV90ZW1wbGF0ZSA9IGluc3RhbmNlQ3VzdG9tVGVtcGxhdGVcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUuaGVscGVycyBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzXG5cblxuXG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLm9uUmVuZGVyZWQgPSAoKS0+XG5cdCMgdCA9IHRoaXM7XG5cblx0I3Quc3Vic2NyaWJlIFwiaW5zdGFuY2VfZGF0YVwiLCBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIiksIC0+XG5cdCMgICAgVHJhY2tlci5hZnRlckZsdXNoIC0+XG5cdGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdGlmICFpbnN0YW5jZVxuXHRcdHJldHVybjtcblxuXHQjJChcIiNpbnNfYXBwbGljYW50XCIpLnNlbGVjdDIoKS52YWwoaW5zdGFuY2UuYXBwbGljYW50KS50cmlnZ2VyKCdjaGFuZ2UnKTtcblx0IyQoXCIjaW5zX2FwcGxpY2FudFwiKS52YWwoaW5zdGFuY2UuYXBwbGljYW50KTtcblx0SW5zdGFuY2VNYW5hZ2VyLnNldEluc3RhbmNlRm9ybUFwcGxpY2FudChpbnN0YW5jZS5hcHBsaWNhbnQsIGluc3RhbmNlLmFwcGxpY2FudF9uYW1lKVxuXG5cblx0QXBwcm92ZU1hbmFnZXIuZXJyb3IgPSB7bmV4dFN0ZXBzOiAnJywgbmV4dFN0ZXBVc2VyczogJyd9O1xuXG5cdCMgaW5zdGFuY2UgZnJvbee7keWumuS6i+S7tlxuXHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdkcmFmdCdcblx0XHRJbnN0YW5jZUV2ZW50LmluaXRFdmVudHMoaW5zdGFuY2UuZmxvdyk7XG5cblx0aWYgIUFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKVxuXG5cdFx0Y3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcblxuXG5cdFx0aW5zdGFuY2VOdW1iZXJGaWVsZHMgPSAkKFwiW2RhdGEtZm9ybXVsYV1cIiwgJChcIiNpbnN0YW5jZWZvcm1cIikpXG5cblx0XHRpbnN0YW5jZU51bWJlckZpZWxkcy5lYWNoICgpLT5cblx0XHRcdHNjaGVtYUtleSA9IHRoaXMuZGF0YXNldC5zY2hlbWFLZXlcblx0XHRcdGVsZW1lbnQgPSAkKHRoaXMpXG5cdFx0XHRpZiAhJCh0aGlzKS52YWwoKSAmJiBzY2hlbWFLZXkgJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpXG5cdFx0XHRcdE1ldGVvci5jYWxsICdnZXRJbnN0YW5jZVZhbHVlcycsIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSwgKGVycm9yLCByZXN1bHQpLT5cblx0XHRcdFx0XHRpZiBlcnJvclxuXHRcdFx0XHRcdFx0dG9hc3RyLmVycm9yKGVycm9yLnJlYXNvbilcblxuXHRcdFx0XHRcdGlmICFyZXN1bHRbc2NoZW1hS2V5XVxuXHRcdFx0XHRcdFx0a2V5ID0gZWxlbWVudC5kYXRhKFwiZm9ybXVsYVwiKT8ucmVwbGFjZShcImF1dG9fbnVtYmVyKFwiLCBcIlwiKS5yZXBsYWNlKFwiKVwiLCBcIlwiKVxuXG5cdFx0XHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvXFxcIi9nLCBcIlwiKS5yZXBsYWNlKC9cXCcvZywgXCJcIilcblxuXHRcdFx0XHRcdFx0aWYga2V5LmluZGV4T2YoXCJ7XCIpID4gLTFcblx0XHRcdFx0XHRcdFx0a2V5ID0ga2V5LnJlcGxhY2UoXCJ7XCIsXCJcIikucmVwbGFjZShcIn1cIixcIlwiKVxuXHRcdFx0XHRcdFx0XHRrZXkgPSBrZXkudHJpbSgpXG5cdFx0XHRcdFx0XHRcdGtleSA9IEF1dG9Gb3JtLmdldEZpZWxkVmFsdWUoa2V5LCAnaW5zdGFuY2Vmb3JtJylcblx0XHRcdFx0XHRcdEluc3RhbmNlTnVtYmVyUnVsZXMuaW5zdGFuY2VOdW1iZXJCdWlsZGVyIGVsZW1lbnQsIGtleVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGVsZW1lbnQ/LnZhbChyZXN1bHRbc2NoZW1hS2V5XSkudHJpZ2dlcihcImNoYW5nZVwiKVxuXG5cdFx0anVkZ2UgPSBjdXJyZW50QXBwcm92ZS5qdWRnZVxuXHRcdGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblxuXHRcdHVubGVzcyBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVyblxuXG5cdFx0dW5sZXNzIGZvcm1fdmVyc2lvbi5maWVsZHNcblx0XHRcdHJldHVyblxuXG5cdFx0Zm9ybXVsYV9maWVsZHMgPSBGb3JtX2Zvcm11bGEuZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUoXCJGb3JtX2Zvcm11bGEuZmllbGRfdmFsdWVzXCIsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuXHRcdGluc2VydERvYyA9IEF1dG9Gb3JtLmdldEZvcm1WYWx1ZXMoXCJpbnN0YW5jZWZvcm1cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlKVxuXHRcdEZvcm1fZm9ybXVsYS5ydW4oXCJcIiwgXCJcIiwgZm9ybXVsYV9maWVsZHMsIGluc2VydERvYywgZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG5cdFx0I+WcqOatpOWkhOWIneWni+WMlnNlc3Npb24g5Lit55qEIGZvcm1fdmFsdWVzIOWPmOmHj++8jOeUqOS6juinpuWPkeS4i+S4gOatpeatpemqpOiuoeeul1xuXHRcdFNlc3Npb24uc2V0KFwiaW5zdGFuY2VfZm9ybV92YWx1ZXNcIiwge2luc3RhbmNlSWQ6IGluc3RhbmNlLl9pZCwgdmFsdWVzOiBpbnNlcnREb2N9KTtcblxuXG5cbiIsInZhciBtYXJrZWQ7XG5cbm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIik7XG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMgPSB7XG4gIGFwcGxpY2FudENvbnRleHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXRhLCBzdGVlZG9zX2luc3RhbmNlO1xuICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBkYXRhID0ge1xuICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgYXR0czoge1xuICAgICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIGlkOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIFwiY2xhc3NcIjogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnXG4gICAgICB9LFxuICAgICAgdmFsdWU6IHN0ZWVkb3NfaW5zdGFuY2UuYXBwbGljYW50X25hbWVcbiAgICB9O1xuICAgIGlmICghc3RlZWRvc19pbnN0YW5jZSB8fCBzdGVlZG9zX2luc3RhbmNlLnN0YXRlICE9PSBcImRyYWZ0XCIpIHtcbiAgICAgIGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICBpbnN0YW5jZUlkOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ2luc3RhbmNlZm9ybSc7XG4gIH0sXG4gIGZvcm1fdHlwZXM6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KCkpIHtcbiAgICAgIHJldHVybiAnZGlzYWJsZWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ21ldGhvZCc7XG4gICAgfVxuICB9LFxuICBzdGVlZG9zX2Zvcm06IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZm9ybV92ZXJzaW9uO1xuICAgIH1cbiAgfSxcbiAgaW5uZXJzdWJmb3JtQ29udGV4dDogZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGRvY192YWx1ZXM7XG4gICAgZG9jX3ZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgICBvYmpbXCJ0YWJsZVZhbHVlc1wiXSA9IGRvY192YWx1ZXMgPyBkb2NfdmFsdWVzW29iai5jb2RlXSA6IFtdO1xuICAgIG9ialtcImZvcm1JZFwiXSA9IFwiaW5zdGFuY2Vmb3JtXCI7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcbiAgaW5zdGFuY2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGVlZG9zX2luc3RhbmNlO1xuICAgIFNlc3Npb24uZ2V0KFwiY2hhbmdlX2RhdGVcIik7XG4gICAgaWYgKFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSkge1xuICAgICAgc3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgcmV0dXJuIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgfVxuICB9LFxuICBlbXB0eTogZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIHVuZW1wdHk6IGZ1bmN0aW9uKHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBlcXVhbHM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfSxcbiAgdW5lcXVhbHM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gIShhID09PSBiKTtcbiAgfSxcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuICB9LFxuICBpbmNsdWRlOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcbiAgfSxcbiAgZmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcbiAgICB9XG4gIH0sXG4gIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdGlvbnMgPSBKU09OLnBhcnNlKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwiXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdChvcHRpb25zLmZvcm1hdCk7XG4gIH0sXG4gIHRyYWNlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZsb3csIGluc3RhbmNlLCBsb2NhbGUsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgc3RlZWRvc0RhdGEsIHN0ZXBzLCB0cmFjZXM7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgc3RlZWRvc0RhdGEgPSAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLnZpZXcpICE9IG51bGwgPyAocmVmMiA9IHJlZjEudGVtcGxhdGUpICE9IG51bGwgPyByZWYyLnN0ZWVkb3NEYXRhIDogdm9pZCAwIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgaW5zdGFuY2UgPSBzdGVlZG9zRGF0YSAhPSBudWxsID8gc3RlZWRvc0RhdGEuaW5zdGFuY2UgOiB2b2lkIDA7XG4gICAgICBmbG93ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEZsb3dWZXJzaW9uKGluc3RhbmNlKTtcbiAgICAgIGxvY2FsZSA9IHN0ZWVkb3NEYXRhICE9IG51bGwgPyBzdGVlZG9zRGF0YS5sb2NhbGUgOiB2b2lkIDA7XG4gICAgICBpZiAobG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgZmxvdyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZsb3dWZXJzaW9uKCk7XG4gICAgICBsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIWluc3RhbmNlIHx8ICFmbG93KSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHN0ZXBzID0gZmxvdy5zdGVwcztcbiAgICB0cmFjZXMgPSB7fTtcbiAgICBpZiAoKHJlZjMgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwpIHtcbiAgICAgIHJlZjMuZm9yRWFjaChmdW5jdGlvbih0cmFjZSkge1xuICAgICAgICB2YXIgYXBwcm92ZXMsIHJlZjQsIHN0ZXA7XG4gICAgICAgIHN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHRyYWNlLnN0ZXApO1xuICAgICAgICBhcHByb3ZlcyA9IFtdO1xuICAgICAgICBpZiAoKHJlZjQgPSB0cmFjZS5hcHByb3ZlcykgIT0gbnVsbCkge1xuICAgICAgICAgIHJlZjQuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgICB2YXIganVkZ2VfbmFtZTtcbiAgICAgICAgICAgIGlmICh0cmFjZS5pc19maW5pc2hlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ2FwcHJvdmVkJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgYXBwcm92ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVqZWN0ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSB0ZXJtaW5hdGVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICdyZWFzc2lnbmVkJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVhc3NpZ25lZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAncmVsb2NhdGVkJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVsb2NhdGVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcGVuZGluZ1wiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcHByb3Zlcy5wdXNoKHtcbiAgICAgICAgICAgICAgX2lkOiBhcHByb3ZlLl9pZCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogYXBwcm92ZS51c2VyLFxuICAgICAgICAgICAgICBoYW5kbGVyX25hbWU6IGFwcHJvdmUuaGFuZGxlcl9uYW1lLFxuICAgICAgICAgICAgICBoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lOiBhcHByb3ZlLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUsXG4gICAgICAgICAgICAgIGhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lOiBhcHByb3ZlLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lLFxuICAgICAgICAgICAgICBmaW5pc2hfZGF0ZTogYXBwcm92ZS5maW5pc2hfZGF0ZSxcbiAgICAgICAgICAgICAganVkZ2U6IGFwcHJvdmUuanVkZ2UsXG4gICAgICAgICAgICAgIGp1ZGdlX25hbWU6IGp1ZGdlX25hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhcHByb3ZlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBpc19maW5pc2hlZDogYXBwcm92ZS5pc19maW5pc2hlZCxcbiAgICAgICAgICAgICAgdHlwZTogYXBwcm92ZS50eXBlLFxuICAgICAgICAgICAgICBvcGluaW9uX2ZpZWxkc19jb2RlOiBhcHByb3ZlLm9waW5pb25fZmllbGRzX2NvZGUsXG4gICAgICAgICAgICAgIHNpZ25fZmllbGRfY29kZTogYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUsXG4gICAgICAgICAgICAgIGlzX3JlYWQ6IGFwcHJvdmUuaXNfcmVhZCxcbiAgICAgICAgICAgICAgc2lnbl9zaG93OiBhcHByb3ZlLnNpZ25fc2hvd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICBpZiAoc3RlcC5uYW1lIGluIHRyYWNlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlc1tzdGVwLm5hbWVdID0gdHJhY2VzW3N0ZXAubmFtZV0uY29uY2F0KGFwcHJvdmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlc1tzdGVwLm5hbWVdID0gYXBwcm92ZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYWNlcztcbiAgfSxcbiAgZG9jX3ZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgfSxcbiAgaW5zdGFuY2VfYm94X3N0eWxlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm94LCBpbnMsIGp1ZGdlO1xuICAgIGJveCA9IFNlc3Npb24uZ2V0KFwiYm94XCIpO1xuICAgIGlmIChib3ggPT09IFwiaW5ib3hcIiB8fCBib3ggPT09IFwiZHJhZnRcIikge1xuICAgICAganVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpO1xuICAgICAgaWYgKGp1ZGdlKSB7XG4gICAgICAgIGlmIChqdWRnZSA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgICAgfSBlbHNlIGlmIChqdWRnZSA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGlmIChpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uKSB7XG4gICAgICBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdGFibGVfZmllbGRzOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgIHZhciBmaWVsZHMsIGZvcm1fdmVyc2lvbjtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgZmllbGRzID0gXy5jbG9uZShmb3JtX3ZlcnNpb24uZmllbGRzKTtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLCBpbmRleCkge1xuICAgICAgICB2YXIgYWZ0ZXJfZmllbGQsIGJlZm9yZV9maWVsZCwgcHJlX2ZpZWxkcywgcHJlX3dpZGVfZmllbGRzLCB0ZF9jb2xzcGFuLCB0cl9lbmQsIHRyX3N0YXJ0O1xuICAgICAgICBmaWVsZC50cl9zdGFydCA9IFwiXCI7XG4gICAgICAgIGZpZWxkLnRyX2VuZCA9IFwiXCI7XG4gICAgICAgIHRkX2NvbHNwYW4gPSAxO1xuICAgICAgICBpZiAoKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkgPT09IGZpZWxkLmNvZGUpIHtcbiAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQuZm9ybXVsYSAmJiBmaWVsZC50eXBlICE9PSAnb2RhdGEnKSB7XG4gICAgICAgICAgZmllbGQucGVybWlzc2lvbiA9IFwicmVhZG9ubHlcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICBmaWVsZC50ZF9jb2xzcGFuID0gNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGQudGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgZmllbGQudHJfc3RhcnQgPSBcIjx0cj5cIjtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC50cl9lbmQgPSBcIjwvdHI+XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZV9maWVsZHMgPSBmaWVsZHMuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICAgIHByZV93aWRlX2ZpZWxkcyA9IHByZV9maWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc193aWRlXCIsIHRydWUpO1xuICAgICAgICAgIHRyX3N0YXJ0ID0gXCJcIjtcbiAgICAgICAgICB0cl9lbmQgPSBcIlwiO1xuICAgICAgICAgIGJlZm9yZV9maWVsZCA9IG51bGw7XG4gICAgICAgICAgYWZ0ZXJfZmllbGQgPSBudWxsO1xuICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGJlZm9yZV9maWVsZCA9IGZpZWxkc1tpbmRleCAtIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5kZXggPCBmaWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgYWZ0ZXJfZmllbGQgPSBmaWVsZHNbaW5kZXggKyAxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICB0ZF9jb2xzcGFuID0gNDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgIHRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYmVmb3JlX2ZpZWxkICYmIGFmdGVyX2ZpZWxkICYmIGJlZm9yZV9maWVsZC5pc193aWRlICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgZmllbGQuaXNfd2lkZSA9IHRydWU7XG4gICAgICAgICAgICAgIHRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PT0gMCAmJiBhZnRlcl9maWVsZCAmJiBhZnRlcl9maWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICAgIGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICB0ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT09IDAgJiYgYWZ0ZXJfZmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZmllbGQuaXNfd2lkZSA9IHRydWU7XG4gICAgICAgICAgICAgIHRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZC50ZF9jb2xzcGFuID0gdGRfY29sc3BhbjtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRyX3N0YXJ0ID0gXCI8dHI+XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT09IDAgfHwgZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgICAgIHRyX3N0YXJ0ID0gXCI8dHIgY2xhc3MgPSBcXFwidHItY2hpbGQtdGFibGVcXFwiPlwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyX3N0YXJ0ID0gXCI8dHI+XCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQudHJfc3RhcnQgPSB0cl9zdGFydDtcbiAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSBmaWVsZHMubGVuZ3RoIHx8IGZpZWxkLnR5cGUgPT09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09PSAndGFibGUnIHx8IGZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgIHRyX2VuZCA9IFwiPC90cj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgdHJfZW5kID0gXCI8L3RyPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmllbGQudHJfZW5kID0gdHJfZW5kO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICB9LFxuICBzb3J0X2FwcHJvdmU6IGZ1bmN0aW9uKGFwcHJvdmVzLCBvcmRlcikge1xuICAgIGlmICghYXBwcm92ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKCFhcHByb3ZlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcmRlciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIGFwcHJvdmVzLnNvcnQoZnVuY3Rpb24ocDEsIHAyKSB7XG4gICAgICAgICAgdmFyIF9wMSwgX3AyO1xuICAgICAgICAgIF9wMSA9IDA7XG4gICAgICAgICAgX3AyID0gMDtcbiAgICAgICAgICBpZiAocDEuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIF9wMSA9IHAxLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHAyLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICBfcDIgPSBwMi5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfcDIgLSBfcDE7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwcm92ZXMuc29ydChmdW5jdGlvbihwMSwgcDIpIHtcbiAgICAgICAgICB2YXIgX3AxLCBfcDI7XG4gICAgICAgICAgX3AxID0gMDtcbiAgICAgICAgICBfcDIgPSAwO1xuICAgICAgICAgIGlmIChwMS5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocDIuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wMSAtIF9wMjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlcztcbiAgfSxcbiAgX3Q6IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSk7XG4gIH0sXG4gIGdldEZpZWxkOiBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpO1xuICAgIH1cbiAgfSxcbiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uLCBpbnN0YW5jZSwgbG9jYWxlLCB1dGNPZmZzZXQsIHZhbHVlcztcbiAgICBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcbiAgICBmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uO1xuICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgdXRjT2Zmc2V0ID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnV0Y09mZnNldDtcbiAgICB2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge307XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIH1cbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlKHZhbHVlc1tjb2RlXSwgZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKSwgbG9jYWxlLCB1dGNPZmZzZXQpO1xuICB9LFxuICBnZXRMYWJlbDogZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbjtcbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsKGZvcm1fdmVyc2lvbi5maWVsZHMsIGNvZGUpO1xuICB9LFxuICBpc1RleHRhcmVhOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnR5cGUgOiB2b2lkIDApID09PSBcImlucHV0XCIgJiYgKGZpZWxkICE9IG51bGwgPyBmaWVsZC5pc190ZXh0YXJlYSA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgZ2V0Q2ZDbGFzczogZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoKGZpZWxkICE9IG51bGwgPyBmaWVsZC50eXBlIDogdm9pZCAwKSA9PT0gXCJpbnB1dFwiICYmIChmaWVsZCAhPSBudWxsID8gZmllbGQuaXNfdGV4dGFyZWEgOiB2b2lkIDApKSB7XG4gICAgICByZXR1cm4gXCJjZlRleHRhcmVhXCI7XG4gICAgfVxuICB9LFxuICBnZXRUYWJsZVRoZWFkOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGhlYWQoZmllbGQsIGZhbHNlKTtcbiAgfSxcbiAgZ2V0VGFibGVCb2R5OiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHZhciBpbnN0YW5jZSwgdGFibGVWYWx1ZSwgdmFsdWVzO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuICAgICAgdmFsdWVzID0gaW5zdGFuY2UudmFsdWVzIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgfVxuICAgIHRhYmxlVmFsdWUgPSB2YWx1ZXNbZmllbGQuY29kZV07XG4gICAgcmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUYm9keShmaWVsZC5zZmllbGRzLmdldFByb3BlcnR5KFwiY29kZVwiKSwgZmllbGQsIHRhYmxlVmFsdWUsIGZhbHNlKTtcbiAgfSxcbiAgc2hvd0xhYmVsOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHZhciB0ZW1wbGF0ZURhdGE7XG4gICAgdGVtcGxhdGVEYXRhID0gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhO1xuICAgIGlmICh0ZW1wbGF0ZURhdGEubGFiZWwgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBpc09waW5pb25GaWVsZDogZnVuY3Rpb24oZmllbGQpIHtcbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZC5mb3JtdWxhKTtcbiAgfSxcbiAgaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmc6IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgICByZXR1cm4gSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKTtcbiAgfSxcbiAgaW5jbHVkZXNPcGluaW9uRmllbGQ6IGZ1bmN0aW9uKGZvcm0sIGZvcm1fdmVyc2lvbikge1xuICAgIHZhciBmaWVsZF9mb3JtdWxhcywgZmllbGRzLCByZWY7XG4gICAgZmllbGRfZm9ybXVsYXMgPSBuZXcgQXJyYXkoKTtcbiAgICBmaWVsZHMgPSAoKHJlZiA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZvcm1fdmVyc2lvbixcbiAgICAgIGZvcm06IGZvcm1cbiAgICB9KSkgIT0gbnVsbCA/IHJlZi5maWVsZHMgOiB2b2lkIDApIHx8IFtdO1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgIHZhciByZWYxO1xuICAgICAgaWYgKGYudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmICE9IG51bGwgPyAocmVmMSA9IGYuZmllbGRzKSAhPSBudWxsID8gcmVmMS5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkX2Zvcm11bGFzLnB1c2goZjEuZm9ybXVsYSk7XG4gICAgICAgIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkX2Zvcm11bGFzLnB1c2goZi5mb3JtdWxhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gXy5zb21lKGZpZWxkX2Zvcm11bGFzLCBmdW5jdGlvbihmaWVsZF9mb3JtdWxhKSB7XG4gICAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0T3BpbmlvbkZpZWxkU3RlcHNOYW1lOiBmdW5jdGlvbihmaWVsZF9mb3JtdWxhLCB0b3Bfa2V5d29yZHMpIHtcbiAgICB2YXIgZm9vMSwgb3BpbmlvbkZpZWxkcztcbiAgICBvcGluaW9uRmllbGRzID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSkpIHtcbiAgICAgIGlmIChmaWVsZF9mb3JtdWxhKSB7XG4gICAgICAgIGZvbzEgPSBmaWVsZF9mb3JtdWxhLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgZm9vMS5mb3JFYWNoKGZ1bmN0aW9uKGZvbykge1xuICAgICAgICAgIHZhciBqc29uX2Zvcm11bGEsIHJlZiwgcmVmMSwgczEsIHNmO1xuICAgICAgICAgIGpzb25fZm9ybXVsYSA9IHt9O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uX2Zvcm11bGEgPSBldmFsKFwiKFwiICsgZm9vICsgXCIpXCIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAganNvbl9mb3JtdWxhID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqc29uX2Zvcm11bGEgIT0gbnVsbCA/IGpzb25fZm9ybXVsYS55aWppYW5sYW4gOiB2b2lkIDApIHtcbiAgICAgICAgICAgIHNmID0ge307XG4gICAgICAgICAgICBzZi5zdGVwTmFtZSA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uc3RlcDtcbiAgICAgICAgICAgIHNmLmltYWdlX3NpZ24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLmltYWdlX3NpZ24gfHwgZmFsc2U7XG4gICAgICAgICAgICBzZi5vbmx5X2NjX29waW5pb24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLm9ubHlfY2MgfHwgZmFsc2U7XG4gICAgICAgICAgICBzZi5kZWZhdWx0X2Rlc2NyaXB0aW9uID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbltcImRlZmF1bHRcIl07XG4gICAgICAgICAgICBzZi5vbmx5X2hhbmRsZXIgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLm9ubHlfaGFuZGxlcjtcbiAgICAgICAgICAgIHNmLnRvcF9rZXl3b3JkcyA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4udG9wX2tleXdvcmRzIHx8IHRvcF9rZXl3b3JkcztcbiAgICAgICAgICAgIHJldHVybiBvcGluaW9uRmllbGRzLnB1c2goc2YpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZpZWxkX2Zvcm11bGEgIT0gbnVsbCA/IGZpZWxkX2Zvcm11bGEuaW5kZXhPZihcInt0cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8IChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgOiB2b2lkIDApID4gLTEpIHtcbiAgICAgICAgICAgIHNmID0ge1xuICAgICAgICAgICAgICBvbmx5X2NjX29waW5pb246IGZhbHNlLFxuICAgICAgICAgICAgICBpbWFnZV9zaWduOiBmYWxzZSxcbiAgICAgICAgICAgICAgdG9wX2tleXdvcmRzOiB0b3Bfa2V5d29yZHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZm9vLmluZGV4T2YoXCJ7c2lnbmF0dXJlLlwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNmLmltYWdlX3NpZ24gPSB0cnVlO1xuICAgICAgICAgICAgICBmb28gPSBmb28ucmVwbGFjZShcIntzaWduYXR1cmUuXCIsIFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczEgPSBmb28ucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIik7XG4gICAgICAgICAgICBpZiAoczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgc2Yuc3RlcE5hbWUgPSBzMS5zcGxpdChcIi5cIilbMV07XG4gICAgICAgICAgICAgIGlmIChvcGluaW9uRmllbGRzLmZpbHRlclByb3BlcnR5KFwic3RlcE5hbWVcIiwgc2Yuc3RlcE5hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoKHJlZiA9IG9waW5pb25GaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcInN0ZXBOYW1lXCIsIHNmLnN0ZXBOYW1lKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgcmVmLm9ubHlfY2Nfb3BpbmlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgaWYgKCgocmVmMSA9IHMxLnNwbGl0KFwiLlwiKVsyXSkgIT0gbnVsbCA/IHJlZjEudG9Mb2NhbGVMb3dlckNhc2UoKSA6IHZvaWQgMCkgPT09ICdjYycpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Yub25seV9jY19vcGluaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcGluaW9uRmllbGRzLnB1c2goc2YpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcGluaW9uRmllbGRzO1xuICB9LFxuICBzaG93Q0NPcGluaW9uOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHZhciByZWYsIHJlZjEsIHJlZjIsIHMxO1xuICAgIGlmICgoKHJlZiA9IGZpZWxkLmZvcm11bGEpICE9IG51bGwgPyByZWYuaW5kZXhPZihcInt0cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8ICgocmVmMSA9IGZpZWxkLmZvcm11bGEpICE9IG51bGwgPyByZWYxLmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgOiB2b2lkIDApID4gLTEpIHtcbiAgICAgIHMxID0gZmllbGQuZm9ybXVsYS5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIiwgXCJcIikucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIik7XG4gICAgICBpZiAoczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgaWYgKCgocmVmMiA9IHMxLnNwbGl0KFwiLlwiKVsyXSkgIT0gbnVsbCA/IHJlZjIudG9Mb2NhbGVMb3dlckNhc2UoKSA6IHZvaWQgMCkgPT09ICdjYycpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIG1hcmtEb3duVG9IdG1sOiBmdW5jdGlvbihtYXJrRG93blN0cmluZykge1xuICAgIGlmIChtYXJrRG93blN0cmluZykge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICBtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSk7XG4gICAgfVxuICB9LFxuICBmX2xhYmVsOiBmdW5jdGlvbih0aGF0KSB7XG4gICAgcmV0dXJuIHRoYXQubmFtZSB8fCB0aGF0LmNvZGU7XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5zdGVlZG9zX2Zvcm0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtX3ZlcnNpb247XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNTZWN0aW9uID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gdGhpcy5mb3JtX3ZlcnNpb247XG4gICAgcmV0dXJuIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSkudHlwZSA9PT0gJ3NlY3Rpb24nO1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmRvY192YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zdGFuY2U7XG4gICAgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlO1xuICAgIHJldHVybiBpbnN0YW5jZS52YWx1ZXM7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuYXBwbGljYW50Q29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXRhLCBpbnN0YW5jZTtcbiAgICBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG4gICAgcmV0dXJuIGRhdGEgPSB7XG4gICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICBhdHRzOiB7XG4gICAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgaWQ6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgXCJjbGFzc1wiOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCdcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogaW5zdGFuY2UuYXBwbGljYW50X25hbWVcbiAgICB9O1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZmllbGRzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvbjtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuICAgIH1cbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtX3R5cGVzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgfTtcbiAgVGVtcGxhdGUucmVnaXN0ZXJIZWxwZXIoXCJhZkZpZWxkTGFiZWxUZXh0XCIsIGZ1bmN0aW9uKG9wKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbiwgcmVmO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbChmb3JtX3ZlcnNpb24uZmllbGRzLCBvcCAhPSBudWxsID8gKHJlZiA9IG9wLmhhc2gpICE9IG51bGwgPyByZWYubmFtZSA6IHZvaWQgMCA6IHZvaWQgMCk7XG4gIH0pO1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLl90ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpO1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc19hdHRhY2hfZG93bmxvYWRfdXJsID0gZnVuY3Rpb24oX2lkLCBhYnNvbHV0ZSkge1xuICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcIi9hcGkvZmlsZXMvaW5zdGFuY2VzL1wiICsgX2lkICsgXCI/ZG93bmxvYWQ9dHJ1ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXCIgKyBfaWQgKyBcIj9kb3dubG9hZD10cnVlXCI7XG4gICAgfVxuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLm9wdGlvbnMgPSBmdW5jdGlvbihmaWVsZCkge1xuICAgIHZhciBvcHRpb25zLCByZWYsIHJldjtcbiAgICBvcHRpb25zID0gZmllbGQgIT0gbnVsbCA/IChyZWYgPSBmaWVsZC5vcHRpb25zKSAhPSBudWxsID8gcmVmLnNwbGl0KFwiXFxuXCIpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIHJldiA9IFtdO1xuICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiByZXYucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IGl0ZW0sXG4gICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgcmVmO1xuICAgIGlmICghKChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuc3RhcnRTdGVwRWRpdGFibGVGaWVsZHMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoY29kZSkgOiB2b2lkIDApKSB7XG4gICAgICByZXR1cm4gXCJyZWFkb25seSBkaXNhYmxlZFwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfTtcbn1cblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuZXZlbnRzID0ge1xuICAnY2hhbmdlIC5mb3JtLWNvbnRyb2wsLmNoZWNrYm94IGlucHV0LC5hZi1yYWRpby1ncm91cCBpbnB1dCwuYWYtY2hlY2tib3gtZ3JvdXAgaW5wdXQnOiBmdW5jdGlvbihldmVudCkge1xuICAgIHJldHVybiBJbnN0YW5jZU1hbmFnZXIuaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQoZXZlbnQpO1xuICB9LFxuICAndHlwZWFoZWFkOmNoYW5nZSAuZm9ybS1jb250cm9sJzogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICByZXR1cm4gSW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KTtcbiAgfSxcbiAgJ2NsaWNrIC5jZlRleHRhcmVhIGEnOiBmdW5jdGlvbihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuIFN0ZWVkb3Mub3BlbldpbmRvdyhldmVudC50YXJnZXQuaHJlZik7XG4gIH1cbn07XG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLm9uQ3JlYXRlZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29tcGlsZWQsIGUsIGluc3RhbmNlLCBpbnN0YW5jZUN1c3RvbVRlbXBsYXRlLCBpbnN0YW5jZVZpZXcsIHJlbmRlckZ1bmN0aW9uLCB0ZW1wbGF0ZTtcbiAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShpbnN0YW5jZSk7XG4gIHRyeSB7XG4gICAgY29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7XG4gICAgICBpc0JvZHk6IHRydWVcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgZSA9IGVycm9yMTtcbiAgICBjb25zb2xlLmxvZyhcIkluc3RhbmNlIFRlbXBsYXRlIEVycm9yXCIsIGUpO1xuICAgIGNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShcIlwiLCB7XG4gICAgICBpc0JvZHk6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXJGdW5jdGlvbiA9IGV2YWwoY29tcGlsZWQpO1xuICBpbnN0YW5jZVZpZXcgPSBuZXcgQmxhemUuVmlldyhcImN1c3RvbV9pbnN0YW5jZV90ZW1wbGF0ZVwiLCByZW5kZXJGdW5jdGlvbik7XG4gIGluc3RhbmNlQ3VzdG9tVGVtcGxhdGUgPSBuZXcgQmxhemUuVGVtcGxhdGUoaW5zdGFuY2VWaWV3Lm5hbWUsIHJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlID0gaW5zdGFuY2VDdXN0b21UZW1wbGF0ZTtcbiAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlX2N1c3RvbV90ZW1wbGF0ZS5oZWxwZXJzKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25SZW5kZXJlZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY3VycmVudEFwcHJvdmUsIGN1cnJlbnRTdGVwLCBmb3JtX3ZlcnNpb24sIGZvcm11bGFfZmllbGRzLCBpbnNlcnREb2MsIGluc3RhbmNlLCBpbnN0YW5jZU51bWJlckZpZWxkcywganVkZ2U7XG4gIGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgSW5zdGFuY2VNYW5hZ2VyLnNldEluc3RhbmNlRm9ybUFwcGxpY2FudChpbnN0YW5jZS5hcHBsaWNhbnQsIGluc3RhbmNlLmFwcGxpY2FudF9uYW1lKTtcbiAgQXBwcm92ZU1hbmFnZXIuZXJyb3IgPSB7XG4gICAgbmV4dFN0ZXBzOiAnJyxcbiAgICBuZXh0U3RlcFVzZXJzOiAnJ1xuICB9O1xuICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdkcmFmdCcpIHtcbiAgICBJbnN0YW5jZUV2ZW50LmluaXRFdmVudHMoaW5zdGFuY2UuZmxvdyk7XG4gIH1cbiAgaWYgKCFBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KCkpIHtcbiAgICBjdXJyZW50QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuICAgIGluc3RhbmNlTnVtYmVyRmllbGRzID0gJChcIltkYXRhLWZvcm11bGFdXCIsICQoXCIjaW5zdGFuY2Vmb3JtXCIpKTtcbiAgICBpbnN0YW5jZU51bWJlckZpZWxkcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGVsZW1lbnQsIHNjaGVtYUtleTtcbiAgICAgIHNjaGVtYUtleSA9IHRoaXMuZGF0YXNldC5zY2hlbWFLZXk7XG4gICAgICBlbGVtZW50ID0gJCh0aGlzKTtcbiAgICAgIGlmICghJCh0aGlzKS52YWwoKSAmJiBzY2hlbWFLZXkgJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKSB7XG4gICAgICAgIHJldHVybiBNZXRlb3IuY2FsbCgnZ2V0SW5zdGFuY2VWYWx1ZXMnLCBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIiksIGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICB2YXIga2V5LCByZWY7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0b2FzdHIuZXJyb3IoZXJyb3IucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFyZXN1bHRbc2NoZW1hS2V5XSkge1xuICAgICAgICAgICAga2V5ID0gKHJlZiA9IGVsZW1lbnQuZGF0YShcImZvcm11bGFcIikpICE9IG51bGwgPyByZWYucmVwbGFjZShcImF1dG9fbnVtYmVyKFwiLCBcIlwiKS5yZXBsYWNlKFwiKVwiLCBcIlwiKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpLnJlcGxhY2UoL1xcJy9nLCBcIlwiKTtcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihcIntcIikgPiAtMSkge1xuICAgICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIik7XG4gICAgICAgICAgICAgIGtleSA9IGtleS50cmltKCk7XG4gICAgICAgICAgICAgIGtleSA9IEF1dG9Gb3JtLmdldEZpZWxkVmFsdWUoa2V5LCAnaW5zdGFuY2Vmb3JtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSW5zdGFuY2VOdW1iZXJSdWxlcy5pbnN0YW5jZU51bWJlckJ1aWxkZXIoZWxlbWVudCwga2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQudmFsKHJlc3VsdFtzY2hlbWFLZXldKS50cmlnZ2VyKFwiY2hhbmdlXCIpIDogdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAganVkZ2UgPSBjdXJyZW50QXBwcm92ZS5qdWRnZTtcbiAgICBjdXJyZW50U3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKCFmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFmb3JtX3ZlcnNpb24uZmllbGRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvcm11bGFfZmllbGRzID0gRm9ybV9mb3JtdWxhLmdldEZvcm11bGFGaWVsZFZhcmlhYmxlKFwiRm9ybV9mb3JtdWxhLmZpZWxkX3ZhbHVlc1wiLCBmb3JtX3ZlcnNpb24uZmllbGRzKTtcbiAgICBpbnNlcnREb2MgPSBBdXRvRm9ybS5nZXRGb3JtVmFsdWVzKFwiaW5zdGFuY2Vmb3JtXCIsIHZvaWQgMCwgdm9pZCAwLCBmYWxzZSk7XG4gICAgRm9ybV9mb3JtdWxhLnJ1bihcIlwiLCBcIlwiLCBmb3JtdWxhX2ZpZWxkcywgaW5zZXJ0RG9jLCBmb3JtX3ZlcnNpb24uZmllbGRzKTtcbiAgICByZXR1cm4gU2Vzc2lvbi5zZXQoXCJpbnN0YW5jZV9mb3JtX3ZhbHVlc1wiLCB7XG4gICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZS5faWQsXG4gICAgICB2YWx1ZXM6IGluc2VydERvY1xuICAgIH0pO1xuICB9XG59O1xuIiwiSW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycyA9IHtcblxuXHRzaG93TWFpblRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS53b3JrZmxvd01haW5BdHRhY2hUaXRsZS5nZXQoKTtcblx0fSxcblx0aXNDbGllbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBNZXRlb3IuaXNDbGllbnRcblx0fSxcblx0ZW5hYmxlZF9hZGRfbWFpbl9hdHRhY2htZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIChTZXNzaW9uICYmIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSlcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiZHJhZnRcIiAmJiBTZXNzaW9uLmdldChcImJveFwiKSAhPSBcImluYm94XCIpIHtcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblxuXHRcdC8vIOW3sue7j+e7k+adn+eahOWNleWtkOS4jeiDveaUuemZhOS7tlxuXHRcdGlmIChpbnMuc3RhdGUgPT0gXCJjb21wbGV0ZWRcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXG5cdFx0aWYgKCFjdXJyZW50X3N0ZXApXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBjY+eahOWNleWtkO+8jOWPquacieWcqOW9k+WJjeatpemqpOaJjeiDveS/ruaUuemZhOS7tlxuXHRcdHZhciBhcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG5cdFx0aWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09IFwiY2NcIikge1xuXHRcdFx0dmFyIGN1cnJlbnRUcmFjZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50VHJhY2UoKTtcblx0XHRcdGlmKGN1cnJlbnRUcmFjZSAmJiBjdXJyZW50VHJhY2UuX2lkICE9IGFwcHJvdmUudHJhY2Upe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8g5YiG5Y+R55qE5q2j5paH5oiW6ICF6ZmE5Lu25LiN5pi+56S66L2s5Li6cGRm5oyJ6ZKuXG5cdFx0Ly8g5aaC5p6c5pyJ5q2j5paH5p2D6ZmQ5YiZ5Li65q2j5paH77yM5ZCm5YiZ5YiG5Y+R5Li66ZmE5Lu2XG5cdFx0Ly8g5YiG5Y+R55qE6ZmE5Lu25LiN5YWB6K645L+u5pS5IOWIoOmZpCDmlrDlop7niYjmnKxcblx0XHR2YXIgbWFpbl9hdHRhY2hfY291bnQgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzogaW5zLl9pZCxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdH0pLmNvdW50KCk7XG5cblx0XHR2YXIgZGlzdHJpYnV0ZV9tYWluX2F0dGFjaF9jb3VudCA9IDA7XG5cblx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuXHRcdFx0dmFyIHN0YXJ0X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0U3RhcnRTdGVwKCk7XG5cdFx0XHRpZiAoc3RhcnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCkge1xuXHRcdFx0XHR2YXIgZGlzdHJpYnV0ZV9tYWluX2F0dGFjaF9jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzogaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSxcblx0XHRcdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0XHRcdH0pLmNvdW50KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlICYmIG1haW5fYXR0YWNoX2NvdW50IDwgMSAmJiBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50IDwgMSkge1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHR9XG5cblx0XHQvLyDmraPmlofmnIDlpJrlj6rog73mnInkuIDkuKpcblx0XHRpZiAobWFpbl9hdHRhY2hfY291bnQgPj0gMSB8fCBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50ID49IDEpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyDlvIDlp4voioLngrnlubbkuJTorr7nva7kuoblj6/ku6XkuIrkvKDmraPmlofmiY3mmL7npLrkuIrkvKDmraPmlofnmoTmjInpkq5cblx0XHR2YXIgY3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cdFx0aWYgKGN1cnJlbnRfc3RlcCAmJiBjdXJyZW50X3N0ZXAuc3RlcF90eXBlID09IFwic3RhcnRcIiAmJiBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggPT0gdHJ1ZSlcblx0XHRcdHJldHVybiB0cnVlXG5cblx0XHRyZXR1cm4gZmFsc2Vcblx0fSxcblxuXHRlbmFibGVkX2VkaXRfbm9ybWFsX2F0dGFjaG1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24gJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHR2YXIgZmxvdyA9IFdvcmtmbG93TWFuYWdlci5nZXRGbG93KGlucy5mbG93KTtcblx0XHRpZiAoIWZsb3cpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXG5cdFx0Ly8g5YiG5Y+R5ZCO55qEIOmZhOS7tu+8jOS4jeWPr+S7pee8lui+kS/liKDpmaTvvIzkuZ/kuI3orqnkuIrkvKDmlrDnmoTpmYTku7YsIOa1geeoi+WIl+ihqO+8mua3u+WKoOWxnuaApyDigJjooqvliIblj5HlkI7mmK/lkKblhYHorrjkuIrkvKDpmYTku7bigJkgIzE4Mzdcblx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSAmJiAhZmxvdy51cGxvYWRfYWZ0ZXJfYmVpbmdfZGlzdHJpYnV0ZWQpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIChTZXNzaW9uLmdldChcImJveFwiKSAhPSBcImRyYWZ0XCIgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gXCJpbmJveFwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHQvLyDlt7Lnu4/nu5PmnZ/nmoTljZXlrZDkuI3og73mlLnpmYTku7Zcblx0XHRpZiAoaW5zLnN0YXRlID09IFwiY29tcGxldGVkXCIpIHtcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblxuXHRcdC8vIGNj55qE5Y2V5a2Q77yM5Y+q5pyJ5Zyo5b2T5YmN5q2l6aqk5omN6IO95L+u5pS56ZmE5Lu2XG5cdFx0dmFyIGFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcblx0XHRpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT0gXCJjY1wiKSB7XG5cdFx0XHR2YXIgY3VycmVudFRyYWNlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRUcmFjZSgpO1xuXHRcdFx0aWYoY3VycmVudFRyYWNlICYmIGN1cnJlbnRUcmFjZS5faWQgIT0gYXBwcm92ZS50cmFjZSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoSW5zdGFuY2VNYW5hZ2VyLmlzQ0MoaW5zKSkge1xuXHRcdFx0dmFyIHN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q0NTdGVwKCk7XG5cdFx0XHRpZiAoc3RlcCAmJiAoc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHRydWUgfHwgc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHVuZGVmaW5lZCkpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRcdGlmIChjdXJyZW50X3N0ZXAgJiYgKGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHRydWUgfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdW5kZWZpbmVkKSlcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2Vcblx0fSxcblxuXHRtYWluX2F0dGFjaG1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0dmFyIHN0YXJ0X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0U3RhcnRTdGVwKCk7XG5cblx0XHQvLyDlpoLmnpzmmK/ooqvliIblj5HnmoTnlLPor7fljZXlubbkuJTmnInkv67mlLnmraPmlofnmoTmnYPpmZDvvIzliJnkvJjlhYjmmL7npLrljp/nlLPor7fljZXmlofku7Zcblx0XHR2YXIgbWFpbl9hdHRhY2ggPSBudWxsO1xuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlICYmIHN0YXJ0X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggPT0gdHJ1ZSkge1xuXHRcdFx0bWFpbl9hdHRhY2ggPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoe1xuXHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlLFxuXHRcdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKCFtYWluX2F0dGFjaCkge1xuXHRcdFx0bWFpbl9hdHRhY2ggPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoe1xuXHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuX2lkLFxuXHRcdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1haW5fYXR0YWNoO1xuXHR9LFxuXG5cdG5vcm1hbF9hdHRhY2htZW50czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHR2YXIgc2VsZWN0b3IgPSB7XG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHQnbWV0YWRhdGEubWFpbic6IHtcblx0XHRcdFx0JG5lOiB0cnVlXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR2YXIgYXR0cyA9IG5ldyBBcnJheSgpO1xuXG5cdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UpIHtcblx0XHRcdC8vIOWmguaenOaYr+iiq+WIhuWPkeeahOeUs+ivt+WNle+8jOWImeaYvuekuuWOn+eUs+ivt+WNleaWh+S7tiwg5aaC5p6c6YCJ5oup5LqG5bCG5Y6f6KGo5Y2V5a2Y5YKo5Li66ZmE5Lu25Lmf6KaB5pi+56S6LCDlkIzml7bkuZ/opoHmmL7npLrmlrDkuIrkvKDnmoTpmYTku7Zcblx0XHRcdHZhciBkZmlzID0gXy5jbG9uZShpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG5cdFx0XHRkZmlzLnB1c2goaW5zLl9pZCk7XG5cdFx0XHRzZWxlY3RvclsnbWV0YWRhdGEuaW5zdGFuY2UnXSA9IHtcblx0XHRcdFx0JGluOiBkZmlzXG5cdFx0XHR9O1xuXG5cblx0XHRcdHNlbGVjdG9yW1wiJG9yXCJdID0gW3tcblx0XHRcdFx0XCJtZXRhZGF0YS5pbnN0YW5jZVwiOiBpbnMuX2lkXG5cdFx0XHR9LCB7XG5cdFx0XHRcdFwibWV0YWRhdGEuaW5zdGFuY2VcIjoge1xuXHRcdFx0XHRcdCRpbjogaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXNcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJtZXRhZGF0YS5pc19wcml2YXRlXCI6IHtcblx0XHRcdFx0XHQkbmU6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fV1cblxuXHRcdFx0Ly8g5aaC5p6c5Y6f55Sz6K+35Y2V5pyJ5q2j5paH5L2G5piv5YiG5Y+R5ZCO5rKh5pyJ5q2j5paH5p2D6ZmQ77yM5YiZ5Y6f55Sz6K+35Y2V5q2j5paH5pi+56S65Zyo6ZmE5Lu25qCPXG5cdFx0XHR2YXIgc3RhcnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRTdGFydFN0ZXAoKTtcblx0XHRcdGlmIChzdGFydF9zdGVwICYmIHN0YXJ0X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggIT0gdHJ1ZSkge1xuXHRcdFx0XHR2YXIgZGlzdHJpYnV0ZV9tYWluID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKHtcblx0XHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdFx0XHQkaW46IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGRpc3RyaWJ1dGVfbWFpbikge1xuXHRcdFx0XHRcdHZhciBmaXJzdFZlcnNpb25NYWluID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKGRpc3RyaWJ1dGVfbWFpbi5tZXRhZGF0YS5wYXJlbnQpO1xuXHRcdFx0XHRcdGRpc3RyaWJ1dGVfbWFpbi5hdHRhY2htZW50VXBsb2FkZWRBdCA9IGZpcnN0VmVyc2lvbk1haW4gPyBmaXJzdFZlcnNpb25NYWluLnVwbG9hZGVkQXQgOiBkaXN0cmlidXRlX21haW4udXBsb2FkZWRBdDtcblx0XHRcdFx0XHRhdHRzLnB1c2goZGlzdHJpYnV0ZV9tYWluKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxlY3RvclsnbWV0YWRhdGEuaW5zdGFuY2UnXSA9IGlucy5faWQ7XG5cdFx0fVxuXG5cdFx0Y2ZzLmluc3RhbmNlcy5maW5kKHNlbGVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcblx0XHRcdHZhciBmaXJzdFZlcnNpb24gPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoYy5tZXRhZGF0YS5wYXJlbnQpO1xuXHRcdFx0Yy5hdHRhY2htZW50VXBsb2FkZWRBdCA9IGZpcnN0VmVyc2lvbiA/IGZpcnN0VmVyc2lvbi51cGxvYWRlZEF0IDogYy51cGxvYWRlZEF0O1xuXHRcdFx0YXR0cy5wdXNoKGMpO1xuXHRcdH0pXG5cblx0XHRyZXR1cm4gXy5zb3J0QnkoYXR0cywgJ2F0dGFjaG1lbnRVcGxvYWRlZEF0Jyk7XG5cdH0sXG5cblx0c2hvd0F0dGFjaG1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyDlpoLmnpzmmK/ooqvliIblj5HnmoTnlLPor7fljZXvvIzliJnmmL7npLrljp/nlLPor7fljZXmlofku7Yg5ZKM5YiG5Y+R5ZCO55Sz6K+35Y2V5paH5Lu2XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jbG9uZShpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG5cdFx0aW5zdGFuY2VJZHMucHVzaChpbnMuX2lkKTtcblx0XHR2YXIgYXR0YWNobWVudHNfY291bnQgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlXG5cdFx0fSkuY291bnQoKTtcblxuXHRcdGlmIChTZXNzaW9uICYmIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSAmJiBhdHRhY2htZW50c19jb3VudCA8IDEpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PSBcImRyYWZ0XCIgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gXCJpbmJveFwiIHx8IGF0dGFjaG1lbnRzX2NvdW50ID4gMClcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHRfdDogZnVuY3Rpb24oa2V5KSB7XG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXHR9LFxuXG5cdF86IGZ1bmN0aW9uKGtleSkge1xuXHRcdHZhciBsb2NhbGU7XG5cdFx0aWYgKE1ldGVvci5pc0NsaWVudCkge1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG5cdFx0fVxuXHR9LFxuXG5cdGZsb3dfZmlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY2ZzLmZpbGVzLmZpbmQoeyAnbWV0YWRhdGEuc3BhY2UnOiBpbnMuc3BhY2UsICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBpbnMuZmxvdyB9KTtcblx0fSxcblxuXHRpc0RyYWZ0QW5kRmxvd2ZpbGVzRXhpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gKFNlc3Npb24uZ2V0KCdib3gnKSA9PSAnZHJhZnQnKSAmJiAhIWNmcy5maWxlcy5maW5kKHsgJ21ldGFkYXRhLnNwYWNlJzogaW5zLnNwYWNlLCAnbWV0YWRhdGEub2JqZWN0X25hbWUnOiAnZmxvd3MnLCAnbWV0YWRhdGEucmVjb3JkX2lkJzogaW5zLmZsb3cgfSkuY291bnQoKTtcblx0fVxuXG5cbn1cblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLl90ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSlcblx0fVxuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLmVuYWJsZWRfYWRkX21haW5fYXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9O1xuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLmVuYWJsZWRfZWRpdF9ub3JtYWxfYXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9O1xuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMubWFpbl9hdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY29tcGFjdChbaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlLCBpbnN0YW5jZS5faWRdKTtcblx0XHR2YXIgYXR0YWNobWVudCA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHR9KTtcblxuXHRcdHJldHVybiBhdHRhY2htZW50O1xuXHR9O1xuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMubm9ybWFsX2F0dGFjaG1lbnRzID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHN0ZWVkb3NEYXRhID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhXG5cdFx0dmFyIGluc3RhbmNlID0gc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jbG9uZShpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRpbnN0YW5jZUlkcy5wdXNoKGluc3RhbmNlLl9pZCk7XG5cdFx0dmFyIGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzoge1xuXHRcdFx0XHQkbmU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQkb3I6IFt7XG5cdFx0XHRcdCdtZXRhZGF0YS5pc19wcml2YXRlJzoge1xuXHRcdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9LCB7XG5cdFx0XHRcdCdtZXRhZGF0YS5pc19wcml2YXRlJzogdHJ1ZSxcblx0XHRcdFx0XCJtZXRhZGF0YS5vd25lclwiOiBzdGVlZG9zRGF0YS5zZXNzaW9uVXNlcklkIHx8IHN0ZWVkb3NEYXRhLnVzZXJJZCB8fCAnLTEnIC8vIOmYsuatouaVsOaNruW8guW4uOaXtizmmL7npLrkuobnp4HmnInpmYTku7Zcblx0XHRcdH1dXG5cdFx0fSkuZmV0Y2goKTtcblxuXHRcdHJldHVybiBhdHRhY2htZW50cztcblx0fTtcblxuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLnNob3dBdHRhY2htZW50cyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNsb25lKGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuXHRcdGluc3RhbmNlSWRzLnB1c2goaW5zdGFuY2UuX2lkKTtcblxuXHRcdHZhciBhdHRhY2htZW50cyA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWVcblx0XHR9KS5mZXRjaCgpO1xuXG5cdFx0aWYgKGF0dGFjaG1lbnRzICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLnNob3dNYWluVGl0bGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jb21wYWN0KFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsIGluc3RhbmNlLl9pZF0pO1xuXHRcdHZhciBtYWluX2F0dGFjaF9jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHR9KS5jb3VudCgpO1xuXG5cdFx0cmV0dXJuIG1haW5fYXR0YWNoX2NvdW50ID4gMFxuXHR9XG59XG4iLCJtYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpXG5JbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMgPVxuXHRzaG93OiAoc3RlcE5hbWUpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIFNlc3Npb24uZ2V0KCdpbnN0YW5jZVByaW50Jylcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0XHRpZiBJbnN0YW5jZU1hbmFnZXIuaXNJbmJveCgpXG5cdFx0XHRcdG15QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpXG5cdFx0XHRcdGlmIG15QXBwcm92ZVxuXHRcdFx0XHRcdGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0bXlUcmFjZSA9IGluc3RhbmNlPy50cmFjZXM/LmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgbXlBcHByb3ZlLnRyYWNlKVxuXHRcdFx0XHRcdHJldHVybiBteVRyYWNlPy5uYW1lID09IHN0ZXBOYW1lXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0ZGVmYXVsdERlc2NyaXB0aW9uOiAoKS0+XG4jXHRcdHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvbiB8fCBUQVBpMThuLl9fKFwiaW5zdGFuY2VfZGVmYXVsdF9vcGluaW9uXCIpXG5cdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uXG5cblx0dHJhY2VzOiAoKS0+XG5cdFx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKVxuXG5cdHRyYWNlOiAoc3RlcE5hbWUsIG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbiwgdG9wX2tleXdvcmRzKS0+XG5cdFx0aW5zdGFuY2UgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc3RhbmNlKClcblxuXHRcdGlzX2NvbXBsZXRlZCA9IGluc3RhbmNlPy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiXG5cblx0XHRjb21wbGV0ZWRfZGF0ZSA9IGlmIGlzX2NvbXBsZXRlZCB0aGVuIF8ubGFzdChpbnN0YW5jZS50cmFjZXMpPy5maW5pc2hfZGF0ZT8uZ2V0VGltZSgpIGVsc2UgMFxuXG5cdFx0aWYgaXNfY29tcGxldGVkICYmIGluc3RhbmNlLmZpbmlzaF9kYXRlXG5cdFx0XHRjb21wbGV0ZWRfZGF0ZSA9IGluc3RhbmNlLmZpbmlzaF9kYXRlPy5nZXRUaW1lKClcblxuXHRcdHRyYWNlcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKClcblxuXHRcdGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbc3RlcE5hbWVdKVxuXG5cdFx0YXBwcm92ZV9zb3J0ID0gKGFwcHJvdmVzLCB0b3Bfa2V5d29yZHMpLT5cblxuI+WvuUFwcHJvdmVz5o6S5bqP77yMIOaMieeFp+aPkOS6pOaXtumXtOaOkuWAkuW6j++8jOWmguaenOayoeacieaPkOS6pOWImeaYvuekuuWcqOacgOS4iui+uVxuXHRcdFx0YXBwcm92ZXNfc29ydGVkID0gXy5zb3J0QnkgYXBwcm92ZXMsIChhcHByb3ZlKS0+XG5cdFx0XHRcdHJldHVybiAtKGFwcHJvdmUuZmluaXNoX2RhdGUgfHwgbmV3IERhdGUoKSkuZ2V0VGltZSgpXG5cblx0XHRcdCPpgJrov4flhbPplK7lrZfmjpLluo9cblx0XHRcdGlmIHRvcF9rZXl3b3Jkc1xuXHRcdFx0XHR0b3BfYXBwcm92ZXMgPSBuZXcgQXJyYXkoKVxuXG5cdFx0XHRcdHRvcF9rZXl3b3Jkcy5zcGxpdChcIixcIikuZm9yRWFjaCAoa2V5KSAtPlxuXHRcdFx0XHRcdHRvcF9hcHByb3ZlcyA9IF8udW5pb24gdG9wX2FwcHJvdmVzLCBfLmZpbHRlcihhcHByb3Zlc19zb3J0ZWQsIChhcHByb3ZlKS0+XG5cdFx0XHRcdFx0XHRyZXR1cm4gYXBwcm92ZT8uaGFuZGxlcl9uYW1lPy5pbmRleE9mKGtleSkgPiAtMVxuXHRcdFx0XHRcdClcblx0XHRcdFx0IyDlr7nnva7pobbmhI/op4HmjInnhaflpITnkIbkuovku7bmjpLlgJLluo9cblx0XHRcdFx0dG9wX2FwcHJvdmVzID0gXy5zb3J0QnkgdG9wX2FwcHJvdmVzLCAodG9wX2FwcHJvdmUpLT5cblx0XHRcdFx0XHRyZXR1cm4gLSh0b3BfYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKClcblxuXHRcdFx0XHRhcHByb3Zlc19zb3J0ZWQgPSBfLnVuaW9uIHRvcF9hcHByb3ZlcywgYXBwcm92ZXNfc29ydGVkXG5cdFx0XHRyZXR1cm4gYXBwcm92ZXNfc29ydGVkIHx8IFtdXG5cblx0XHRhcHByb3ZlcyA9IF8uZmlsdGVyIGFwcHJvdmVzLCAoYSktPlxuXHRcdFx0cmV0dXJuIGEudHlwZSBpc250IFwiZm9yd2FyZFwiIGFuZCBhLnR5cGUgaXNudCBcImRpc3RyaWJ1dGVcIiBhbmQgYS50eXBlIGlzbnQgXCJ0ZXJtaW5hdGVkXCJcblxuXHRcdGlmIG9ubHlfY2Nfb3BpbmlvblxuXHRcdFx0YXBwcm92ZXMgPSBhcHByb3Zlcz8uZmlsdGVyUHJvcGVydHkoXCJ0eXBlXCIsIFwiY2NcIilcblxuXHRcdGFwcHJvdmVzX3NvcnRlZCA9IGFwcHJvdmVfc29ydChhcHByb3ZlcywgdG9wX2tleXdvcmRzKVxuXG5cdFx0YXBwcm92ZXNHcm91cCA9IF8uZ3JvdXBCeShhcHByb3ZlcywgXCJoYW5kbGVyXCIpO1xuXG5cdFx0aGFzTmV4dCA9IChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAtPlxuXHRcdFx0aGFuZGxlckFwcHJvdmVzID0gYXBwcm92ZXNHcm91cFthcHByb3ZlLmhhbmRsZXJdXG5cdFx0XHRyZXR1cm4gXy5pbmRleE9mKGhhbmRsZXJBcHByb3ZlcywgYXBwcm92ZSkgKyAxIDwgaGFuZGxlckFwcHJvdmVzLmxlbmd0aFxuXG5cdFx0aGF2ZURlc2NyaXB0aW9uQXBwcm92ZSA9IChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAtPlxuXHRcdFx0aGFuZGxlckFwcHJvdmVzID0gYXBwcm92ZXNHcm91cFthcHByb3ZlLmhhbmRsZXJdXG5cblx0XHRcdGRlc2NyaXB0aW9uQXBwcm92ZXMgPSBfLmZpbHRlciBoYW5kbGVyQXBwcm92ZXMsIChhKS0+XG5cdFx0XHRcdGlmIGEuZGVzY3JpcHRpb25cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0aWYgZGVzY3JpcHRpb25BcHByb3Zlcy5sZW5ndGggPT0gMFxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0cmV0dXJuIHRydWVcblxuXG5cdFx0YXBwcm92ZXNfc29ydGVkLmZvckVhY2ggKGFwcHJvdmUpIC0+XG4jXHRcdFx05pyJ6L6T5YWl5oSP6KeBIOaIliDmnIDmlrDkuIDmnaHlubbkuJTnlKjmiLfmsqHmnInovpPlhaXov4fmhI/op4FcbiNcdFx0XHRpZiAhYXBwcm92ZS5pc19maW5pc2hlZCB8fCBhcHByb3ZlLmRlc2NyaXB0aW9uIHx8ICghaGFzTmV4dChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAmJiAhaGF2ZURlc2NyaXB0aW9uQXBwcm92ZShhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSlcbiNcdFx0XHRpZiAhaGFzTmV4dChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKVxuXHRcdFx0aWYgYXBwcm92ZS5zaWduX3Nob3cgIT0gZmFsc2UgJiYgKGFwcHJvdmUuZGVzY3JpcHRpb24gfHwgKCFhcHByb3ZlLmRlc2NyaXB0aW9uICYmICFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApICYmICFhcHByb3ZlLmlzX2ZpbmlzaGVkKSB8fCBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndvcmtmbG93Py5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb24pXG5cdFx0XHRcdGlmIGFwcHJvdmUuanVkZ2UgaXNudCAndGVybWluYXRlZCdcblx0XHRcdFx0XHRhcHByb3ZlLl9kaXNwbGF5ID0gdHJ1ZVxuXG5cdFx0YXBwcm92ZXNfc29ydGVkID0gXy5maWx0ZXIgYXBwcm92ZXNfc29ydGVkLCAoYSkgLT5cblx0XHRcdGlmIGlzX2NvbXBsZXRlZFxuXHRcdFx0XHRyZXR1cm4gYS5fZGlzcGxheSA9PSB0cnVlICYmIGEuaXNfZmluaXNoZWQgJiYgYS5maW5pc2hfZGF0ZT8uZ2V0VGltZSgpIDw9IGNvbXBsZXRlZF9kYXRlXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBhLl9kaXNwbGF5ID09IHRydWVcblx0XHRyZXR1cm4gYXBwcm92ZXNfc29ydGVkXG5cblx0aW5jbHVkZTogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5jbHVkZShhLCBiKVxuXG5cdHVuZW1wdHk6ICh2YWwpLT5cblx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy51bmVtcHR5KHZhbCkgfHwgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdz8uc2hvd0JsYW5rQXBwcm92ZURlc2NyaXB0aW9uXG5cblx0Zm9ybWF0RGF0ZTogKGRhdGUsIG9wdGlvbnMpLT5cblx0XHRpZiAhb3B0aW9uc1xuXHRcdFx0b3B0aW9ucyA9IHtcImZvcm1hdFwiOiBcIllZWVktTU0tRERcIn1cblxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucylcblxuXHRpc015QXBwcm92ZTogKGFwcHJvdmUsIG9ubHlfY2Nfb3BpbmlvbikgLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9ICdpbmJveCdcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cblx0XHRcdGN1cnJlbnRBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKClcblxuXHRcdFx0aWYgIWFwcHJvdmU/Ll9pZFxuXHRcdFx0XHRhcHByb3ZlID0gY3VycmVudEFwcHJvdmVcblxuXHRcdFx0aWYgYXBwcm92ZS5faWQgPT0gY3VycmVudEFwcHJvdmU/Ll9pZCAmJiBjdXJyZW50QXBwcm92ZT8udHlwZSA9PSAnY2MnICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lXG5cdFx0XHRcdGlmIF8uaW5kZXhPZihjdXJyZW50QXBwcm92ZT8ub3Bpbmlvbl9maWVsZHNfY29kZSwgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUpID4gLTFcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcdGlmICEoY3VycmVudEFwcHJvdmU/LnR5cGUgPT0gJ2NjJykgJiYgb25seV9jY19vcGluaW9uXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRpZiBjdXJyZW50QXBwcm92ZSAmJiBhcHByb3ZlLl9pZCA9PSBjdXJyZW50QXBwcm92ZS5faWRcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRteUFwcHJvdmVEZXNjcmlwdGlvbjogKGFwcHJvdmVJZCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRteUFwcHJvdmUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5teUFwcHJvdmU/LmdldCgpXG5cdFx0XHRcdGlmIG15QXBwcm92ZSAmJiBteUFwcHJvdmUuaWQgPT0gYXBwcm92ZUlkXG5cdFx0XHRcdFx0aWYgIW15QXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgfHwgbXlBcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5kYXRhPy5uYW1lXG5cdFx0XHRcdFx0XHRpZiAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdHJldHVybiBteUFwcHJvdmU/LmRlc2NyaXB0aW9uIHx8IFwiXCJcblx0XHRcdFx0XHRcdHJldHVybiBTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblxuXHRub3c6ICgpLT5cblx0XHRyZXR1cm4gbmV3IERhdGUoKTtcblxuXHRpc1JlYWRPbmx5OiAoKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRyZXR1cm4gQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0aXNPcGluaW9uT2ZGaWVsZDogKGFwcHJvdmUpLT5cblx0XHRpZiBhcHByb3ZlLnR5cGUgPT0gXCJjY1wiICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lXG5cdFx0XHRpZiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSA9PSBhcHByb3ZlLnNpZ25fZmllbGRfY29kZVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRtYXJrRG93blRvSHRtbDogKG1hcmtEb3duU3RyaW5nKS0+XG5cdFx0aWYgbWFya0Rvd25TdHJpbmdcblx0XHRcdCMgcmVuZGVyZXIgPSBuZXcgTWFya2Rvd24uUmVuZGVyZXIoKTtcblx0XHRcdCMgcmVuZGVyZXIubGluayA9IChocmVmLCB0aXRsZSwgdGV4dCkgLT5cblx0XHRcdCMgXHRyZXR1cm4gXCI8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nI3tocmVmfScgdGl0bGU9JyN7dGl0bGV9Jz4je3RleHR9PC9hPlwiXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0bWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpXG5cdFx0XHRyZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSlcblxuXHRzdGVwczogKGZpZWxkX2Zvcm11bGEsIHN0ZXAsIG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbiktPlxuXHRcdHN0ZXBzID0gW11cblx0XHRpZiAhc3RlcFxuXHRcdFx0aWYgIWZpZWxkX2Zvcm11bGFcblx0XHRcdFx0ZmllbGRfZm9ybXVsYSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk/LmZpZWxkcz8uZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgdGhpcy5uYW1lKS5mb3JtdWxhXG5cdFx0XHRzdGVwcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZ2V0T3BpbmlvbkZpZWxkU3RlcHNOYW1lKGZpZWxkX2Zvcm11bGEsIFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGEudG9wX2tleXdvcmRzKVxuXHRcdGVsc2Vcblx0XHRcdHN0ZXBzID0gW3tzdGVwTmFtZTogc3RlcCwgb25seV9jY19vcGluaW9uOiBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ246IGltYWdlX3NpZ259XVxuXHRcdHJldHVybiBzdGVwc1xuXG5cdGltYWdlU2lnbkRhdGE6IChoYW5kbGVyKSAtPlxuXHRcdHJldHVybiB7dXNlcjogaGFuZGxlcn1cblxuXHRzaG93U2lnbkltYWdlOiAoaGFuZGxlciwgaW1hZ2Vfc2lnbiwganVkZ2UpIC0+XG5cdFx0aWYgWydyZXR1cm5lZCcsICd0ZXJtaW5hdGVkJywgJ3JldHJpZXZlZCddLmluY2x1ZGVzKGp1ZGdlKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0c3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24oaGFuZGxlcilcblxuXHRcdGlmIHNwYWNlVXNlclNpZ24/LnNpZ24gJiYgaW1hZ2Vfc2lnblxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRnZXRMYXN0U2lnbkFwcHJvdmU6ICgpLT5cblx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdHJldHVybiBfLmxhc3QoVHJhY2VzTWFuYWdlci5nZXRIYW5kbGVyU2lnblNob3dBcHByb3ZlcyBpbnMsIE1ldGVvci51c2VySWQoKSlcblxuXG5cdGxhc3RNeUFwcHJvdmVEZXNjcmlwdGlvbjogKCktPlxuXHRcdHRyYWNlcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKClcblx0XHRjdXJyZW50U3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXHRcdGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbY3VycmVudFN0ZXAubmFtZV0pXG5cblx0XHRhcHByb3ZlcyA9IGFwcHJvdmVzLmZpbHRlclByb3BlcnR5KFwiaGFuZGxlclwiLCBNZXRlb3IudXNlcklkKCkpXG5cblx0XHRpZiBhcHByb3Zlcy5sZW5ndGggPiAxXG5cdFx0XHRyZXR1cm4gYXBwcm92ZXNbYXBwcm92ZXMubGVuZ3RoIC0gMl0/LmRlc2NyaXB0aW9uXG5cblx0XHRyZXR1cm4gXCJcIjtcblxuXHRzaG93QXBwcm92ZTogKGFwcHJvdmUpLT5cblx0XHRpZiAhYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgfHwgYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgPT0gVGVtcGxhdGUuaW5zdGFuY2UoKT8uZGF0YT8ubmFtZVxuXHRcdFx0aWYgYXBwcm92ZT8uaXNfcmVhZFxuXHRcdFx0XHRpZiBhcHByb3ZlLmlzX2ZpbmlzaGVkXG5cdFx0XHRcdFx0cmV0dXJuIFtcImFwcHJvdmVkXCIsIFwicmVqZWN0ZWRcIiwgXCJzdWJtaXR0ZWRcIiwgXCJyZWFkZWRcIl0uaW5jbHVkZXMoYXBwcm92ZS5qdWRnZSlcblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0anVkZ2VfZGVzY3JpcHRpb246IChqdWRnZSktPlxuXHRcdHJldHVybiB0KGp1ZGdlICsgXCJfZGVzY3JpcHRpb25cIilcblxuXHRpc19hcHByb3ZlZDogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIFwiYXBwcm92ZWRcIiA9PSBqdWRnZVxuXG5cdGlzX3JlamVjdGVkOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4gXCJyZWplY3RlZFwiID09IGp1ZGdlXG5cblx0aXNfcmVhZGVkOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhqdWRnZSlcblxuXHRhZGRDbGFzczogKCktPlxuXHRcdG5hbWUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5kYXRhPy5uYW1lXG5cdFx0c2V0VGltZW91dCAoKSAtPlxuXHRcdFx0dHJ5XG5cdFx0XHRcdGVsZW1lbnQgPSAkKFwiLmF1dG9tYXRpYy5vcGluaW9uLWZpZWxkLVwiICsgbmFtZSlcblx0XHRcdFx0aWYgZWxlbWVudC5sZW5ndGggPiAwXG5cdFx0XHRcdFx0aWYgZWxlbWVudD8uaXMoXCJ0ZFwiKVxuXHRcdFx0XHRcdFx0ZWxlbWVudC5hZGRDbGFzcygnZmllbGQtZWRpdGFibGUnKVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdCQoXCIuaW5zdGFuY2Utc2lnblwiLCBlbGVtZW50KS5hZGRDbGFzcygnZmllbGQtZWRpdGFibGUnKVxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRjb25zb2xlLmxvZyBlXG5cdFx0LCAxXG5cdFx0cmV0dXJuICcnXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRJbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMuZGVmYXVsdERlc2NyaXB0aW9uID0gLT5cblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uIHx8IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9kZWZhdWx0X29waW5pb25cIiwge30sIGxvY2FsZSkiLCJ2YXIgbWFya2VkO1xuXG5tYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpO1xuXG5JbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMgPSB7XG4gIHNob3c6IGZ1bmN0aW9uKHN0ZXBOYW1lKSB7XG4gICAgdmFyIGluc3RhbmNlLCBteUFwcHJvdmUsIG15VHJhY2UsIHJlZjtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoJ2luc3RhbmNlUHJpbnQnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoSW5zdGFuY2VNYW5hZ2VyLmlzSW5ib3goKSkge1xuICAgICAgICBteUFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcbiAgICAgICAgaWYgKG15QXBwcm92ZSkge1xuICAgICAgICAgIGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgbXlUcmFjZSA9IGluc3RhbmNlICE9IG51bGwgPyAocmVmID0gaW5zdGFuY2UudHJhY2VzKSAhPSBudWxsID8gcmVmLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgbXlBcHByb3ZlLnRyYWNlKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4gKG15VHJhY2UgIT0gbnVsbCA/IG15VHJhY2UubmFtZSA6IHZvaWQgMCkgPT09IHN0ZXBOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVmYXVsdERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb247XG4gIH0sXG4gIHRyYWNlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKCk7XG4gIH0sXG4gIHRyYWNlOiBmdW5jdGlvbihzdGVwTmFtZSwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduLCB0b3Bfa2V5d29yZHMpIHtcbiAgICB2YXIgYXBwcm92ZV9zb3J0LCBhcHByb3ZlcywgYXBwcm92ZXNHcm91cCwgYXBwcm92ZXNfc29ydGVkLCBjb21wbGV0ZWRfZGF0ZSwgaGFzTmV4dCwgaGF2ZURlc2NyaXB0aW9uQXBwcm92ZSwgaW5zdGFuY2UsIGlzX2NvbXBsZXRlZCwgcmVmLCByZWYxLCByZWYyLCB0cmFjZXM7XG4gICAgaW5zdGFuY2UgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc3RhbmNlKCk7XG4gICAgaXNfY29tcGxldGVkID0gKGluc3RhbmNlICE9IG51bGwgPyBpbnN0YW5jZS5zdGF0ZSA6IHZvaWQgMCkgPT09IFwiY29tcGxldGVkXCI7XG4gICAgY29tcGxldGVkX2RhdGUgPSBpc19jb21wbGV0ZWQgPyAocmVmID0gXy5sYXN0KGluc3RhbmNlLnRyYWNlcykpICE9IG51bGwgPyAocmVmMSA9IHJlZi5maW5pc2hfZGF0ZSkgIT0gbnVsbCA/IHJlZjEuZ2V0VGltZSgpIDogdm9pZCAwIDogdm9pZCAwIDogMDtcbiAgICBpZiAoaXNfY29tcGxldGVkICYmIGluc3RhbmNlLmZpbmlzaF9kYXRlKSB7XG4gICAgICBjb21wbGV0ZWRfZGF0ZSA9IChyZWYyID0gaW5zdGFuY2UuZmluaXNoX2RhdGUpICE9IG51bGwgPyByZWYyLmdldFRpbWUoKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgdHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKTtcbiAgICBhcHByb3ZlcyA9IF8uY2xvbmUodHJhY2VzW3N0ZXBOYW1lXSk7XG4gICAgYXBwcm92ZV9zb3J0ID0gZnVuY3Rpb24oYXBwcm92ZXMsIHRvcF9rZXl3b3Jkcykge1xuICAgICAgdmFyIGFwcHJvdmVzX3NvcnRlZCwgdG9wX2FwcHJvdmVzO1xuICAgICAgYXBwcm92ZXNfc29ydGVkID0gXy5zb3J0QnkoYXBwcm92ZXMsIGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgcmV0dXJuIC0oYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0b3Bfa2V5d29yZHMpIHtcbiAgICAgICAgdG9wX2FwcHJvdmVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHRvcF9rZXl3b3Jkcy5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICByZXR1cm4gdG9wX2FwcHJvdmVzID0gXy51bmlvbih0b3BfYXBwcm92ZXMsIF8uZmlsdGVyKGFwcHJvdmVzX3NvcnRlZCwgZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgICAgdmFyIHJlZjM7XG4gICAgICAgICAgICByZXR1cm4gKGFwcHJvdmUgIT0gbnVsbCA/IChyZWYzID0gYXBwcm92ZS5oYW5kbGVyX25hbWUpICE9IG51bGwgPyByZWYzLmluZGV4T2Yoa2V5KSA6IHZvaWQgMCA6IHZvaWQgMCkgPiAtMTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0b3BfYXBwcm92ZXMgPSBfLnNvcnRCeSh0b3BfYXBwcm92ZXMsIGZ1bmN0aW9uKHRvcF9hcHByb3ZlKSB7XG4gICAgICAgICAgcmV0dXJuIC0odG9wX2FwcHJvdmUuZmluaXNoX2RhdGUgfHwgbmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXBwcm92ZXNfc29ydGVkID0gXy51bmlvbih0b3BfYXBwcm92ZXMsIGFwcHJvdmVzX3NvcnRlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXBwcm92ZXNfc29ydGVkIHx8IFtdO1xuICAgIH07XG4gICAgYXBwcm92ZXMgPSBfLmZpbHRlcihhcHByb3ZlcywgZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIGEudHlwZSAhPT0gXCJmb3J3YXJkXCIgJiYgYS50eXBlICE9PSBcImRpc3RyaWJ1dGVcIiAmJiBhLnR5cGUgIT09IFwidGVybWluYXRlZFwiO1xuICAgIH0pO1xuICAgIGlmIChvbmx5X2NjX29waW5pb24pIHtcbiAgICAgIGFwcHJvdmVzID0gYXBwcm92ZXMgIT0gbnVsbCA/IGFwcHJvdmVzLmZpbHRlclByb3BlcnR5KFwidHlwZVwiLCBcImNjXCIpIDogdm9pZCAwO1xuICAgIH1cbiAgICBhcHByb3Zlc19zb3J0ZWQgPSBhcHByb3ZlX3NvcnQoYXBwcm92ZXMsIHRvcF9rZXl3b3Jkcyk7XG4gICAgYXBwcm92ZXNHcm91cCA9IF8uZ3JvdXBCeShhcHByb3ZlcywgXCJoYW5kbGVyXCIpO1xuICAgIGhhc05leHQgPSBmdW5jdGlvbihhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSB7XG4gICAgICB2YXIgaGFuZGxlckFwcHJvdmVzO1xuICAgICAgaGFuZGxlckFwcHJvdmVzID0gYXBwcm92ZXNHcm91cFthcHByb3ZlLmhhbmRsZXJdO1xuICAgICAgcmV0dXJuIF8uaW5kZXhPZihoYW5kbGVyQXBwcm92ZXMsIGFwcHJvdmUpICsgMSA8IGhhbmRsZXJBcHByb3Zlcy5sZW5ndGg7XG4gICAgfTtcbiAgICBoYXZlRGVzY3JpcHRpb25BcHByb3ZlID0gZnVuY3Rpb24oYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkge1xuICAgICAgdmFyIGRlc2NyaXB0aW9uQXBwcm92ZXMsIGhhbmRsZXJBcHByb3ZlcztcbiAgICAgIGhhbmRsZXJBcHByb3ZlcyA9IGFwcHJvdmVzR3JvdXBbYXBwcm92ZS5oYW5kbGVyXTtcbiAgICAgIGRlc2NyaXB0aW9uQXBwcm92ZXMgPSBfLmZpbHRlcihoYW5kbGVyQXBwcm92ZXMsIGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgaWYgKGEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGlmIChkZXNjcmlwdGlvbkFwcHJvdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGFwcHJvdmVzX3NvcnRlZC5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgIHZhciByZWYzO1xuICAgICAgaWYgKGFwcHJvdmUuc2lnbl9zaG93ICE9PSBmYWxzZSAmJiAoYXBwcm92ZS5kZXNjcmlwdGlvbiB8fCAoIWFwcHJvdmUuZGVzY3JpcHRpb24gJiYgIWhhc05leHQoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgJiYgIWFwcHJvdmUuaXNfZmluaXNoZWQpIHx8ICgocmVmMyA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53b3JrZmxvdykgIT0gbnVsbCA/IHJlZjMuc2hvd0JsYW5rQXBwcm92ZURlc2NyaXB0aW9uIDogdm9pZCAwKSkpIHtcbiAgICAgICAgaWYgKGFwcHJvdmUuanVkZ2UgIT09ICd0ZXJtaW5hdGVkJykge1xuICAgICAgICAgIHJldHVybiBhcHByb3ZlLl9kaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGFwcHJvdmVzX3NvcnRlZCA9IF8uZmlsdGVyKGFwcHJvdmVzX3NvcnRlZCwgZnVuY3Rpb24oYSkge1xuICAgICAgdmFyIHJlZjM7XG4gICAgICBpZiAoaXNfY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBhLl9kaXNwbGF5ID09PSB0cnVlICYmIGEuaXNfZmluaXNoZWQgJiYgKChyZWYzID0gYS5maW5pc2hfZGF0ZSkgIT0gbnVsbCA/IHJlZjMuZ2V0VGltZSgpIDogdm9pZCAwKSA8PSBjb21wbGV0ZWRfZGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhLl9kaXNwbGF5ID09PSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhcHByb3Zlc19zb3J0ZWQ7XG4gIH0sXG4gIGluY2x1ZGU6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlKGEsIGIpO1xuICB9LFxuICB1bmVtcHR5OiBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgcmVmO1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnVuZW1wdHkodmFsKSB8fCAoKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53b3JrZmxvdykgIT0gbnVsbCA/IHJlZi5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb24gOiB2b2lkIDApO1xuICB9LFxuICBmb3JtYXREYXRlOiBmdW5jdGlvbihkYXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBcImZvcm1hdFwiOiBcIllZWVktTU0tRERcIlxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZm9ybWF0RGF0ZShkYXRlLCBvcHRpb25zKTtcbiAgfSxcbiAgaXNNeUFwcHJvdmU6IGZ1bmN0aW9uKGFwcHJvdmUsIG9ubHlfY2Nfb3Bpbmlvbikge1xuICAgIHZhciBjdXJyZW50QXBwcm92ZSwgaW5zO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSAhPT0gJ2luYm94Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGN1cnJlbnRBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG4gICAgICBpZiAoIShhcHByb3ZlICE9IG51bGwgPyBhcHByb3ZlLl9pZCA6IHZvaWQgMCkpIHtcbiAgICAgICAgYXBwcm92ZSA9IGN1cnJlbnRBcHByb3ZlO1xuICAgICAgfVxuICAgICAgaWYgKGFwcHJvdmUuX2lkID09PSAoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLl9pZCA6IHZvaWQgMCkgJiYgKGN1cnJlbnRBcHByb3ZlICE9IG51bGwgPyBjdXJyZW50QXBwcm92ZS50eXBlIDogdm9pZCAwKSA9PT0gJ2NjJyAmJiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSkge1xuICAgICAgICBpZiAoXy5pbmRleE9mKGN1cnJlbnRBcHByb3ZlICE9IG51bGwgPyBjdXJyZW50QXBwcm92ZS5vcGluaW9uX2ZpZWxkc19jb2RlIDogdm9pZCAwLCBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSkgPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCEoKGN1cnJlbnRBcHByb3ZlICE9IG51bGwgPyBjdXJyZW50QXBwcm92ZS50eXBlIDogdm9pZCAwKSA9PT0gJ2NjJykgJiYgb25seV9jY19vcGluaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50QXBwcm92ZSAmJiBhcHByb3ZlLl9pZCA9PT0gY3VycmVudEFwcHJvdmUuX2lkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIG15QXBwcm92ZURlc2NyaXB0aW9uOiBmdW5jdGlvbihhcHByb3ZlSWQpIHtcbiAgICB2YXIgbXlBcHByb3ZlLCByZWYsIHJlZjEsIHJlZjIsIHJlZjM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgIG15QXBwcm92ZSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYubXlBcHByb3ZlKSAhPSBudWxsID8gcmVmMS5nZXQoKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKG15QXBwcm92ZSAmJiBteUFwcHJvdmUuaWQgPT09IGFwcHJvdmVJZCkge1xuICAgICAgICAgIGlmICghbXlBcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlID09PSAoKHJlZjIgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjMgPSByZWYyLmRhdGEpICE9IG51bGwgPyByZWYzLm5hbWUgOiB2b2lkIDAgOiB2b2lkIDApKSB7XG4gICAgICAgICAgICBpZiAoIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gKG15QXBwcm92ZSAhPSBudWxsID8gbXlBcHByb3ZlLmRlc2NyaXB0aW9uIDogdm9pZCAwKSB8fCBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gIH0sXG4gIGlzUmVhZE9ubHk6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHJldHVybiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaXNPcGluaW9uT2ZGaWVsZDogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIGlmIChhcHByb3ZlLnR5cGUgPT09IFwiY2NcIiAmJiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSkge1xuICAgICAgaWYgKFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lID09PSBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICBtYXJrRG93blRvSHRtbDogZnVuY3Rpb24obWFya0Rvd25TdHJpbmcpIHtcbiAgICBpZiAobWFya0Rvd25TdHJpbmcpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgbWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpO1xuICAgIH1cbiAgfSxcbiAgc3RlcHM6IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEsIHN0ZXAsIG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbikge1xuICAgIHZhciByZWYsIHJlZjEsIHJlZjIsIHN0ZXBzO1xuICAgIHN0ZXBzID0gW107XG4gICAgaWYgKCFzdGVwKSB7XG4gICAgICBpZiAoIWZpZWxkX2Zvcm11bGEpIHtcbiAgICAgICAgZmllbGRfZm9ybXVsYSA9IChyZWYgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZmllbGRzKSAhPSBudWxsID8gcmVmMS5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCB0aGlzLm5hbWUpLmZvcm11bGEgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBzdGVwcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZ2V0T3BpbmlvbkZpZWxkU3RlcHNOYW1lKGZpZWxkX2Zvcm11bGEsIChyZWYyID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IHJlZjIuZGF0YS50b3Bfa2V5d29yZHMgOiB2b2lkIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLFxuICAgICAgICAgIG9ubHlfY2Nfb3Bpbmlvbjogb25seV9jY19vcGluaW9uLFxuICAgICAgICAgIGltYWdlX3NpZ246IGltYWdlX3NpZ25cbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9LFxuICBpbWFnZVNpZ25EYXRhOiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXI6IGhhbmRsZXJcbiAgICB9O1xuICB9LFxuICBzaG93U2lnbkltYWdlOiBmdW5jdGlvbihoYW5kbGVyLCBpbWFnZV9zaWduLCBqdWRnZSkge1xuICAgIHZhciBzcGFjZVVzZXJTaWduO1xuICAgIGlmIChbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKGhhbmRsZXIpO1xuICAgIGlmICgoc3BhY2VVc2VyU2lnbiAhPSBudWxsID8gc3BhY2VVc2VyU2lnbi5zaWduIDogdm9pZCAwKSAmJiBpbWFnZV9zaWduKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgZ2V0TGFzdFNpZ25BcHByb3ZlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHJldHVybiBfLmxhc3QoVHJhY2VzTWFuYWdlci5nZXRIYW5kbGVyU2lnblNob3dBcHByb3ZlcyhpbnMsIE1ldGVvci51c2VySWQoKSkpO1xuICB9LFxuICBsYXN0TXlBcHByb3ZlRGVzY3JpcHRpb246IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcHByb3ZlcywgY3VycmVudFN0ZXAsIHJlZiwgdHJhY2VzO1xuICAgIHRyYWNlcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKCk7XG4gICAgY3VycmVudFN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcbiAgICBhcHByb3ZlcyA9IF8uY2xvbmUodHJhY2VzW2N1cnJlbnRTdGVwLm5hbWVdKTtcbiAgICBhcHByb3ZlcyA9IGFwcHJvdmVzLmZpbHRlclByb3BlcnR5KFwiaGFuZGxlclwiLCBNZXRlb3IudXNlcklkKCkpO1xuICAgIGlmIChhcHByb3Zlcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gKHJlZiA9IGFwcHJvdmVzW2FwcHJvdmVzLmxlbmd0aCAtIDJdKSAhPSBudWxsID8gcmVmLmRlc2NyaXB0aW9uIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSxcbiAgc2hvd0FwcHJvdmU6IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICB2YXIgcmVmLCByZWYxO1xuICAgIGlmICghYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgfHwgYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgPT09ICgocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmRhdGEpICE9IG51bGwgPyByZWYxLm5hbWUgOiB2b2lkIDAgOiB2b2lkIDApKSB7XG4gICAgICBpZiAoYXBwcm92ZSAhPSBudWxsID8gYXBwcm92ZS5pc19yZWFkIDogdm9pZCAwKSB7XG4gICAgICAgIGlmIChhcHByb3ZlLmlzX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgcmV0dXJuIFtcImFwcHJvdmVkXCIsIFwicmVqZWN0ZWRcIiwgXCJzdWJtaXR0ZWRcIiwgXCJyZWFkZWRcIl0uaW5jbHVkZXMoYXBwcm92ZS5qdWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBqdWRnZV9kZXNjcmlwdGlvbjogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4gdChqdWRnZSArIFwiX2Rlc2NyaXB0aW9uXCIpO1xuICB9LFxuICBpc19hcHByb3ZlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4gXCJhcHByb3ZlZFwiID09PSBqdWRnZTtcbiAgfSxcbiAgaXNfcmVqZWN0ZWQ6IGZ1bmN0aW9uKGp1ZGdlKSB7XG4gICAgcmV0dXJuIFwicmVqZWN0ZWRcIiA9PT0ganVkZ2U7XG4gIH0sXG4gIGlzX3JlYWRlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhqdWRnZSk7XG4gIH0sXG4gIGFkZENsYXNzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbmFtZSwgcmVmLCByZWYxO1xuICAgIG5hbWUgPSAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmRhdGEpICE9IG51bGwgPyByZWYxLm5hbWUgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlLCBlbGVtZW50O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZWxlbWVudCA9ICQoXCIuYXV0b21hdGljLm9waW5pb24tZmllbGQtXCIgKyBuYW1lKTtcbiAgICAgICAgaWYgKGVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50LmlzKFwidGRcIikgOiB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJChcIi5pbnN0YW5jZS1zaWduXCIsIGVsZW1lbnQpLmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coZSk7XG4gICAgICB9XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIEluc3RhbmNlU2lnblRleHQuaGVscGVycy5kZWZhdWx0RGVzY3JpcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uIHx8IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9kZWZhdWx0X29waW5pb25cIiwge30sIGxvY2FsZSk7XG4gIH07XG59XG4iLCJtYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpXG5UcmFjZXNUZW1wbGF0ZS5oZWxwZXJzID1cblx0dHJhY2VTaG93U2lnbkltYWdlOiAoKS0+XG5cdFx0cmV0dXJuIE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud29ya2Zsb3cudHJhY2VTaG93U2lnbkltYWdlICE9IGZhbHNlICYmIE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud29ya2Zsb3cudHJhY2VTaG93U2lnbkltYWdlICE9ICdmYWxzZSdcblx0ZXF1YWxzOiAoYSwgYikgLT5cblx0XHRhID09IGJcblx0ZW1wdHk6IChhKSAtPlxuXHRcdGlmIGFcblx0XHRcdGEudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoIDwgMVxuXHRcdGVsc2Vcblx0XHRcdHRydWVcblx0dW5lbXB0eTogKGEpIC0+XG5cdFx0aWYgYVxuXHRcdFx0YS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwXG5cdFx0ZWxzZVxuXHRcdFx0ZmFsc2VcblxuXHRhcHBlbmQ6IChhLCBiKSAtPlxuXHRcdGEgKyBiXG5cblx0ZGF0ZUZvcm1hdDogKGRhdGUpIC0+XG5cdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKCkgJiYgZGF0ZT8uZ2V0RnVsbFllYXIoKSA9PSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKClcblx0XHRcdFx0cmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ01NLUREIEhIOm1tJyk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cblx0Z2V0U3RlcE5hbWU6IChzdGVwSWQpIC0+XG5cdFx0c3RlcCA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZVN0ZXAoc3RlcElkKVxuXHRcdGlmIHN0ZXBcblx0XHRcdHJldHVybiBzdGVwLm5hbWVcblx0XHRudWxsXG5cdHNob3dEZWxldGVCdXR0b246IChhcHByb3ZlZCkgLT5cblx0XHRpZiBhcHByb3ZlZCBhbmQgYXBwcm92ZWQudHlwZSA9PSAnY2MnIGFuZCBhcHByb3ZlZC5mcm9tX3VzZXIgPT0gTWV0ZW9yLnVzZXJJZCgpIGFuZCBhcHByb3ZlZC5pc19maW5pc2hlZCAhPSB0cnVlIGFuZCAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdGlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbjogKGFwcHJvdmVkKSAtPlxuXHRcdGFwcHJvdmVfYWRtaW5zID0gTWV0ZW9yLnNldHRpbmdzPy5wdWJsaWM/LndvcmtmbG93Py5hcHByb3ZlX2FkbWluc1xuXHRcdGlmIGFwcHJvdmVfYWRtaW5zPy5sZW5ndGhcblx0XHRcdGlzU2hvdyA9IGFwcHJvdmVfYWRtaW5zPy5jb250YWlucyBNZXRlb3IudXNlcklkKClcblx0XHR1bmxlc3MgaXNTaG93XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRyZXR1cm4gYXBwcm92ZWQuaGFuZGxlciA9PSBNZXRlb3IudXNlcklkKClcblx0aXNFZGl0aW5nOiAoKSAtPlxuXHRcdCByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5pc19lZGl0aW5nPy5nZXQoKVxuXHRpc1Nob3dEZXNjcmlwdGlvbjogKGFwcHJvdmVkKS0+XG5cdFx0IyBkZWJ1Z2dlclxuXHRcdGlmIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuaXNTaG93TW9kaWZpY2F0aW9uQnV0dG9uIGFwcHJvdmVkXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBhcHByb3ZlZC5kZXNjcmlwdGlvbj8udG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMFxuXHRpc0NDOiAoYXBwcm92ZWQpIC0+XG5cdFx0aWYgYXBwcm92ZWQgYW5kIGFwcHJvdmVkLnR5cGUgPT0gJ2NjJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRnZXRBcHByb3ZlU3RhdHVzSWNvbjogKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkgLT5cblx0XHRpZiBhdXRvU3VibWl0dGVkID09IHRydWVcblx0XHRcdHJldHVybiAnaW9uIGlvbi1hbmRyb2lkLWFsYXJtLWNsb2NrJ1xuXHRcdCPlt7Lnu5PmnZ/nmoTmmL7npLrkuLrmoLjlh4Yv6amz5ZueL+WPlua2iOeUs+ivt++8jOW5tuaYvuekuuWkhOeQhueKtuaAgeWbvuagh1xuXHRcdGFwcHJvdmVTdGF0dXNJY29uID0gdW5kZWZpbmVkXG5cdFx0c3dpdGNoIGFwcHJvdmVKdWRnZVxuXHRcdFx0d2hlbiAnYXBwcm92ZWQnXG5cdFx0XHRcdCMg5bey5qC45YeGXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tY2hlY2ttYXJrLXJvdW5kJ1xuXHRcdFx0d2hlbiAncmVqZWN0ZWQnXG5cdFx0XHRcdCMg5bey6amz5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tY2xvc2Utcm91bmQnXG5cdFx0XHR3aGVuICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHQjIOW3suWPlua2iFxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdmYSBmYS1iYW4nXG5cdFx0XHR3aGVuICdyZWFzc2lnbmVkJ1xuXHRcdFx0XHQjIOi9rOetvuaguFxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFuZHJvaWQtY29udGFjdCdcblx0XHRcdHdoZW4gJ3JlbG9jYXRlZCdcblx0XHRcdFx0IyDph43lrprkvY1cblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1hcnJvdy1zaHJpbmsnXG5cdFx0XHR3aGVuICdyZXRyaWV2ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLXVuZG8nXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJydcblx0XHRcdFx0YnJlYWtcblx0XHRhcHByb3ZlU3RhdHVzSWNvblxuXHRnZXRBcHByb3ZlU3RhdHVzVGV4dDogKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkgLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXHRcdCPlt7Lnu5PmnZ/nmoTmmL7npLrkuLrmoLjlh4Yv6amz5ZueL+WPlua2iOeUs+ivt++8jOW5tuaYvuekuuWkhOeQhueKtuaAgeWbvuagh1xuXHRcdGlmIGF1dG9TdWJtaXR0ZWQgPT0gdHJ1ZVxuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfdGltZW91dF9hdXRvX3N1Ym1pdHRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0YXBwcm92ZVN0YXR1c1RleHQgPSB1bmRlZmluZWRcblx0XHRzd2l0Y2ggYXBwcm92ZUp1ZGdlXG5cdFx0XHR3aGVuICdhcHByb3ZlZCdcblx0XHRcdFx0IyDlt7LmoLjlh4Zcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZWplY3RlZCdcblx0XHRcdFx0IyDlt7LpqbPlm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWplY3RlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHQjIOW3suWPlua2iFxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHRlcm1pbmF0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmVhc3NpZ25lZCdcblx0XHRcdFx0IyDovaznrb7moLhcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlbG9jYXRlZCdcblx0XHRcdFx0IyDph43lrprkvY1cblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWxvY2F0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmV0cmlldmVkJ1xuXHRcdFx0XHQjIOW3suWPluWbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHJpZXZlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZXR1cm5lZCdcblx0XHRcdFx0IyDlt7LpgIDlm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZXR1cm5lZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZWFkZWQnXG5cdFx0XHRcdCMg5bey6ZiFXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVhZGVkJywge30sIGxvY2FsZSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSAnJ1xuXHRcdFx0XHRicmVha1xuXHRcdGFwcHJvdmVTdGF0dXNUZXh0XG5cdFxuXHRnZXRBcHByb3ZlSnVkZ2VDbGFzczogKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkgLT5cblx0XHRpZiBhdXRvU3VibWl0dGVkID09IHRydWVcblx0XHRcdHJldHVybiAnYXV0b1N1Ym1pdHRlZCdcblx0XHRyZXR1cm4gYXBwcm92ZUp1ZGdlXG5cblx0X3Q6IChrZXkpLT5cblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpXG5cblx0bXlBcHByb3ZlRGVzY3JpcHRpb246IChhcHByb3ZlSWQpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0bXlBcHByb3ZlID0gVGVtcGxhdGUuaW5zdGFuY2UoKT8ubXlBcHByb3ZlPy5nZXQoKVxuXHRcdFx0XHRpZiBteUFwcHJvdmUgJiYgbXlBcHByb3ZlLmlkID09IGFwcHJvdmVJZFxuXHRcdFx0XHRcdGlmICFTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblx0XHRcdFx0XHRcdHJldHVybiBteUFwcHJvdmU/LmRlc2NyaXB0aW9uIHx8IFwiXCJcblx0XHRcdFx0XHRyZXR1cm4gU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpXG5cdGlzRm9yd2FyZDogKGFwcHJvdmVkKSAtPlxuXHRcdGlmIGFwcHJvdmVkIGFuZCBhcHByb3ZlZC50eXBlID09ICdmb3J3YXJkJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRzaG93Rm9yd2FyZERlbGV0ZUJ1dHRvbjogKGFwcHJvdmUpIC0+XG5cdFx0aWYgZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpIGlzIDBcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmIGFwcHJvdmUgYW5kIGFwcHJvdmUudHlwZSA9PSAnZm9yd2FyZCcgYW5kIGFwcHJvdmUuZnJvbV91c2VyID09IE1ldGVvci51c2VySWQoKSBhbmQgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSBhbmQgYXBwcm92ZS5qdWRnZSBpc250ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRtYXJrRG93blRvSHRtbDogKG1hcmtEb3duU3RyaW5nKS0+XG5cdFx0aWYgbWFya0Rvd25TdHJpbmdcblx0XHRcdCMgcmVuZGVyZXIgPSBuZXcgTWFya2Rvd24uUmVuZGVyZXIoKTtcblx0XHRcdCMgcmVuZGVyZXIubGluayA9ICggaHJlZiwgdGl0bGUsIHRleHQgKSAtPlxuXHRcdFx0IyBcdHJldHVybiBcIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScje2hyZWZ9JyB0aXRsZT0nI3t0aXRsZX0nPiN7dGV4dH08L2E+XCJcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJylcblx0XHRcdHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKVxuXHRpc0Rpc3RyaWJ1dGU6IChhcHByb3ZlKSAtPlxuXHRcdGlmIGFwcHJvdmUgYW5kIGFwcHJvdmUudHlwZSA9PSAnZGlzdHJpYnV0ZSdcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0c2hvd0Rpc3RyaWJ1dGVEZWxldGVCdXR0b246IChhcHByb3ZlKSAtPlxuXHRcdGlmIGRiLmluc3RhbmNlcy5maW5kKGFwcHJvdmUuZm9yd2FyZF9pbnN0YW5jZSkuY291bnQoKSBpcyAwXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIGFwcHJvdmUgYW5kIGFwcHJvdmUudHlwZSA9PSAnZGlzdHJpYnV0ZScgYW5kICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgYW5kIGFwcHJvdmUuanVkZ2UgaXNudCAndGVybWluYXRlZCdcblx0XHRcdCMg5rWB56iL566h55CG5ZGY5ZKM57O757uf566h55CG5ZGY77yM5Y+v5Lul5omn6KGM5Lu75L2V5oOF5Ya15LiL55qE5paH5Lu25Y+W5raI5YiG5Y+RXG5cdFx0XHRpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBhcHByb3ZlLmluc3RhbmNlfSwge2ZpZWxkczoge2Zsb3c6IDEsIHNwYWNlOiAxfX0pXG5cdFx0XHRpZiBpbnMgYW5kIGlucy5mbG93IGFuZCBpbnMuc3BhY2Vcblx0XHRcdFx0aWYgV29ya2Zsb3dNYW5hZ2VyLmhhc0Zsb3dBZG1pblBlcm1pc3Npb24oaW5zLmZsb3csIGlucy5zcGFjZSwgTWV0ZW9yLnVzZXJJZCgpKVxuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cblx0XHRcdGlmIGFwcHJvdmUuZnJvbV91c2VyID09IE1ldGVvci51c2VySWQoKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0ZmFsc2VcblxuXHRmaW5pc2hEYXRlU2NoZW1hOiAoKSAtPlxuXHRcdGlmIFN0ZWVkb3MuaXNBbmRyb2lkT3JJT1MoKVxuXHRcdFx0cmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRmaW5pc2hfZGF0ZToge1xuXHRcdFx0XHRcdGF1dG9mb3JtOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImRhdGV0aW1lLWxvY2FsXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9wdGlvbmFsOiBmYWxzZSxcblx0XHRcdFx0XHR0eXBlOiBEYXRlXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRmaW5pc2hfZGF0ZToge1xuXHRcdFx0XHRcdGF1dG9mb3JtOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImJvb3RzdHJhcC1kYXRldGltZXBpY2tlclwiXG5cdFx0XHRcdFx0XHRyZWFkb25seTogdHJ1ZVxuXHRcdFx0XHRcdFx0ZGF0ZVRpbWVQaWNrZXJPcHRpb25zOntcblx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW1cIixcblx0XHRcdFx0XHRcdFx0aWdub3JlUmVhZG9ubHk6dHJ1ZSxcblx0XHRcdFx0XHRcdFx0bG9jYWxlOiBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpLFxuXHRcdFx0XHRcdFx0XHR3aWRnZXRQb3NpdGlvbmluZzp7XG5cdFx0XHRcdFx0XHRcdFx0aG9yaXpvbnRhbDogJ3JpZ2h0J1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvcHRpb25hbDogZmFsc2UsXG5cdFx0XHRcdFx0dHlwZTogRGF0ZVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXG5cdGZpbmlzaERhdGVWYWx1ZXM6ICgpIC0+XG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbmlzaF9kYXRlOnRoaXMuZmluaXNoX2RhdGVcblx0XHR9O1xuXG5cdCMjI1xuICAgIFx05q2k5Ye95pWw55So5LqO5o6n5Yi25piv5ZCm5pi+56S6dHJhY2VzIHZpZXdcbiAgICBcdHRydWU6IOaYvuekunRyYWNlcyB2aWV3LOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjuaYr+ebtOaOpeWumuS9jeWIsHRyYWNlcyB2aWV3XG4gICAgXHRmYWxzZTog5LiN5pi+56S6dHJhY2VzIHZpZXfvvIznrb7moLjljobnqIvmjInpkq7ngrnlh7vlkI4s5LulTW9kYWwg5pa55byP5pi+56S6dHJhY2VzIHZpZXdcblx0IyMjXG5cdHNob3dUcmFjZXNWaWV3OiAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG4jXHRcdHJldHVybiAhKEluc3RhbmNlTWFuYWdlci5pc1RhYmxlU3R5bGUoZm9ybSkgJiYgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlc09waW5pb25GaWVsZChmb3JtLCBmb3JtX3ZlcnNpb24pKVxuXG5cdFx0c2hvd19tb2RhbF90cmFjZXNfbGlzdCA9IGRiLnNwYWNlX3NldHRpbmdzLmZpbmRPbmUoe3NwYWNlOiBTZXNzaW9uLmdldChcInNwYWNlSWRcIiksIGtleTogXCJzaG93X21vZGFsX3RyYWNlc19saXN0XCJ9KT8udmFsdWVzIHx8IGZhbHNlXG5cblx0XHRyZXR1cm4gIXNob3dfbW9kYWxfdHJhY2VzX2xpc3RcblxuXHRnZXRJbnN0YW5jZVN0YXRlVGV4dDogKGluc3RhbmNlX2lkKS0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0XHRpZiBsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0XHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRcdGVsc2Vcblx0XHRcdGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIilcblxuXHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlX2lkfSwge2ZpZWxkczoge3N0YXRlOiAxLCBpc19yZWFkOiAxfX0pXG5cdFx0aWYgbm90IGluc1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2RlbGV0ZWQnLCB7fSwgbG9jYWxlKVxuXG5cdFx0dGV4dCA9ICcnXG5cdFx0aWYgaW5zLnN0YXRlIGlzICdjb21wbGV0ZWQnXG5cdFx0XHR0ZXh0ID0gVEFQaTE4bi5fXygnY29tcGxldGVkJywge30sIGxvY2FsZSlcblx0XHRlbHNlIGlmIGlucy5zdGF0ZSBpcyAncGVuZGluZydcblx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdwZW5kaW5nJywge30sIGxvY2FsZSlcblx0XHRlbHNlIGlmIGlucy5zdGF0ZSBpcyAnZHJhZnQnXG5cdFx0XHRpZiBpbnMuaXNfcmVhZFxuXHRcdFx0XHR0ZXh0ID0gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV9yZWFkJywge30sIGxvY2FsZSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGV4dCA9IFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfbm90X3lldF9oYW5kbGVkJywge30sIGxvY2FsZSlcblxuXHRcdHJldHVybiB0ZXh0XG5cblx0Z2V0SW5zdGFuY2VTdGF0ZUNvbG9yOiAoaW5zdGFuY2VfaWQpLT5cblx0XHRpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZV9pZH0sIHtmaWVsZHM6IHtzdGF0ZTogMSwgaXNfcmVhZDogMX19KVxuXHRcdGlmIG5vdCBpbnNcblx0XHRcdHJldHVybiBcIlwiXG5cblx0XHRjbGEgPSAnJ1xuXHRcdGlmIGlucy5zdGF0ZSBpcyAnZHJhZnQnXG5cdFx0XHRpZiBpbnMuaXNfcmVhZFxuXHRcdFx0XHRjbGEgPSAnYmx1ZSdcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2xhID0gJ3JlZCdcblx0XHRyZXR1cm4gY2xhXG5cblx0Zmlyc3RUcmFjZTogKGluZGV4KS0+XG5cdFx0cmV0dXJuIGluZGV4IGlzIDBcblxuXHRsYXN0X2Rpc3RyaWJ1dGVfZnJvbTogKGluc3RhbmNlX2lkKS0+XG5cdFx0aW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VfaWQsIGRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZTogeyRleGlzdHM6IHRydWV9fSx7ZmllbGRzOntjcmVhdGVkOiAxLCBjcmVhdGVkX2J5OiAxfX0pXG5cdFx0aWYgaW5zXG5cdFx0XHRkaXNfaW5mbyA9IHt9XG5cdFx0XHR1c2VyID0ge31cblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHR1c2VyID0gVVVmbG93X2FwaS5nZXROYW1lRm9yVXNlcihpbnMuY3JlYXRlZF9ieSlcblx0XHRcdGVsc2UgaWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6IGlucy5jcmVhdGVkX2J5fSwge2ZpZWxkczoge25hbWU6IDF9fSlcblxuXHRcdFx0aWYgdXNlci5uYW1lXG5cdFx0XHRcdGRpc19pbmZvLmZyb21fdXNlciA9IHVzZXIuX2lkXG5cdFx0XHRcdGRpc19pbmZvLmZyb21fdXNlcl9uYW1lID0gdXNlci5uYW1lXG5cdFx0XHRcdGRpc19pbmZvLmNyZWF0ZWQgPSBpbnMuY3JlYXRlZFxuXG5cdFx0XHRpZiBub3QgXy5pc0VtcHR5KGRpc19pbmZvKVxuXHRcdFx0XHRyZXR1cm4gZGlzX2luZm9cblx0XHRyZXR1cm5cblxuXHRpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZDogKGFwcHJvdmUpLT5cblx0XHRpZiAoYXBwcm92ZS50eXBlIGlzICdjYycgb3IgYXBwcm92ZS50eXBlIGlzICdkaXN0cmlidXRlJyBvciBhcHByb3ZlLnR5cGUgaXMgJ2ZvcndhcmQnKSBhbmQgYXBwcm92ZS5qdWRnZSBpcyAndGVybWluYXRlZCdcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0anVkZ2VUZXJtaW5hdGVkOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4ganVkZ2UgaXMgJ3Rlcm1pbmF0ZWQnXG5cblx0aW5zdGFuY2VFeGlzdHM6IChpbnN0YW5jZV9pZCktPlxuXHRcdHJldHVybiAhIWRiLmluc3RhbmNlcy5maW5kKGluc3RhbmNlX2lkKS5jb3VudCgpXG5cblx0YWdlbnREZXNjcmlwdGlvbjogKHVzZXJOYW1lKS0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0XHRpZiBsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0XHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRcdGVsc2Vcblx0XHRcdGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIilcblxuXHRcdHJldHVybiBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IHVzZXJOYW1lfSwgbG9jYWxlKVxuXHRcblx0dHJhY2VOYW1lOiAoaW5zdGFuY2VfaWQsIHRyYWNlSWQpLT5cblx0XHRyZXR1cm4gXy5maW5kKGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlX2lkLCB7ZmllbGRzOiB7dHJhY2VzOiAxfX0pPy50cmFjZXMsICh0cmFjZSktPlxuXHRcdFx0XHRcdHJldHVybiB0cmFjZS5faWQgPT0gIHRyYWNlSWRcblx0XHQpPy5uYW1lXG5cblx0b2JqZWN0VXJsOiAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKS0+XG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZClcblxuXHRoYW5kbGVyRG9jOiAoaGFuZGxlcklkKS0+XG5cdFx0dXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWM/LndvcmtmbG93Py51c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvXG5cdFx0aWYgIXVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gb3IgIXVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKVxuXHRcdFx0cmV0dXJuXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRyZXR1cm4gVVVmbG93X2FwaS5nZXRDb250YWN0SW5mb0ZvclVzZXIoaGFuZGxlcklkLCBTZXNzaW9uLmdldCgnc3BhY2VJZCcpKVxuXHRcdGVsc2UgaWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZShoYW5kbGVySWQpXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLmRhdGVGb3JtYXQgPSAoZGF0ZSktPlxuXHRcdGlmIGRhdGVcblx0XHRcdHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXRcblx0XHRcdHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0RGF0ZShkYXRlLCB1dGNPZmZzZXQpO1xuXG5cdFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuX3QgPSAoa2V5KS0+XG5cdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSlcblxuXHRUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLnNob3dEZWxldGVCdXR0b24gPSAoYXBwcm92ZWQpIC0+XG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5UcmFjZXNUZW1wbGF0ZS5ldmVudHMgPVxuXHQnY2xpY2sgLmNjLWFwcHJvdmUtcmVtb3ZlJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXHRcdGlmIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nICogMSAhPSAxXG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyA9IDFcblx0XHRcdCQoXCJpXCIsZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJmYS1zcGluXCIpXG5cdFx0XHRpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKVxuXHRcdFx0YXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZVxuXHRcdFx0IyBDQUxMIOWIoOmZpGFwcHJvdmXlh73mlbDjgIJcblx0XHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0TWV0ZW9yLmNhbGwgJ2NjX3JlbW92ZScsIGluc3RhbmNlSWQsIGFwcHJvdmVJZCwgKGVyciwgcmVzdWx0KSAtPlxuXHRcdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIilcblx0XHRcdFx0aWYgZXJyXG5cdFx0XHRcdFx0dG9hc3RyLmVycm9yIGVyclxuXHRcdFx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMFxuXHRcdFx0XHRcdCQoXCJpXCIsZXZlbnQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoXCJmYS1zcGluXCIpXG5cdFx0XHRcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0XHRcdFx0dG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcInJlbW92ZV9jY19hcHByb3ZlXCIpKTtcblx0XHRcdFx0XHRpZiAkKFwiLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbFwiKS5sZW5ndGhcblx0XHRcdFx0XHRcdE1vZGFsLmhpZGUgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIlxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdHJldHVyblxuXG5cdCdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tY2MtYXBwcm92ZS1yZW1vdmUnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpXG5cdFx0YXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZVxuXHRcdCMgIyBDQUxMIOWIoOmZpGFwcHJvdmXlh73mlbDjgIJcblx0XHQjICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKVxuXHRcdCMgTWV0ZW9yLmNhbGwgJ2NjX3JlbW92ZScsIGluc3RhbmNlSWQsIGFwcHJvdmVJZCwgKGVyciwgcmVzdWx0KSAtPlxuXHRcdCMgXHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIilcblx0XHQjIFx0aWYgZXJyXG5cdFx0IyBcdFx0dG9hc3RyLmVycm9yIGVyclxuXHRcdCMgXHRpZiByZXN1bHQgPT0gdHJ1ZVxuXHRcdCMgXHRcdHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJyZW1vdmVfY2NfYXBwcm92ZVwiKSk7XG5cdFx0IyBcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0IyBcdHJldHVyblxuXHRcdCMgcmV0dXJuXG5cdFx0TW9kYWwuYWxsb3dNdWx0aXBsZSA9IHRydWVcblx0XHRNb2RhbC5zaG93ICdjYW5jZWxfY2NfbW9kYWwnXG5cblx0J2NsaWNrIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMgUEPkuIrpk77mjqXlhYHorrjnm7TmjqXngrnlvIDvvIzkuI3lho3miZPlvIDnrb7mibnljobnqIvor6bnu4Zcblx0XHR1bmxlc3MgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aFxuXHRcdFx0TW9kYWwuc2hvdyBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiLCB0aGlzXG5cblx0J3RhcGhvbGQgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyDmiYvmnLrkuIrplb/mjInmiZPlvIDnrb7mibnljobnqIvor6bnu4bvvIzlpoLmnpzmmK/pk77mjqXplb/mjInmiZPlvIDlkI7kuIDmlL7miYvnqpflj6PlsLHlj4jlhbPmjonkuobvvIzmiYDku6XkuI3orqnpk77mjqXmiZPlvIDnrb7mibnljobnqIvor6bnu4Zcblx0XHR1bmxlc3MgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aFxuXHRcdFx0TW9kYWwuc2hvdyBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiLCB0aGlzXG5cblx0J2NsaWNrIC5hcHByb3ZlLWl0ZW0gYS5idG4tbGluaywuYXBwcm92ZS1kZXNjcmlwdGlvbiBhLmJ0bi1saW5rLC5hcHByb3ZlLWl0ZW0tZGlzdHJpYnV0ZSBhLmJ0bi1saW5rJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIOaJi+acuuS4iueCueWHu+mTvuaOpe+8jOW8ueWHuuaWsOeql+WPo++8jOS4jeaUr+aMge+8jOWboOS4umFuZHJvaWTkuIrkvJrlvLnlh7rnmbvlvZXnlYzpnaJcblx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdHVzZXJJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0Py50YXJnZXRfdXNlcl9pZFxuXHRcdFx0Q3JlYXRvci5vcGVuU2FmZU9iamVjdFVybCgndXNlcnMnLCB1c2VySWQpXG5cblx0J3RhcGVuZCAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIOS4iui/sOmVv+aMieaJk+W8gGFwcHJvdmXor6bnu4bnqpflj6PnmoTkuovku7Z0YXBob2xk5Lya6Kem5Y+R5omT5byA56qX5Y+j5ZCO55qEdG91Y2hlbmTkuovku7bvvIzpgKDmiJDplb/mjInmiZPlvIDnqpflj6PlkI7kuIDmlL7miYvnqpflj6PlsLHlj4jlhbPmjonkuoZcblx0XHQjIOi/memHjOWPquiDvemAmui/h+mYu+atonRhcGVuZOS6i+S7tijkuI3lj6/ku6XnlKh0b3VjaGVuZOS6i+S7tu+8jOWboOS4uuS8muW9seWTjXRhcGhvbGTlip/og73vvIzpgKDmiJDmsqHmnInplb/mjInmlYjmnpzml7bkuZ/kvJrop6blj5F0YXBob2xk5LqL5Lu2KeWGkuazoeadpemBv+WFjemXrumimOOAglxuXHRcdCMg6ZO+5o6l5YWB6K6455u05o6l54K55byAXG5cdFx0dW5sZXNzICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGhcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHQnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWZvcndhcmQtYXBwcm92ZS1yZW1vdmUnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpXG5cdFx0YXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZVxuXHRcdHRyYWNlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC50cmFjZVxuXHRcdCMgQ0FMTCDliKDpmaRhcHByb3Zl5Ye95pWw44CCXG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0TWV0ZW9yLmNhbGwgJ2ZvcndhcmRfcmVtb3ZlJywgaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCAoZXJyLCByZXN1bHQpIC0+XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIilcblx0XHRcdGlmIGVyclxuXHRcdFx0XHR0b2FzdHIuZXJyb3IgVEFQaTE4bi5fXyhlcnIucmVhc29uKVxuXHRcdFx0aWYgcmVzdWx0ID09IHRydWVcblx0XHRcdFx0dG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcImluc3RhbmNlX2FwcHJvdmVfZm9yd2FyZF9yZW1vdmVfc3VjY2Vzc1wiKSk7XG5cdFx0XHRcdE1vZGFsLmhpZGUgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIlxuXHRcdFx0cmV0dXJuXG5cdFx0cmV0dXJuXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1mb3J3YXJkLWluc3RhbmNlLWxvb2snOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdGZvcndhcmRfc3BhY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkc3BhY2Vcblx0XHRmb3J3YXJkX2luc3RhbmNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZm9yd2FyZGluc3RhbmNlXG5cdFx0U3RlZWRvcy5vcGVuV2luZG93KFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGZvcndhcmRfc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgZm9yd2FyZF9pbnN0YW5jZSkpXG5cblx0J2NsaWNrIC5idG4tbW9kaWZpY2F0aW9uJ1x0OiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKTtcblx0XHR1bmxlc3MgU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpXG5cdFx0XHRUcmFja2VyLmFmdGVyRmx1c2ggLT5cblx0XHRcdFx0IyDmmL7npLrml6Xlv5fnmoTml7blgJnmiormu5rliqjmnaHlvoDkuIvnp7vngrnvvIzorqnml6XmnJ/mjqfku7bmmL7npLrlh7rkuIDpg6jliIbvvIzku6Xpgb/lhY3nlKjmiLfnnIvkuI3liLDml6XmnJ/mjqfku7Zcblx0XHRcdFx0JChcIiNpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWwgI2ZpbmlzaF9pbnB1dFwiKS5vbiBcImRwLnNob3dcIiwgKCkgLT5cblx0XHRcdFx0XHQkKFwiLm1vZGFsLWJvZHlcIikuc2Nyb2xsVG9wKDEwMClcblxuXHQnY2xpY2sgLmJ0bi1jYW5jZWxCdXQnIDogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblxuXHRcdHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKTtcblxuXHQnY2xpY2sgLmJ0bi1zYXZlQnV0JyA6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyB0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSlcblxuXHRcdGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpXG5cdFx0YXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZVxuXHRcdHRyYWNlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC50cmFjZVxuXHRcdG9waW5pb25faW5wdXQgPSAkKCcjb3Bpbmlvbl9pbnB1dCcpLnZhbCgpXG5cdFx0ZmluaXNoX2lucHV0ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShcImZpbmlzaF9kYXRlXCIsIFwiZmluaXNoRGF0ZUF1dG9Gb3JtXCIpXG5cblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHRNZXRlb3IuY2FsbCAnY2hhbmdlX2FwcHJvdmVfaW5mbycsIGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgb3Bpbmlvbl9pbnB1dCwgZmluaXNoX2lucHV0LCAoZXJyLCByZXN1bHQpLT5cblx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0aWYgZXJyXG5cdFx0XHRcdHRvYXN0ci5lcnJvciBUQVBpMThuLl9fKGVyci5yZWFzb24pXG5cdFx0XHRpZiByZXN1bHQgPT0gdHJ1ZVxuXHRcdFx0XHR0b2FzdHIuc3VjY2Vzcyh0KFwiaW5zdGFuY2VfYXBwcm92ZV9tb2RhbF9tb2RpZmljYXRpb25zYXZlXCIpKVxuXHRcdFx0XHRNb2RhbC5oaWRlIFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCJcblx0XHRcdHJldHVyblxuXG5cdCdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZGlzdHJpYnV0ZS1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0TW9kYWwuYWxsb3dNdWx0aXBsZSA9IHRydWVcblx0XHRNb2RhbC5zaG93ICdjYW5jZWxfZGlzdHJpYnV0ZV9tb2RhbCdcbiIsInZhciBtYXJrZWQ7XG5cbm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIik7XG5cblRyYWNlc1RlbXBsYXRlLmhlbHBlcnMgPSB7XG4gIHRyYWNlU2hvd1NpZ25JbWFnZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT09IGZhbHNlICYmIE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT09ICdmYWxzZSc7XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9LFxuICBlbXB0eTogZnVuY3Rpb24oYSkge1xuICAgIGlmIChhKSB7XG4gICAgICByZXR1cm4gYS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPCAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIHVuZW1wdHk6IGZ1bmN0aW9uKGEpIHtcbiAgICBpZiAoYSkge1xuICAgICAgcmV0dXJuIGEudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgYXBwZW5kOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgKyBiO1xuICB9LFxuICBkYXRlRm9ybWF0OiBmdW5jdGlvbihkYXRlKSB7XG4gICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAoZGF0ZSAhPSBudWxsID8gZGF0ZS5nZXRGdWxsWWVhcigpIDogdm9pZCAwKSA9PT0gKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU0tREQgSEg6bW0nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICB9XG4gIH0sXG4gIGdldFN0ZXBOYW1lOiBmdW5jdGlvbihzdGVwSWQpIHtcbiAgICB2YXIgc3RlcDtcbiAgICBzdGVwID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlU3RlcChzdGVwSWQpO1xuICAgIGlmIChzdGVwKSB7XG4gICAgICByZXR1cm4gc3RlcC5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgc2hvd0RlbGV0ZUJ1dHRvbjogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICBpZiAoYXBwcm92ZWQgJiYgYXBwcm92ZWQudHlwZSA9PT0gJ2NjJyAmJiBhcHByb3ZlZC5mcm9tX3VzZXIgPT09IE1ldGVvci51c2VySWQoKSAmJiBhcHByb3ZlZC5pc19maW5pc2hlZCAhPT0gdHJ1ZSAmJiAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc1Nob3dNb2RpZmljYXRpb25CdXR0b246IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgdmFyIGFwcHJvdmVfYWRtaW5zLCBpc1Nob3csIHJlZiwgcmVmMSwgcmVmMjtcbiAgICBhcHByb3ZlX2FkbWlucyA9IChyZWYgPSBNZXRlb3Iuc2V0dGluZ3MpICE9IG51bGwgPyAocmVmMSA9IHJlZltcInB1YmxpY1wiXSkgIT0gbnVsbCA/IChyZWYyID0gcmVmMS53b3JrZmxvdykgIT0gbnVsbCA/IHJlZjIuYXBwcm92ZV9hZG1pbnMgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgaWYgKGFwcHJvdmVfYWRtaW5zICE9IG51bGwgPyBhcHByb3ZlX2FkbWlucy5sZW5ndGggOiB2b2lkIDApIHtcbiAgICAgIGlzU2hvdyA9IGFwcHJvdmVfYWRtaW5zICE9IG51bGwgPyBhcHByb3ZlX2FkbWlucy5jb250YWlucyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIWlzU2hvdykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYXBwcm92ZWQuaGFuZGxlciA9PT0gTWV0ZW9yLnVzZXJJZCgpO1xuICB9LFxuICBpc0VkaXRpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuIChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLmlzX2VkaXRpbmcpICE9IG51bGwgPyByZWYuZ2V0KCkgOiB2b2lkIDA7XG4gIH0sXG4gIGlzU2hvd0Rlc2NyaXB0aW9uOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIHZhciByZWY7XG4gICAgaWYgKFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuaXNTaG93TW9kaWZpY2F0aW9uQnV0dG9uKGFwcHJvdmVkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoKHJlZiA9IGFwcHJvdmVkLmRlc2NyaXB0aW9uKSAhPSBudWxsID8gcmVmLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA6IHZvaWQgMCkgPiAwO1xuICB9LFxuICBpc0NDOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIGlmIChhcHByb3ZlZCAmJiBhcHByb3ZlZC50eXBlID09PSAnY2MnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBnZXRBcHByb3ZlU3RhdHVzSWNvbjogZnVuY3Rpb24oYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSB7XG4gICAgdmFyIGFwcHJvdmVTdGF0dXNJY29uO1xuICAgIGlmIChhdXRvU3VibWl0dGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJ2lvbiBpb24tYW5kcm9pZC1hbGFybS1jbG9jayc7XG4gICAgfVxuICAgIGFwcHJvdmVTdGF0dXNJY29uID0gdm9pZCAwO1xuICAgIHN3aXRjaCAoYXBwcm92ZUp1ZGdlKSB7XG4gICAgICBjYXNlICdhcHByb3ZlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tY2hlY2ttYXJrLXJvdW5kJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWplY3RlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tY2xvc2Utcm91bmQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Rlcm1pbmF0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdmYSBmYS1iYW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlYXNzaWduZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFuZHJvaWQtY29udGFjdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVsb2NhdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1hcnJvdy1zaHJpbmsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JldHJpZXZlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLXVuZG8nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYXBwcm92ZVN0YXR1c0ljb247XG4gIH0sXG4gIGdldEFwcHJvdmVTdGF0dXNUZXh0OiBmdW5jdGlvbihhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIHtcbiAgICB2YXIgYXBwcm92ZVN0YXR1c1RleHQsIGxvY2FsZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgaWYgKGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAnemgtY24nKSB7XG4gICAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKTtcbiAgICB9XG4gICAgaWYgKGF1dG9TdWJtaXR0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3RpbWVvdXRfYXV0b19zdWJtaXR0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICB9XG4gICAgYXBwcm92ZVN0YXR1c1RleHQgPSB2b2lkIDA7XG4gICAgc3dpdGNoIChhcHByb3ZlSnVkZ2UpIHtcbiAgICAgIGNhc2UgJ2FwcHJvdmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlamVjdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWplY3RlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Rlcm1pbmF0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHRlcm1pbmF0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWFzc2lnbmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVsb2NhdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWxvY2F0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXRyaWV2ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHJpZXZlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JldHVybmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZXR1cm5lZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlYWRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVhZGVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlU3RhdHVzVGV4dDtcbiAgfSxcbiAgZ2V0QXBwcm92ZUp1ZGdlQ2xhc3M6IGZ1bmN0aW9uKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkge1xuICAgIGlmIChhdXRvU3VibWl0dGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJ2F1dG9TdWJtaXR0ZWQnO1xuICAgIH1cbiAgICByZXR1cm4gYXBwcm92ZUp1ZGdlO1xuICB9LFxuICBfdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5KTtcbiAgfSxcbiAgbXlBcHByb3ZlRGVzY3JpcHRpb246IGZ1bmN0aW9uKGFwcHJvdmVJZCkge1xuICAgIHZhciBteUFwcHJvdmUsIHJlZiwgcmVmMTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgbXlBcHByb3ZlID0gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5teUFwcHJvdmUpICE9IG51bGwgPyByZWYxLmdldCgpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICBpZiAobXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PT0gYXBwcm92ZUlkKSB7XG4gICAgICAgICAgaWYgKCFTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiAobXlBcHByb3ZlICE9IG51bGwgPyBteUFwcHJvdmUuZGVzY3JpcHRpb24gOiB2b2lkIDApIHx8IFwiXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzRm9yd2FyZDogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICBpZiAoYXBwcm92ZWQgJiYgYXBwcm92ZWQudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzaG93Rm9yd2FyZERlbGV0ZUJ1dHRvbjogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIGlmIChkYi5pbnN0YW5jZXMuZmluZChhcHByb3ZlLmZvcndhcmRfaW5zdGFuY2UpLmNvdW50KCkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09PSAnZm9yd2FyZCcgJiYgYXBwcm92ZS5mcm9tX3VzZXIgPT09IE1ldGVvci51c2VySWQoKSAmJiAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpICYmIGFwcHJvdmUuanVkZ2UgIT09ICd0ZXJtaW5hdGVkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgbWFya0Rvd25Ub0h0bWw6IGZ1bmN0aW9uKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgaWYgKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKTtcbiAgICB9XG4gIH0sXG4gIGlzRGlzdHJpYnV0ZTogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbjogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIHZhciBpbnM7XG4gICAgaWYgKGRiLmluc3RhbmNlcy5maW5kKGFwcHJvdmUuZm9yd2FyZF9pbnN0YW5jZSkuY291bnQoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT09ICdkaXN0cmlidXRlJyAmJiAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpICYmIGFwcHJvdmUuanVkZ2UgIT09ICd0ZXJtaW5hdGVkJykge1xuICAgICAgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGFwcHJvdmUuaW5zdGFuY2VcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgZmxvdzogMSxcbiAgICAgICAgICBzcGFjZTogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnMgJiYgaW5zLmZsb3cgJiYgaW5zLnNwYWNlKSB7XG4gICAgICAgIGlmIChXb3JrZmxvd01hbmFnZXIuaGFzRmxvd0FkbWluUGVybWlzc2lvbihpbnMuZmxvdywgaW5zLnNwYWNlLCBNZXRlb3IudXNlcklkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhcHByb3ZlLmZyb21fdXNlciA9PT0gTWV0ZW9yLnVzZXJJZCgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGZpbmlzaERhdGVTY2hlbWE6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChTdGVlZG9zLmlzQW5kcm9pZE9ySU9TKCkpIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKHtcbiAgICAgICAgZmluaXNoX2RhdGU6IHtcbiAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgdHlwZTogXCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgICAgdHlwZTogRGF0ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoe1xuICAgICAgICBmaW5pc2hfZGF0ZToge1xuICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb3RzdHJhcC1kYXRldGltZXBpY2tlclwiLFxuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBkYXRlVGltZVBpY2tlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW1cIixcbiAgICAgICAgICAgICAgaWdub3JlUmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIGxvY2FsZTogU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKSxcbiAgICAgICAgICAgICAgd2lkZ2V0UG9zaXRpb25pbmc6IHtcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAncmlnaHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBEYXRlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZmluaXNoRGF0ZVZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmlzaF9kYXRlOiB0aGlzLmZpbmlzaF9kYXRlXG4gICAgfTtcbiAgfSxcblxuICAvKlxuICAgICBcdOatpOWHveaVsOeUqOS6juaOp+WItuaYr+WQpuaYvuekunRyYWNlcyB2aWV3XG4gICAgIFx0dHJ1ZTog5pi+56S6dHJhY2VzIHZpZXcs562+5qC45Y6G56iL5oyJ6ZKu54K55Ye75ZCO5piv55u05o6l5a6a5L2N5YiwdHJhY2VzIHZpZXdcbiAgICAgXHRmYWxzZTog5LiN5pi+56S6dHJhY2VzIHZpZXfvvIznrb7moLjljobnqIvmjInpkq7ngrnlh7vlkI4s5LulTW9kYWwg5pa55byP5pi+56S6dHJhY2VzIHZpZXdcbiAgICovXG4gIHNob3dUcmFjZXNWaWV3OiBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgICB2YXIgcmVmLCBzaG93X21vZGFsX3RyYWNlc19saXN0O1xuICAgIHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSAoKHJlZiA9IGRiLnNwYWNlX3NldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSxcbiAgICAgIGtleTogXCJzaG93X21vZGFsX3RyYWNlc19saXN0XCJcbiAgICB9KSkgIT0gbnVsbCA/IHJlZi52YWx1ZXMgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgIHJldHVybiAhc2hvd19tb2RhbF90cmFjZXNfbGlzdDtcbiAgfSxcbiAgZ2V0SW5zdGFuY2VTdGF0ZVRleHQ6IGZ1bmN0aW9uKGluc3RhbmNlX2lkKSB7XG4gICAgdmFyIGlucywgbG9jYWxlLCB0ZXh0O1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgICBpZiAobG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpO1xuICAgIH1cbiAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlX2lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHN0YXRlOiAxLFxuICAgICAgICBpc19yZWFkOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFpbnMpIHtcbiAgICAgIHJldHVybiBUQVBpMThuLl9fKCdpbnN0YW5jZV9kZWxldGVkJywge30sIGxvY2FsZSk7XG4gICAgfVxuICAgIHRleHQgPSAnJztcbiAgICBpZiAoaW5zLnN0YXRlID09PSAnY29tcGxldGVkJykge1xuICAgICAgdGV4dCA9IFRBUGkxOG4uX18oJ2NvbXBsZXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgIH0gZWxzZSBpZiAoaW5zLnN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdwZW5kaW5nJywge30sIGxvY2FsZSk7XG4gICAgfSBlbHNlIGlmIChpbnMuc3RhdGUgPT09ICdkcmFmdCcpIHtcbiAgICAgIGlmIChpbnMuaXNfcmVhZCkge1xuICAgICAgICB0ZXh0ID0gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV9yZWFkJywge30sIGxvY2FsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV9ub3RfeWV0X2hhbmRsZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH0sXG4gIGdldEluc3RhbmNlU3RhdGVDb2xvcjogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICB2YXIgY2xhLCBpbnM7XG4gICAgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZV9pZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgaXNfcmVhZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghaW5zKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY2xhID0gJyc7XG4gICAgaWYgKGlucy5zdGF0ZSA9PT0gJ2RyYWZ0Jykge1xuICAgICAgaWYgKGlucy5pc19yZWFkKSB7XG4gICAgICAgIGNsYSA9ICdibHVlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYSA9ICdyZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhO1xuICB9LFxuICBmaXJzdFRyYWNlOiBmdW5jdGlvbihpbmRleCkge1xuICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgfSxcbiAgbGFzdF9kaXN0cmlidXRlX2Zyb206IGZ1bmN0aW9uKGluc3RhbmNlX2lkKSB7XG4gICAgdmFyIGRpc19pbmZvLCBpbnMsIHVzZXI7XG4gICAgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZV9pZCxcbiAgICAgIGRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZToge1xuICAgICAgICAkZXhpc3RzOiB0cnVlXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGNyZWF0ZWQ6IDEsXG4gICAgICAgIGNyZWF0ZWRfYnk6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaW5zKSB7XG4gICAgICBkaXNfaW5mbyA9IHt9O1xuICAgICAgdXNlciA9IHt9O1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICB1c2VyID0gVVVmbG93X2FwaS5nZXROYW1lRm9yVXNlcihpbnMuY3JlYXRlZF9ieSk7XG4gICAgICB9IGVsc2UgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICAgICAgX2lkOiBpbnMuY3JlYXRlZF9ieVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyLm5hbWUpIHtcbiAgICAgICAgZGlzX2luZm8uZnJvbV91c2VyID0gdXNlci5faWQ7XG4gICAgICAgIGRpc19pbmZvLmZyb21fdXNlcl9uYW1lID0gdXNlci5uYW1lO1xuICAgICAgICBkaXNfaW5mby5jcmVhdGVkID0gaW5zLmNyZWF0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNFbXB0eShkaXNfaW5mbykpIHtcbiAgICAgICAgcmV0dXJuIGRpc19pbmZvO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgaXNDQ09yRGlzdHJpYnV0ZU9yRm9yd2FyZFRlcm1pbmF0ZWQ6IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICBpZiAoKGFwcHJvdmUudHlwZSA9PT0gJ2NjJyB8fCBhcHByb3ZlLnR5cGUgPT09ICdkaXN0cmlidXRlJyB8fCBhcHByb3ZlLnR5cGUgPT09ICdmb3J3YXJkJykgJiYgYXBwcm92ZS5qdWRnZSA9PT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBqdWRnZVRlcm1pbmF0ZWQ6IGZ1bmN0aW9uKGp1ZGdlKSB7XG4gICAgcmV0dXJuIGp1ZGdlID09PSAndGVybWluYXRlZCc7XG4gIH0sXG4gIGluc3RhbmNlRXhpc3RzOiBmdW5jdGlvbihpbnN0YW5jZV9pZCkge1xuICAgIHJldHVybiAhIWRiLmluc3RhbmNlcy5maW5kKGluc3RhbmNlX2lkKS5jb3VudCgpO1xuICB9LFxuICBhZ2VudERlc2NyaXB0aW9uOiBmdW5jdGlvbih1c2VyTmFtZSkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIHJldHVybiBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICB1c2VyTmFtZTogdXNlck5hbWVcbiAgICB9LCBsb2NhbGUpO1xuICB9LFxuICB0cmFjZU5hbWU6IGZ1bmN0aW9uKGluc3RhbmNlX2lkLCB0cmFjZUlkKSB7XG4gICAgdmFyIHJlZiwgcmVmMTtcbiAgICByZXR1cm4gKHJlZiA9IF8uZmluZCgocmVmMSA9IGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlX2lkLCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgdHJhY2VzOiAxXG4gICAgICB9XG4gICAgfSkpICE9IG51bGwgPyByZWYxLnRyYWNlcyA6IHZvaWQgMCwgZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgIHJldHVybiB0cmFjZS5faWQgPT09IHRyYWNlSWQ7XG4gICAgfSkpICE9IG51bGwgPyByZWYubmFtZSA6IHZvaWQgMDtcbiAgfSxcbiAgb2JqZWN0VXJsOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKTtcbiAgfSxcbiAgaGFuZGxlckRvYzogZnVuY3Rpb24oaGFuZGxlcklkKSB7XG4gICAgdmFyIHJlZiwgcmVmMSwgdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbztcbiAgICB1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvID0gKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLndvcmtmbG93KSAhPSBudWxsID8gcmVmMS51c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIGlmICghdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyB8fCAhdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mby5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHJldHVybiBVVWZsb3dfYXBpLmdldENvbnRhY3RJbmZvRm9yVXNlcihoYW5kbGVySWQsIFNlc3Npb24uZ2V0KCdzcGFjZUlkJykpO1xuICAgIH0gZWxzZSBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gZGIudXNlcnMuZmluZE9uZShoYW5kbGVySWQpO1xuICAgIH1cbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLmRhdGVGb3JtYXQgPSBmdW5jdGlvbihkYXRlKSB7XG4gICAgdmFyIHV0Y09mZnNldDtcbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdXRjT2Zmc2V0ID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnV0Y09mZnNldDtcbiAgICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0RGF0ZShkYXRlLCB1dGNPZmZzZXQpO1xuICAgIH1cbiAgfTtcbiAgVHJhY2VzVGVtcGxhdGUuaGVscGVycy5fdCA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpO1xuICB9O1xuICBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLnNob3dEZWxldGVCdXR0b24gPSBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxuVHJhY2VzVGVtcGxhdGUuZXZlbnRzID0ge1xuICAnY2xpY2sgLmNjLWFwcHJvdmUtcmVtb3ZlJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIGFwcHJvdmVJZCwgaW5zdGFuY2VJZDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgKiAxICE9PSAxKSB7XG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyA9IDE7XG4gICAgICAkKFwiaVwiLCBldmVudC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcyhcImZhLXNwaW5cIik7XG4gICAgICBpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKTtcbiAgICAgIGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmU7XG4gICAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgICBNZXRlb3IuY2FsbCgnY2NfcmVtb3ZlJywgaW5zdGFuY2VJZCwgYXBwcm92ZUlkLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAgICAkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0b2FzdHIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyA9IDA7XG4gICAgICAgICAgJChcImlcIiwgZXZlbnQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoXCJmYS1zcGluXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICB0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwicmVtb3ZlX2NjX2FwcHJvdmVcIikpO1xuICAgICAgICAgIGlmICgkKFwiLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbFwiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIE1vZGFsLmhpZGUoXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tY2MtYXBwcm92ZS1yZW1vdmUnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBpbnN0YW5jZUlkO1xuICAgIGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpO1xuICAgIGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmU7XG4gICAgTW9kYWwuYWxsb3dNdWx0aXBsZSA9IHRydWU7XG4gICAgcmV0dXJuIE1vZGFsLnNob3coJ2NhbmNlbF9jY19tb2RhbCcpO1xuICB9LFxuICAnY2xpY2sgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIGlmICghJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIE1vZGFsLnNob3coXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIiwgdGhpcyk7XG4gICAgfVxuICB9LFxuICAndGFwaG9sZCAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gTW9kYWwuc2hvdyhcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiLCB0aGlzKTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuYXBwcm92ZS1pdGVtIGEuYnRuLWxpbmssLmFwcHJvdmUtZGVzY3JpcHRpb24gYS5idG4tbGluaywuYXBwcm92ZS1pdGVtLWRpc3RyaWJ1dGUgYS5idG4tbGluayc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciByZWYsIHVzZXJJZDtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICB1c2VySWQgPSAocmVmID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQpICE9IG51bGwgPyByZWYudGFyZ2V0X3VzZXJfaWQgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gQ3JlYXRvci5vcGVuU2FmZU9iamVjdFVybCgndXNlcnMnLCB1c2VySWQpO1xuICAgIH1cbiAgfSxcbiAgJ3RhcGVuZCAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICAnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWZvcndhcmQtYXBwcm92ZS1yZW1vdmUnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBpbnN0YW5jZUlkLCB0cmFjZUlkO1xuICAgIGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpO1xuICAgIGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmU7XG4gICAgdHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlO1xuICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKTtcbiAgICBNZXRlb3IuY2FsbCgnZm9yd2FyZF9yZW1vdmUnLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRvYXN0ci5lcnJvcihUQVBpMThuLl9fKGVyci5yZWFzb24pKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcImluc3RhbmNlX2FwcHJvdmVfZm9yd2FyZF9yZW1vdmVfc3VjY2Vzc1wiKSk7XG4gICAgICAgIE1vZGFsLmhpZGUoXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gICdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1pbnN0YW5jZS1sb29rJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIGZvcndhcmRfaW5zdGFuY2UsIGZvcndhcmRfc3BhY2U7XG4gICAgZm9yd2FyZF9zcGFjZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmZvcndhcmRzcGFjZTtcbiAgICBmb3J3YXJkX2luc3RhbmNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZm9yd2FyZGluc3RhbmNlO1xuICAgIHJldHVybiBTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgZm9yd2FyZF9zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBmb3J3YXJkX2luc3RhbmNlKSk7XG4gIH0sXG4gICdjbGljayAuYnRuLW1vZGlmaWNhdGlvbic6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKTtcbiAgICBpZiAoIVN0ZWVkb3MuaXNBbmRyb2lkT3JJT1MoKSkge1xuICAgICAgcmV0dXJuIFRyYWNrZXIuYWZ0ZXJGbHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICQoXCIjaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsICNmaW5pc2hfaW5wdXRcIikub24oXCJkcC5zaG93XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAkKFwiLm1vZGFsLWJvZHlcIikuc2Nyb2xsVG9wKDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAnY2xpY2sgLmJ0bi1jYW5jZWxCdXQnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICByZXR1cm4gdGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuICB9LFxuICAnY2xpY2sgLmJ0bi1zYXZlQnV0JzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIGFwcHJvdmVJZCwgZmluaXNoX2lucHV0LCBpbnN0YW5jZUlkLCBvcGluaW9uX2lucHV0LCB0cmFjZUlkO1xuICAgIGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpO1xuICAgIGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmU7XG4gICAgdHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlO1xuICAgIG9waW5pb25faW5wdXQgPSAkKCcjb3Bpbmlvbl9pbnB1dCcpLnZhbCgpO1xuICAgIGZpbmlzaF9pbnB1dCA9IEF1dG9Gb3JtLmdldEZpZWxkVmFsdWUoXCJmaW5pc2hfZGF0ZVwiLCBcImZpbmlzaERhdGVBdXRvRm9ybVwiKTtcbiAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgcmV0dXJuIE1ldGVvci5jYWxsKCdjaGFuZ2VfYXBwcm92ZV9pbmZvJywgaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBvcGluaW9uX2lucHV0LCBmaW5pc2hfaW5wdXQsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRvYXN0ci5lcnJvcihUQVBpMThuLl9fKGVyci5yZWFzb24pKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdG9hc3RyLnN1Y2Nlc3ModChcImluc3RhbmNlX2FwcHJvdmVfbW9kYWxfbW9kaWZpY2F0aW9uc2F2ZVwiKSk7XG4gICAgICAgIE1vZGFsLmhpZGUoXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gICdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZGlzdHJpYnV0ZS1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIE1vZGFsLmFsbG93TXVsdGlwbGUgPSB0cnVlO1xuICAgIHJldHVybiBNb2RhbC5zaG93KCdjYW5jZWxfZGlzdHJpYnV0ZV9tb2RhbCcpO1xuICB9XG59O1xuIiwiUmVsYXRlZEluc3RhbmNlcy5oZWxwZXJzID1cblx0c2hvd1JlbGF0ZWRJbnN0YWNlczogLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGVsc2Vcblx0XHRcdGlucyA9IHRoaXMuaW5zdGFuY2Vcblx0XHRpZiBpbnM/LnJlbGF0ZWRfaW5zdGFuY2VzICYmIF8uaXNBcnJheShpbnM/LnJlbGF0ZWRfaW5zdGFuY2VzKVxuXHRcdFx0aWYgZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbjogaW5zLnJlbGF0ZWRfaW5zdGFuY2VzfX0sIHtmaWVsZHM6IHtzcGFjZTogMSwgbmFtZTogMX19KS5jb3VudCgpID4gMFxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0cmVsYXRlZF9pbnN0YWNlczogLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGVsc2Vcblx0XHRcdGlucyA9IHRoaXMuaW5zdGFuY2Vcblx0XHRpZiBpbnM/LnJlbGF0ZWRfaW5zdGFuY2VzICYmIF8uaXNBcnJheShpbnM/LnJlbGF0ZWRfaW5zdGFuY2VzKVxuXHRcdFx0cmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW46IGlucy5yZWxhdGVkX2luc3RhbmNlc319LCB7ZmllbGRzOiB7c3BhY2U6IDEsIG5hbWU6IDF9fSkuZmV0Y2goKVxuXG5cdHJlbGF0ZWRfaW5zdGFjZV91cmw6IChpbnMpIC0+XG5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKVxuXHRcdFx0cmV0dXJuICcnXG5cblx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZVxuXHRcdGlmIGFic29sdXRlXG5cdFx0XHRyZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIraW5zLnNwYWNlK1wiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJylcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiK2lucy5zcGFjZStcIi92aWV3L3JlYWRvbmx5L1wiICsgaW5zLl9pZCArICc/aGlkZV90cmFjZXM9MCcpXG5cblx0X3Q6IChrZXkpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKGtleSlcblx0XHRlbHNlXG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpXG5cblx0c2hvd19kZWxldGU6ICgpLT5cblx0XHRpZiAhTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSBcImRyYWZ0XCIgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKVxuXHRcdFx0XHRpZiBjdXJyZW50X3N0ZXBcblx0XHRcdFx0XHRpZiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoIHx8IGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHRydWUgfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWUiLCJSZWxhdGVkSW5zdGFuY2VzLmhlbHBlcnMgPSB7XG4gIHNob3dSZWxhdGVkSW5zdGFjZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucyA9IHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICgoaW5zICE9IG51bGwgPyBpbnMucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDApICYmIF8uaXNBcnJheShpbnMgIT0gbnVsbCA/IGlucy5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMCkpIHtcbiAgICAgIGlmIChkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogaW5zLnJlbGF0ZWRfaW5zdGFuY2VzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgbmFtZTogMVxuICAgICAgICB9XG4gICAgICB9KS5jb3VudCgpID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgcmVsYXRlZF9pbnN0YWNlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKChpbnMgIT0gbnVsbCA/IGlucy5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMCkgJiYgXy5pc0FycmF5KGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSkge1xuICAgICAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICB9LFxuICByZWxhdGVkX2luc3RhY2VfdXJsOiBmdW5jdGlvbihpbnMpIHtcbiAgICB2YXIgYWJzb2x1dGU7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgYWJzb2x1dGUgPSB0aGlzLmFic29sdXRlO1xuICAgIH1cbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGlucy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBpbnMuc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgaW5zLl9pZCArICc/aGlkZV90cmFjZXM9MCcpO1xuICAgIH1cbiAgfSxcbiAgX3Q6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICAgIHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG4gICAgfVxuICB9LFxuICBzaG93X2RlbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnJlbnRfc3RlcDtcbiAgICBpZiAoIU1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09IFwiZHJhZnRcIiB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICBjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRfc3RlcCkge1xuICAgICAgICAgIGlmIChjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT09IHRydWUgfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiUmVsYXRlZFJlY29yZHMuaGVscGVycyA9XG5cdHNob3dSZWxhdGVkUmVjb3JkczogKCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdGlmICFpbnNcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHJldHVybiAhXy5pc0VtcHR5KGlucy5yZWNvcmRfaWRzKVxuXHRyZWxhdGVkUmVjb3JkVXJsOiAoKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSlcblx0XHRcdHJldHVybiAnJ1xuXG5cdFx0YWJzb2x1dGUgPSBmYWxzZVxuXHRcdFxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdFx0YWJzb2x1dGUgPSB0aGlzLmFic29sdXRlXG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFxuXHRcdG9iamNldE5hbWUgPSBpbnMucmVjb3JkX2lkc1swXS5vXG5cdFx0aWQgPSBpbnMucmVjb3JkX2lkc1swXS5pZHNbMF1cblxuXHRcdGlmIGFic29sdXRlXG5cdFx0XHRyZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBwLy0vI3tvYmpjZXROYW1lfS92aWV3LyN7aWR9XCIpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcHAvLS8je29iamNldE5hbWV9L3ZpZXcvI3tpZH1cIikiLCJSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzID0ge1xuICBzaG93UmVsYXRlZFJlY29yZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucyA9IHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICghaW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhXy5pc0VtcHR5KGlucy5yZWNvcmRfaWRzKTtcbiAgfSxcbiAgcmVsYXRlZFJlY29yZFVybDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFic29sdXRlLCBpZCwgaW5zLCBvYmpjZXROYW1lO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGlucyA9IHRoaXMuaW5zdGFuY2U7XG4gICAgICBhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIH1cbiAgICBvYmpjZXROYW1lID0gaW5zLnJlY29yZF9pZHNbMF0ubztcbiAgICBpZCA9IGlucy5yZWNvcmRfaWRzWzBdLmlkc1swXTtcbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcHAvLS9cIiArIG9iamNldE5hbWUgKyBcIi92aWV3L1wiICsgaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcC8tL1wiICsgb2JqY2V0TmFtZSArIFwiL3ZpZXcvXCIgKyBpZCk7XG4gICAgfVxuICB9XG59O1xuIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjQgMTU6Mjk6MjJcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbi8vIEpzb25Sb3V0ZXMuYWRkKFwicG9zdFwiLCBcIi9hcGkvd29ya2Zsb3cvZ2V0U3BhY2VVc2Vyc1wiLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbi8vICAgdmFyXG4vLyAgICAgdXNlcklkcyA9IHJlcS5ib2R5LnVzZXJJZHMsXG4vLyAgICAgc3BhY2VJZCA9IHJlcS5xdWVyeS5zcGFjZUlkLFxuLy8gICAgIHNwYWNlVXNlcnMgPSBbXVxuLy8gICA7XG5cbi8vICAgaWYgKCF1c2VySWRzIHx8ICFzcGFjZUlkKSB7XG4vLyAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gICAgICAgY29kZTogMjAwLFxuLy8gICAgICAgZGF0YToge1xuLy8gICAgICAgICAnZXJyb3JzJzogJ+e8uuWwkeWPguaVsCdcbi8vICAgICAgIH1cbi8vICAgICB9KTtcbi8vICAgfVxuXG4vLyAgIHNwYWNlVXNlcnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0VXNlcnMoc3BhY2VJZCwgdXNlcklkcyk7XG5cbi8vICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gICAgIGNvZGU6IDIwMCxcbi8vICAgICBkYXRhOiB7XG4vLyAgICAgICAnc3BhY2VVc2Vycyc6IHNwYWNlVXNlcnNcbi8vICAgICB9XG4vLyAgIH0pO1xuLy8gfSlcblxuXG4gIFxuICAiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxNToyMzoxNFxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuLy8gSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS93b3JrZmxvdy9nZXRGb3JtdWxhVXNlck9iamVjdHNcIiwgZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4vLyAgIHZhclxuLy8gICAgIHVzZXJJZHMgPSByZXEuYm9keS51c2VySWRzLFxuLy8gICAgIHNwYWNlSWQgPSByZXEucXVlcnkuc3BhY2VJZCxcbi8vICAgICBzcGFjZVVzZXJzID0gW11cbi8vICAgO1xuXG4vLyAgIGlmICghdXNlcklkcyB8fCAhc3BhY2VJZCkge1xuLy8gICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vICAgICAgIGNvZGU6IDIwMCxcbi8vICAgICAgIGRhdGE6IHtcbi8vICAgICAgICAgJ2Vycm9ycyc6ICfnvLrlsJHlj4LmlbAnXG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgIH1cblxuLy8gICB2YXIgdXNlcnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3Qoc3BhY2VJZCwgdXNlcklkcyk7XG5cbi8vICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gICAgIGNvZGU6IDIwMCxcbi8vICAgICBkYXRhOiB7XG4vLyAgICAgICAnc3BhY2VVc2Vycyc6IHVzZXJzXG4vLyAgICAgfVxuLy8gICB9KTtcbi8vIH0pXG5cblxuICBcbiAgIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjQgMTU6Mzg6NTRcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbi8vIEpzb25Sb3V0ZXMuYWRkKFwicG9zdFwiLCBcIi9hcGkvd29ya2Zsb3cvaW5pdF9mb3JtdWxhX3ZhbHVlc1wiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuLy8gXHR2YXJcbi8vIFx0XHRmaWVsZHMgPSByZXEuYm9keS5maWVsZHMsXG4vLyBcdFx0YXV0b0Zvcm1Eb2MgPSByZXEuYm9keS5hdXRvRm9ybURvYyxcbi8vIFx0XHRhcHByb3ZlciA9IHJlcS5ib2R5LmFwcHJvdmVyLFxuLy8gXHRcdGFwcGxpY2FudCA9IHJlcS5ib2R5LmFwcGxpY2FudCxcblxuLy8gXHRcdHNwYWNlSWQgPSByZXEucXVlcnkuc3BhY2VJZCxcblxuLy8gXHRcdHNwYWNlVXNlcnMgPSBbXTtcblxuLy8gXHRpZiAoIWZpZWxkcyB8fCAhc3BhY2VJZCB8fCAhYXV0b0Zvcm1Eb2MgfHwgIWFwcHJvdmVyIHx8ICFhcHBsaWNhbnQpIHtcbi8vIFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyBcdFx0XHRjb2RlOiAyMDAsXG4vLyBcdFx0XHRkYXRhOiB7XG4vLyBcdFx0XHRcdCdlcnJvcnMnOiAn57y65bCR5Y+C5pWwJ1xuLy8gXHRcdFx0fVxuLy8gXHRcdH0pO1xuLy8gXHRcdHJldHVybjtcbi8vIFx0fVxuXG4vLyBcdGZvcm11bGFfdmFsdWVzID0gRm9ybV9mb3JtdWxhLmluaXRfZm9ybXVsYV92YWx1ZXMoZmllbGRzLCBhdXRvRm9ybURvYywgYXBwcm92ZXIsIGFwcGxpY2FudCwgc3BhY2VJZCk7XG5cbi8vIFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gXHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRkYXRhOiB7XG4vLyBcdFx0XHQnZm9ybXVsYV92YWx1ZXMnOiBmb3JtdWxhX3ZhbHVlc1xuLy8gXHRcdH1cbi8vIFx0fSk7XG4vLyB9KVxuIiwiLy8gSnNvblJvdXRlcy5hZGQoJ3Bvc3QnLCAnL2FwaS93b3JrZmxvdy9mb3J3YXJkJywgZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4vLyBcdHRyeSB7XG4vLyBcdFx0dmFyIGN1cnJlbnRfdXNlcl9pbmZvID0gdXVmbG93TWFuYWdlci5jaGVja19hdXRob3JpemF0aW9uKHJlcSk7XG4vLyBcdFx0dmFyIGN1cnJlbnRfdXNlcl9pZCA9IGN1cnJlbnRfdXNlcl9pbmZvLl9pZDtcblxuLy8gXHRcdHZhciBoYXNoRGF0YSA9IHJlcS5ib2R5O1xuLy8gXHRcdHZhciBpbnN0YW5jZV9pZCA9IGhhc2hEYXRhLmluc3RhbmNlX2lkO1xuLy8gXHRcdHZhciBzcGFjZV9pZCA9IGhhc2hEYXRhLnNwYWNlX2lkO1xuLy8gXHRcdHZhciBmbG93X2lkID0gaGFzaERhdGEuZmxvd19pZDtcbi8vIFx0XHR2YXIgaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50ID0gaGFzaERhdGEuaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50O1xuLy8gXHRcdHZhciBkZXNjcmlwdGlvbiA9IGhhc2hEYXRhLmRlc2NyaXB0aW9uO1xuLy8gXHRcdHZhciBpc0ZvcndhcmRBdHRhY2htZW50cyA9IGhhc2hEYXRhLmlzRm9yd2FyZEF0dGFjaG1lbnRzO1xuLy8gXHRcdHZhciBzZWxlY3RlZFVzZXJzID0gaGFzaERhdGEuc2VsZWN0ZWRVc2Vycztcbi8vIFx0XHR2YXIgYWN0aW9uX3R5cGUgPSBoYXNoRGF0YS5hY3Rpb25fdHlwZTtcbi8vIFx0XHR2YXIgcmVsYXRlZCA9IGhhc2hEYXRhLnJlbGF0ZWQ7XG4vLyBcdFx0dmFyIGZyb21fYXBwcm92ZV9pZCA9IGhhc2hEYXRhLmZyb21fYXBwcm92ZV9pZDtcblxuLy8gXHRcdGNoZWNrKGluc3RhbmNlX2lkLCBTdHJpbmcpO1xuLy8gXHRcdGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpO1xuLy8gXHRcdGNoZWNrKGZsb3dfaWQsIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50LCBCb29sZWFuKTtcbi8vIFx0XHRjaGVjayhkZXNjcmlwdGlvbiwgU3RyaW5nKTtcbi8vIFx0XHRjaGVjayhpc0ZvcndhcmRBdHRhY2htZW50cywgQm9vbGVhbik7XG4vLyBcdFx0Y2hlY2soc2VsZWN0ZWRVc2VycywgQXJyYXkpO1xuLy8gXHRcdGNoZWNrKGFjdGlvbl90eXBlLCBNYXRjaC5PbmVPZignZm9yd2FyZCcsICdkaXN0cmlidXRlJykpO1xuXG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09IFwiZGlzdHJpYnV0ZVwiKVxuLy8gXHRcdFx0Y2hlY2soZnJvbV9hcHByb3ZlX2lkLCBTdHJpbmcpO1xuXG4vLyBcdFx0dmFyIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlX2lkKTtcbi8vIFx0XHR2YXIgb2xkX3NwYWNlX2lkID0gaW5zLnNwYWNlO1xuXG4vLyBcdFx0dmFyIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGZsb3dfaWQpO1xuXG4vLyBcdFx0dmFyIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpO1xuXG4vLyBcdFx0aWYgKCFpbnMgfHwgIWZsb3cgfHwgIXNwYWNlKSB7XG4vLyBcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdwYXJhbXMgZXJyb3IhJywgJ3JlY29yZCBub3QgZXhpc3RzIScpO1xuLy8gXHRcdH1cblxuLy8gXHRcdHZhciBmb3J3YXJkX3VzZXJzID0gbmV3IEFycmF5O1xuLy8gXHRcdGlmIChfLmlzRW1wdHkoc2VsZWN0ZWRVc2VycykpIHtcbi8vIFx0XHRcdGZvcndhcmRfdXNlcnMgPSBbY3VycmVudF91c2VyX2lkXTtcbi8vIFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0Zm9yd2FyZF91c2VycyA9IHNlbGVjdGVkVXNlcnM7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8g5qCh6aqM5YiG5Y+R5a+56LGh5piv5ZCm5pyJ5YiG5Y+R5rWB56iL55qE5o+Q5Lqk5p2D6ZmQXG4vLyBcdFx0dmFyIG5vX3Blcm1pc3Npb25fdXNlcl9pZHMgPSBuZXcgQXJyYXkoKTtcbi8vIFx0XHRfLmVhY2goZm9yd2FyZF91c2VycywgZnVuY3Rpb24gKHVpZCkge1xuLy8gXHRcdFx0dmFyIHBlcm1pc3Npb25zID0gcGVybWlzc2lvbk1hbmFnZXIuZ2V0Rmxvd1Blcm1pc3Npb25zKGZsb3dfaWQsIHVpZCk7XG4vLyBcdFx0XHRpZiAoIXBlcm1pc3Npb25zLmluY2x1ZGVzKFwiYWRkXCIpKSB7XG4vLyBcdFx0XHRcdC8vIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi6K+l55Sz6K+35Lq65rKh5pyJ5o+Q5Lqk5q2k55Sz6K+35Y2V55qE5p2D6ZmQ44CCXCIpXG4vLyBcdFx0XHRcdG5vX3Blcm1pc3Npb25fdXNlcl9pZHMucHVzaCh1aWQpO1xuLy8gXHRcdFx0fVxuLy8gXHRcdH0pXG4vLyBcdFx0aWYgKCFfLmlzRW1wdHkobm9fcGVybWlzc2lvbl91c2VyX2lkcykpIHtcbi8vIFx0XHRcdHZhciBub19wZXJtaXNzaW9uX3VzZXJzX25hbWUgPSBuZXcgQXJyYXkoKTtcbi8vIFx0XHRcdGRiLnVzZXJzLmZpbmQoe1xuLy8gXHRcdFx0XHRfaWQ6IHtcbi8vIFx0XHRcdFx0XHQkaW46IG5vX3Blcm1pc3Npb25fdXNlcl9pZHNcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHRmaWVsZHM6IHtcbi8vIFx0XHRcdFx0XHRuYW1lOiAxXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pLmZvckVhY2goZnVuY3Rpb24gKHUpIHtcbi8vIFx0XHRcdFx0bm9fcGVybWlzc2lvbl91c2Vyc19uYW1lLnB1c2godS5uYW1lKTtcbi8vIFx0XHRcdH0pO1xuLy8gXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignbm9fcGVybWlzc2lvbicsIFwi6K+l5o+Q5Lqk5Lq65rKh5pyJ5o+Q5Lqk5q2k55Sz6K+35Y2V55qE5p2D6ZmQ44CCXCIsIG5vX3Blcm1pc3Npb25fdXNlcnNfbmFtZS5qb2luKCcsJykpXG4vLyBcdFx0fVxuXG4vLyBcdFx0dmFyIG5ld19pbnNfaWRzID0gbmV3IEFycmF5O1xuXG4vLyBcdFx0dmFyIGN1cnJlbnRfdHJhY2UgPSBudWxsO1xuLy8gXHRcdGlmIChhY3Rpb25fdHlwZSA9PSBcImRpc3RyaWJ1dGVcIikge1xuLy8gXHRcdFx0Xy5lYWNoKGlucy50cmFjZXMsIGZ1bmN0aW9uICh0KSB7XG4vLyBcdFx0XHRcdGlmICghY3VycmVudF90cmFjZSkge1xuLy8gXHRcdFx0XHRcdF8uZWFjaCh0LmFwcHJvdmVzLCBmdW5jdGlvbiAoYSkge1xuLy8gXHRcdFx0XHRcdFx0aWYgKCFjdXJyZW50X3RyYWNlKSB7XG4vLyBcdFx0XHRcdFx0XHRcdGlmIChhLl9pZCA9PSBmcm9tX2FwcHJvdmVfaWQpXG4vLyBcdFx0XHRcdFx0XHRcdFx0Y3VycmVudF90cmFjZSA9IHQ7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSlcbi8vIFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0Y3VycmVudF90cmFjZSA9IF8ubGFzdChpbnMudHJhY2VzKTtcbi8vIFx0XHR9XG4vLyBcdFx0dmFyIGN1cnJlbnRfdHJhY2VfaWQgPSBjdXJyZW50X3RyYWNlLl9pZDtcbi8vIFx0XHR2YXIgZm9yd2FyZF9hcHByb3ZlcyA9IFtdO1xuLy8gXHRcdHZhciBmcm9tX3VzZXJfbmFtZSA9IGRiLnVzZXJzLmZpbmRPbmUoY3VycmVudF91c2VyX2lkLCB7XG4vLyBcdFx0XHRmaWVsZHM6IHtcbi8vIFx0XHRcdFx0bmFtZTogMVxuLy8gXHRcdFx0fVxuLy8gXHRcdH0pLm5hbWVcbi8vIFx0XHR2YXIgc2V0X29iaiA9IG5ldyBPYmplY3Q7XG5cbi8vIFx0XHQvLyDorqHnrpd2YWx1ZXNcbi8vIFx0XHR2YXIgb2xkX3ZhbHVlcyA9IGlucy52YWx1ZXMsXG4vLyBcdFx0XHRuZXdfdmFsdWVzID0ge307XG4vLyBcdFx0dmFyIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGZsb3cuZm9ybSk7XG4vLyBcdFx0dmFyIGZpZWxkcyA9IGZvcm0uY3VycmVudC5maWVsZHMgfHwgW107XG5cbi8vIFx0XHR2YXIgb2xkX2Zvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGlucy5mb3JtKTtcbi8vIFx0XHR2YXIgb2xkX2Zvcm1fdmVyc2lvbiA9IGlucy5mb3JtX3ZlcnNpb24sXG4vLyBcdFx0XHRvbGRfZmllbGRzID0gW10sXG4vLyBcdFx0XHRjb21tb25fZmllbGRzID0gW107XG5cbi8vIFx0XHR2YXIgc2VsZWN0X3RvX2lucHV0X2ZpZWxkcyA9IFtdO1xuXG4vLyBcdFx0aWYgKG9sZF9mb3JtLmN1cnJlbnQuX2lkID09IG9sZF9mb3JtX3ZlcnNpb24pIHtcbi8vIFx0XHRcdG9sZF9maWVsZHMgPSBvbGRfZm9ybS5jdXJyZW50LmZpZWxkcztcbi8vIFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0aWYgKG9sZF9mb3JtLmhpc3RvcnlzKSB7XG4vLyBcdFx0XHRcdG9sZF9mb3JtLmhpc3RvcnlzLmZvckVhY2goZnVuY3Rpb24gKGgpIHtcbi8vIFx0XHRcdFx0XHRpZiAoaC5faWQgPT0gb2xkX2Zvcm1fdmVyc2lvbilcbi8vIFx0XHRcdFx0XHRcdG9sZF9maWVsZHMgPSBoLmZpZWxkcztcbi8vIFx0XHRcdFx0fSlcbi8vIFx0XHRcdH1cbi8vIFx0XHR9XG5cbi8vIFx0XHRmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbi8vIFx0XHRcdHZhciBleGlzdHNfZmllbGQgPSBfLmZpbmQob2xkX2ZpZWxkcywgZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0cmV0dXJuIGYudHlwZSA9PSBmaWVsZC50eXBlICYmIGYuY29kZSA9PSBmaWVsZC5jb2RlO1xuLy8gXHRcdFx0fSlcbi8vIFx0XHRcdGlmIChleGlzdHNfZmllbGQpXG4vLyBcdFx0XHRcdGNvbW1vbl9maWVsZHMucHVzaChmaWVsZCk7XG4vLyBcdFx0XHR2YXIgc2VsZWN0X2lucHV0X2ZpZWxkID0gXy5maW5kKG9sZF9maWVsZHMsIGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdHJldHVybiBmLnR5cGUgPT0gJ3NlbGVjdCcgJiYgZmllbGQudHlwZSA9PSAnaW5wdXQnICYmIGYuY29kZSA9PSBmaWVsZC5jb2RlO1xuLy8gXHRcdFx0fSlcbi8vIFx0XHRcdGlmIChzZWxlY3RfaW5wdXRfZmllbGQpXG4vLyBcdFx0XHRcdHNlbGVjdF90b19pbnB1dF9maWVsZHMucHVzaChzZWxlY3RfaW5wdXRfZmllbGQpO1xuLy8gXHRcdH0pXG5cbi8vIFx0XHRzZWxlY3RfdG9faW5wdXRfZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4vLyBcdFx0XHRpZiAob2xkX3ZhbHVlc1tmaWVsZC5jb2RlXSkge1xuLy8gXHRcdFx0XHRuZXdfdmFsdWVzW2ZpZWxkLmNvZGVdID0gb2xkX3ZhbHVlc1tmaWVsZC5jb2RlXTtcbi8vIFx0XHRcdH1cbi8vIFx0XHR9KVxuXG4vLyBcdFx0Y29tbW9uX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuLy8gXHRcdFx0aWYgKGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nKSB7XG4vLyBcdFx0XHRcdGlmIChmaWVsZC5maWVsZHMpIHtcbi8vIFx0XHRcdFx0XHRmaWVsZC5maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRcdFx0Ly8g6Leo5bel5L2c5Yy66L2s5Y+R5LiN5aSN5Yi26YCJ5Lq66YCJ57uEXG4vLyBcdFx0XHRcdFx0XHRpZiAoWydncm91cCcsICd1c2VyJ10uaW5jbHVkZXMoZi50eXBlKSAmJiBvbGRfc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHtcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0dmFyIGtleSA9IGYuY29kZTtcbi8vIFx0XHRcdFx0XHRcdHZhciBvbGRfdiA9IG9sZF92YWx1ZXNba2V5XTtcbi8vIFx0XHRcdFx0XHRcdGlmIChvbGRfdikge1xuLy8gXHRcdFx0XHRcdFx0XHR2YXIgZmllbGRPcHRpb25zID0gZi5vcHRpb25zICYmIGYub3B0aW9ucy5zcGxpdCAmJiBmLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIik7XG4vLyBcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuLy8gXHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRcdC8vIOagoemqjCDljZXpgInvvIzlpJrpgInvvIzkuIvmi4nmoYYg5a2X5q615YC85piv5ZCm5Zyo5paw6KGo5Y2V5a+55bqU5a2X5q6155qE5Y+v6YCJ5YC86IyD5Zu05YaFXG4vLyBcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ3NlbGVjdCcgfHwgZi50eXBlID09ICdyYWRpbycpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaXRlbS52YWx1ZSA9PT0gb2xkX3Y7XG4vLyBcdFx0XHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0aWYoIXNlbGVjdGVkT3B0aW9uKXtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0XHRpZiAoZi50eXBlID09ICdtdWx0aVNlbGVjdCcpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgb2xkX211bHRpU2VsZWN0ZWQgPSBvbGRfdi5zcGxpdCgnLCcpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBuZXdfbXVsdGlTZWxlY3RlZCA9IF8uaW50ZXJzZWN0aW9uKGZpZWxkT3B0aW9ucy5tYXAoZnVuY3Rpb24obil7IHJldHVybiBuLnZhbHVlOyB9KSwgb2xkX211bHRpU2VsZWN0ZWQpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdG9sZF92ID0gbmV3X211bHRpU2VsZWN0ZWQuam9pbignLCcpO1xuLy8gXHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0bmV3X3ZhbHVlc1trZXldID0gb2xkX3Y7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSBlbHNlIGlmIChmaWVsZC50eXBlID09ICd0YWJsZScpIHtcbi8vIFx0XHRcdFx0aWYgKCFfLmlzRW1wdHkob2xkX3ZhbHVlc1tmaWVsZC5jb2RlXSkpIHtcbi8vIFx0XHRcdFx0XHRuZXdfdmFsdWVzW2ZpZWxkLmNvZGVdID0gbmV3IEFycmF5O1xuLy8gXHRcdFx0XHRcdG9sZF92YWx1ZXNbZmllbGQuY29kZV0uZm9yRWFjaChmdW5jdGlvbiAob2xkX3RhYmxlX3Jvd192YWx1ZXMpIHtcbi8vIFx0XHRcdFx0XHRcdHZhciBuZXdfdGFibGVfcm93X3ZhbHVlcyA9IHt9O1xuXG4vLyBcdFx0XHRcdFx0XHRpZiAoIV8uaXNFbXB0eShmaWVsZC5maWVsZHMpKSB7XG4vLyBcdFx0XHRcdFx0XHRcdGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0Ly8g6Leo5bel5L2c5Yy66L2s5Y+R5LiN5aSN5Yi26YCJ5Lq66YCJ57uEXG4vLyBcdFx0XHRcdFx0XHRcdFx0aWYgKFsnZ3JvdXAnLCAndXNlciddLmluY2x1ZGVzKGYudHlwZSkgJiYgb2xkX3NwYWNlX2lkICE9IHNwYWNlX2lkKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBrZXkgPSBmLmNvZGU7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIG9sZF92ID0gb2xkX3RhYmxlX3Jvd192YWx1ZXNba2V5XTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRpZiAob2xkX3YpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHZhciBmaWVsZE9wdGlvbnMgPSBmLm9wdGlvbnMgJiYgZi5vcHRpb25zLnNwbGl0ICYmIGYub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIik7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdC8vIOagoemqjCDljZXpgInvvIzlpJrpgInvvIzkuIvmi4nmoYYg5a2X5q615YC85piv5ZCm5Zyo5paw6KGo5Y2V5a+55bqU5a2X5q6155qE5Y+v6YCJ5YC86IyD5Zu05YaFXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZi50eXBlID09ICdzZWxlY3QnIHx8IGYudHlwZSA9PSAncmFkaW8nKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaXRlbS52YWx1ZSA9PT0gb2xkX3Y7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRpZighc2VsZWN0ZWRPcHRpb24pe1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZi50eXBlID09ICdtdWx0aVNlbGVjdCcpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIG9sZF9tdWx0aVNlbGVjdGVkID0gb2xkX3Yuc3BsaXQoJywnKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIG5ld19tdWx0aVNlbGVjdGVkID0gXy5pbnRlcnNlY3Rpb24oZmllbGRPcHRpb25zLm1hcChmdW5jdGlvbihuKXsgcmV0dXJuIG4udmFsdWU7IH0pLCBvbGRfbXVsdGlTZWxlY3RlZCk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdG9sZF92ID0gbmV3X211bHRpU2VsZWN0ZWQuam9pbignLCcpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRuZXdfdGFibGVfcm93X3ZhbHVlc1trZXldID0gb2xkX3Y7XG4vLyBcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRpZiAob2xkX3RhYmxlX3Jvd192YWx1ZXMuX2lkKSB7XG4vLyBcdFx0XHRcdFx0XHRcdG5ld190YWJsZV9yb3dfdmFsdWVzLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHI7XG4vLyBcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdGlmICghXy5pc0VtcHR5KG5ld190YWJsZV9yb3dfdmFsdWVzKSkge1xuLy8gXHRcdFx0XHRcdFx0XHRuZXdfdmFsdWVzW2ZpZWxkLmNvZGVdLnB1c2gobmV3X3RhYmxlX3Jvd192YWx1ZXMpO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRcdC8vIOi3qOW3peS9nOWMuui9rOWPkeS4jeWkjeWItumAieS6uumAiee7hFxuLy8gXHRcdFx0XHRpZiAoWydncm91cCcsICd1c2VyJ10uaW5jbHVkZXMoZmllbGQudHlwZSkgJiYgb2xkX3NwYWNlX2lkICE9IHNwYWNlX2lkKSB7XG4vLyBcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHRcdHZhciBrZXkgPSBmaWVsZC5jb2RlO1xuLy8gXHRcdFx0XHR2YXIgb2xkX3YgPSBvbGRfdmFsdWVzW2tleV07XG4vLyBcdFx0XHRcdGlmIChvbGRfdikge1xuLy8gXHRcdFx0XHRcdC8vIOagoemqjCDljZXpgInvvIzlpJrpgInvvIzkuIvmi4nmoYYg5a2X5q615YC85piv5ZCm5Zyo5paw6KGo5Y2V5a+55bqU5a2X5q6155qE5Y+v6YCJ5YC86IyD5Zu05YaFXG4vLyBcdFx0XHRcdFx0dmFyIGZpZWxkT3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMgJiYgZmllbGQub3B0aW9ucy5zcGxpdCAmJiBmaWVsZC5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKXtcbi8vIFx0XHRcdFx0XHRcdHZhciBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIik7XG4vLyBcdFx0XHRcdFx0XHRyZXR1cm4ge1xuLy8gXHRcdFx0XHRcdFx0XHRsYWJlbDogaXRlbVNwbGl0c1swXSxcbi8vIFx0XHRcdFx0XHRcdFx0dmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnIHx8IGZpZWxkLnR5cGUgPT0gJ3JhZGlvJykge1xuLy8gXHRcdFx0XHRcdFx0dmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm4gaXRlbS52YWx1ZSA9PT0gb2xkX3Y7XG4vLyBcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdGlmKCFzZWxlY3RlZE9wdGlvbil7XG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRpZiAoZmllbGQudHlwZSA9PSAnbXVsdGlTZWxlY3QnKSB7XG4vLyBcdFx0XHRcdFx0XHR2YXIgb2xkX211bHRpU2VsZWN0ZWQgPSBvbGRfdi5zcGxpdCgnLCcpO1xuLy8gXHRcdFx0XHRcdFx0dmFyIG5ld19tdWx0aVNlbGVjdGVkID0gXy5pbnRlcnNlY3Rpb24oZmllbGRPcHRpb25zLm1hcChmdW5jdGlvbihuKXsgcmV0dXJuIG4udmFsdWU7IH0pLCBvbGRfbXVsdGlTZWxlY3RlZCk7XG4vLyBcdFx0XHRcdFx0XHRvbGRfdiA9IG5ld19tdWx0aVNlbGVjdGVkLmpvaW4oJywnKTtcbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRuZXdfdmFsdWVzW2tleV0gPSBvbGRfdjtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fVxuXG4vLyBcdFx0fSlcblxuLy8gXHRcdC8v5aaC5p6c5piv5YiG5Y+R77yM5YiZdmFsdWXkuK3nmoRyZWNvcmRfbmVlZOOAgUZPTkRTSUTkuI3pnIDopoHliIblj5HliLDmlrDnlLPor7fljZXkuK1cbi8vIFx0XHRpZiAoYWN0aW9uX3R5cGUgPT09ICdkaXN0cmlidXRlJykge1xuLy8gXHRcdFx0ZGVsZXRlIG5ld192YWx1ZXMucmVjb3JkX25lZWQ7XG4vLyBcdFx0XHRkZWxldGUgbmV3X3ZhbHVlcy5GT05EU0lEO1xuLy8gXHRcdH1cblxuLy8gXHRcdC8vIOiuoeeul+eUs+ivt+WNleagh+mimFxuLy8gXHRcdHZhciBpbnN0YW5jZV9uYW1lID0gXCJcIjtcbi8vIFx0XHR2YXIgbmFtZV9mb3J1bWxhID0gZm9ybS5jdXJyZW50Lm5hbWVfZm9ydW1sYTtcbi8vIFx0XHRpZiAobmFtZV9mb3J1bWxhKSB7XG4vLyBcdFx0XHR0cnkge1xuLy8gXHRcdFx0XHR2YXIgaXNjcmlwdCA9IG5hbWVfZm9ydW1sYS5yZXBsYWNlKC9cXHsvZywgXCIobmV3X3ZhbHVlc1snXCIpLnJlcGxhY2UoL1xcfS9nLCBcIiddIHx8ICcnKVwiKTtcbi8vIFx0XHRcdFx0dmFyIHJldiA9IGV2YWwoaXNjcmlwdCk7XG4vLyBcdFx0XHRcdGluc3RhbmNlX25hbWUgPSByZXYgfHwgZmxvdy5uYW1lO1xuLy8gXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcbi8vIFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignY2FjdWxhdGVfaW5zdGFuY2VfbmFtZScsIFwi6K6h566X55Sz6K+35Y2V5qCH6aKY5Ye66ZSZ6K+35qOA5p+l6KGo5Y2V5qCH6aKY6ISa5pys44CCXCIpO1xuLy8gXHRcdFx0fVxuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRpbnN0YW5jZV9uYW1lID0gZmxvdy5uYW1lO1xuLy8gXHRcdH1cblxuLy8gXHRcdC8vIGluc3RhbmNl5Lit6K6w5b2V5b2T5YmN5q2l6aqk5ZCN56ewICMxMzE0XG4vLyBcdFx0dmFyIHN0YXJ0X3N0ZXAgPSBfLmZpbmQoZmxvdy5jdXJyZW50LnN0ZXBzLCBmdW5jdGlvbiAoc3RlcCkge1xuLy8gXHRcdFx0cmV0dXJuIHN0ZXAuc3RlcF90eXBlID09ICdzdGFydCc7XG4vLyBcdFx0fSlcblxuLy8gXHRcdC8vIOa1geeoi+i9rOWPkeWKn+iDveS/ruaUueS4uu+8jOW8gOWni+iKgueCueaciee8lui+keadg+mZkOeahOWtl+auteeahOWAvOi/m+ihjOWkjeWItu+8jOaXoOe8lui+keadg+mZkOeahOWtl+auteWAvOS4jei/m+ihjOWkjeWItiAjMzc0OFxuLy8gXHRcdGlmIChhY3Rpb25fdHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4vLyBcdFx0XHRuZXdfdmFsdWVzID0gdXVmbG93TWFuYWdlci5nZXRBcHByb3ZlVmFsdWVzKG5ld192YWx1ZXMsIHN0YXJ0X3N0ZXAucGVybWlzc2lvbnMsIGZsb3cuZm9ybSwgZmxvdy5jdXJyZW50LmZvcm1fdmVyc2lvbik7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8g5paw5bu655Sz6K+35Y2V5pe277yMaW5zdGFuY2Vz6K6w5b2V5rWB56iL5ZCN56ew44CB5rWB56iL5YiG57G75ZCN56ewICMxMzEzXG4vLyBcdFx0dmFyIGNhdGVnb3J5X25hbWUgPSBcIlwiO1xuLy8gXHRcdGlmIChmb3JtLmNhdGVnb3J5KSB7XG4vLyBcdFx0XHR2YXIgY2F0ZWdvcnkgPSB1dWZsb3dNYW5hZ2VyLmdldENhdGVnb3J5KGZvcm0uY2F0ZWdvcnkpO1xuLy8gXHRcdFx0aWYgKGNhdGVnb3J5KVxuLy8gXHRcdFx0XHRjYXRlZ29yeV9uYW1lID0gY2F0ZWdvcnkubmFtZTtcbi8vIFx0XHR9XG5cbi8vIFx0XHRfLmVhY2goZm9yd2FyZF91c2VycywgZnVuY3Rpb24gKHVzZXJfaWQpIHtcblxuLy8gXHRcdFx0dmFyIHVzZXJfaW5mbyA9IGRiLnVzZXJzLmZpbmRPbmUodXNlcl9pZCk7XG5cbi8vIFx0XHRcdHZhciBzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4vLyBcdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcbi8vIFx0XHRcdFx0dXNlcjogdXNlcl9pZFxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHRmaWVsZHM6IHtcbi8vIFx0XHRcdFx0XHRvcmdhbml6YXRpb246IDFcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSk7XG4vLyBcdFx0XHR2YXIgc3BhY2VfdXNlcl9vcmdfaW5mbyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZE9uZSh7XG4vLyBcdFx0XHRcdF9pZDogc3BhY2VfdXNlci5vcmdhbml6YXRpb25cbi8vIFx0XHRcdH0sIHtcbi8vIFx0XHRcdFx0ZmllbGRzOiB7XG4vLyBcdFx0XHRcdFx0bmFtZTogMSxcbi8vIFx0XHRcdFx0XHRmdWxsbmFtZTogMVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KTtcblxuLy8gXHRcdFx0dmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4vLyBcdFx0XHR2YXIgaW5zX29iaiA9IHt9O1xuXG4vLyBcdFx0XHR2YXIgYWdlbnQgPSB1dWZsb3dNYW5hZ2VyLmdldEFnZW50KHNwYWNlX2lkLCB1c2VyX2lkKTtcbi8vIFx0XHRcdHZhciBoYW5kbGVyX2lkID0gdXNlcl9pZDtcbi8vIFx0XHRcdHZhciBoYW5kbGVyX2luZm8gPSB1c2VyX2luZm87XG4vLyBcdFx0XHR2YXIgaGFuZGxlcl9zcGFjZV91c2VyID0gc3BhY2VfdXNlcjtcbi8vIFx0XHRcdHZhciBoYW5kbGVyX29yZ19pbmZvID0gc3BhY2VfdXNlcl9vcmdfaW5mbztcbi8vIFx0XHRcdGlmIChhZ2VudCkge1xuLy8gXHRcdFx0XHRoYW5kbGVyX2lkID0gYWdlbnQ7XG4vLyBcdFx0XHRcdGhhbmRsZXJfaW5mbyA9IGRiLnVzZXJzLmZpbmRPbmUoYWdlbnQpO1xuLy8gXHRcdFx0XHRoYW5kbGVyX3NwYWNlX3VzZXIgPSB1dWZsb3dNYW5hZ2VyLmdldFNwYWNlVXNlcihzcGFjZV9pZCwgYWdlbnQpO1xuLy8gXHRcdFx0XHRoYW5kbGVyX29yZ19pbmZvID0gdXVmbG93TWFuYWdlci5nZXRTcGFjZVVzZXJPcmdJbmZvKGhhbmRsZXJfc3BhY2VfdXNlcik7XG4vLyBcdFx0XHR9XG4vLyBcdFx0XHRpbnNfb2JqLl9pZCA9IGRiLmluc3RhbmNlcy5fbWFrZU5ld0lEKCk7XG4vLyBcdFx0XHRpbnNfb2JqLnNwYWNlID0gc3BhY2VfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmZsb3cgPSBmbG93X2lkO1xuLy8gXHRcdFx0aW5zX29iai5mbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnQuX2lkO1xuLy8gXHRcdFx0aW5zX29iai5mb3JtID0gZmxvdy5mb3JtO1xuLy8gXHRcdFx0aW5zX29iai5mb3JtX3ZlcnNpb24gPSBmbG93LmN1cnJlbnQuZm9ybV92ZXJzaW9uO1xuLy8gXHRcdFx0aW5zX29iai5uYW1lID0gaW5zdGFuY2VfbmFtZTtcbi8vIFx0XHRcdGluc19vYmouc3VibWl0dGVyID0gaGFuZGxlcl9pZDtcbi8vIFx0XHRcdGluc19vYmouc3VibWl0dGVyX25hbWUgPSBoYW5kbGVyX2luZm8ubmFtZTtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50ID0gdXNlcl9pZDtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50X25hbWUgPSB1c2VyX2luZm8ubmFtZTtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbiA9IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWUgPSBzcGFjZV91c2VyX29yZ19pbmZvLm5hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBzcGFjZV91c2VyX29yZ19pbmZvLmZ1bGxuYW1lO1xuLy8gXHRcdFx0aW5zX29iai5zdGF0ZSA9IFwiZHJhZnRcIjtcbi8vIFx0XHRcdGluc19vYmouY29kZSA9IFwiXCI7XG4vLyBcdFx0XHRpbnNfb2JqLmlzX2FyY2hpdmVkID0gZmFsc2U7XG4vLyBcdFx0XHRpbnNfb2JqLmlzX2RlbGV0ZWQgPSBmYWxzZTtcbi8vIFx0XHRcdGluc19vYmouY3JlYXRlZCA9IG5vdztcbi8vIFx0XHRcdGluc19vYmouY3JlYXRlZF9ieSA9IGN1cnJlbnRfdXNlcl9pZDtcbi8vIFx0XHRcdGluc19vYmoubW9kaWZpZWQgPSBub3c7XG4vLyBcdFx0XHRpbnNfb2JqLm1vZGlmaWVkX2J5ID0gY3VycmVudF91c2VyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5pbmJveF91c2VycyA9IFtoYW5kbGVyX2lkXTtcbi8vIFx0XHRcdGluc19vYmoudmFsdWVzID0gbmV3X3ZhbHVlcztcbi8vIFx0XHRcdGlmIChhY3Rpb25fdHlwZSA9PSAnZGlzdHJpYnV0ZScpIHtcbi8vIFx0XHRcdFx0Ly8g6Kej5Yaz5aSa5qyh5YiG5Y+R55yL5LiN5Yiw5q2j5paH44CB6ZmE5Lu26Zeu6aKYXG4vLyBcdFx0XHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlKSB7XG4vLyBcdFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgPSBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlO1xuLy8gXHRcdFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0XHRcdGluc19vYmouZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlID0gaW5zdGFuY2VfaWQ7XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzID0gXy5jbG9uZShpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG4vLyBcdFx0XHRcdGluc19vYmouZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcy5wdXNoKGluc3RhbmNlX2lkKTtcblxuLy8gXHRcdFx0XHRpZiAocmVsYXRlZCkge1xuLy8gXHRcdFx0XHRcdGluc19vYmoucmVsYXRlZF9pbnN0YW5jZXMgPSBbaW5zdGFuY2VfaWRdXG4vLyBcdFx0XHRcdH1cblxuLy8gXHRcdFx0fSBlbHNlIGlmIChhY3Rpb25fdHlwZSA9PSAnZm9yd2FyZCcpIHtcbi8vIFx0XHRcdFx0aW5zX29iai5mb3J3YXJkX2Zyb21faW5zdGFuY2UgPSBpbnN0YW5jZV9pZFxuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHQvLyDmlrDlu7pUcmFjZVxuLy8gXHRcdFx0dmFyIHRyYWNlX29iaiA9IHt9O1xuLy8gXHRcdFx0dHJhY2Vfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHI7XG4vLyBcdFx0XHR0cmFjZV9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZDtcbi8vIFx0XHRcdHRyYWNlX29iai5pc19maW5pc2hlZCA9IGZhbHNlO1xuXG4vLyBcdFx0XHQvLyDlvZPliY3mnIDmlrDniYhmbG935Lit5byA5aeL6IqC54K555qEc3RlcF9pZFxuLy8gXHRcdFx0dmFyIHN0ZXBfaWQsIHN0ZXBfbmFtZSwgY2FuX2VkaXRfbWFpbl9hdHRhY2gsIGNhbl9lZGl0X25vcm1hbF9hdHRhY2g7XG4vLyBcdFx0XHRmbG93LmN1cnJlbnQuc3RlcHMuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCkge1xuLy8gXHRcdFx0XHRpZiAoc3RlcC5zdGVwX3R5cGUgPT0gXCJzdGFydFwiKSB7XG4vLyBcdFx0XHRcdFx0c3RlcF9pZCA9IHN0ZXAuX2lkO1xuLy8gXHRcdFx0XHRcdHN0ZXBfbmFtZSA9IHN0ZXAubmFtZTtcbi8vIFx0XHRcdFx0XHRjYW5fZWRpdF9tYWluX2F0dGFjaCA9IHN0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2g7XG4vLyBcdFx0XHRcdFx0Y2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9IHN0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaDtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSlcbi8vIFx0XHRcdHRyYWNlX29iai5zdGVwID0gc3RlcF9pZDtcbi8vIFx0XHRcdHRyYWNlX29iai5zdGFydF9kYXRlID0gbm93O1xuLy8gXHRcdFx0dHJhY2Vfb2JqLm5hbWUgPSBzdGVwX25hbWU7XG5cbi8vIFx0XHRcdC8vIOaWsOW7ukFwcHJvdmVcbi8vIFx0XHRcdHZhciBhcHByX29iaiA9IHt9O1xuLy8gXHRcdFx0YXBwcl9vYmouX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cjtcbi8vIFx0XHRcdGFwcHJfb2JqLmluc3RhbmNlID0gaW5zX29iai5faWQ7XG4vLyBcdFx0XHRhcHByX29iai50cmFjZSA9IHRyYWNlX29iai5faWQ7XG4vLyBcdFx0XHRhcHByX29iai5pc19maW5pc2hlZCA9IGZhbHNlO1xuLy8gXHRcdFx0YXBwcl9vYmoudXNlciA9IHVzZXJfaWQ7XG4vLyBcdFx0XHRhcHByX29iai51c2VyX25hbWUgPSB1c2VyX2luZm8ubmFtZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXIgPSBoYW5kbGVyX2lkO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlcl9uYW1lID0gaGFuZGxlcl9pbmZvLm5hbWU7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbiA9IGhhbmRsZXJfc3BhY2VfdXNlci5vcmdhbml6YXRpb247XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lID0gaGFuZGxlcl9vcmdfaW5mby5uYW1lO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBoYW5kbGVyX29yZ19pbmZvLmZ1bGxuYW1lO1xuLy8gXHRcdFx0YXBwcl9vYmoudHlwZSA9IFwiZHJhZnRcIjtcbi8vIFx0XHRcdGFwcHJfb2JqLnN0YXJ0X2RhdGUgPSBub3c7XG4vLyBcdFx0XHRhcHByX29iai5yZWFkX2RhdGUgPSBub3c7XG4vLyBcdFx0XHRhcHByX29iai5pc19yZWFkID0gZmFsc2U7XG4vLyBcdFx0XHRhcHByX29iai5pc19lcnJvciA9IGZhbHNlO1xuXG4vLyBcdFx0XHRhcHByX29iai52YWx1ZXMgPSBuZXdfdmFsdWVzO1xuXG4vLyBcdFx0XHRpZiAoYWdlbnQpIHtcbi8vIFx0XHRcdFx0YXBwcl9vYmouYWdlbnQgPSBhZ2VudDtcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0dHJhY2Vfb2JqLmFwcHJvdmVzID0gW2FwcHJfb2JqXTtcbi8vIFx0XHRcdGluc19vYmoudHJhY2VzID0gW3RyYWNlX29ial07XG5cbi8vIFx0XHRcdGlmIChmbG93LmF1dG9fcmVtaW5kID09IHRydWUpXG4vLyBcdFx0XHRcdGluc19vYmouYXV0b19yZW1pbmQgPSB0cnVlO1xuXG4vLyBcdFx0XHRpbnNfb2JqLmN1cnJlbnRfc3RlcF9uYW1lID0gc3RhcnRfc3RlcC5uYW1lO1xuXG4vLyBcdFx0XHRpbnNfb2JqLmZsb3dfbmFtZSA9IGZsb3cubmFtZTtcbi8vIFx0XHRcdGlmIChjYXRlZ29yeV9uYW1lKSB7XG4vLyBcdFx0XHRcdGluc19vYmouY2F0ZWdvcnlfbmFtZSA9IGNhdGVnb3J5Lm5hbWU7XG4vLyBcdFx0XHRcdGluc19vYmouY2F0ZWdvcnkgPSBjYXRlZ29yeS5faWQ7XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdG5ld19pbnNfaWQgPSBkYi5pbnN0YW5jZXMuaW5zZXJ0KGluc19vYmopO1xuXG4vLyBcdFx0XHQvLyDlpI3liLbpmYTku7Zcbi8vIFx0XHRcdHZhciBjb2xsZWN0aW9uID0gY2ZzLmluc3RhbmNlcztcblxuLy8gXHRcdFx0Ly/lsIbljp/ooajljZXlhoXlrrnlrZjlgqjkuLrnrKzkuIDkuKrpmYTku7Zcbi8vIFx0XHRcdGlmIChoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQpIHtcbi8vIFx0XHRcdFx0Ly8gdHJ5IHtcblxuLy8gXHRcdFx0XHRpbnN0YW5jZUh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXJfaW5mbywgc3BhY2VfaWQsIGlucywge1xuLy8gXHRcdFx0XHRcdGFic29sdXRlOiB0cnVlLFxuLy8gXHRcdFx0XHRcdHNob3dUcmFjZTogdHJ1ZVxuLy8gXHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR2YXIgaW5zdGFuY2VGaWxlID0gbmV3IEZTLkZpbGUoKTtcbi8vIFx0XHRcdFx0aW5zdGFuY2VGaWxlLmF0dGFjaERhdGEoQnVmZmVyLmZyb20oaW5zdGFuY2VIdG1sLCBcInV0Zi04XCIpLCB7XG4vLyBcdFx0XHRcdFx0dHlwZTogXCJ0ZXh0L2h0bWxcIlxuLy8gXHRcdFx0XHR9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbi8vIFx0XHRcdFx0XHRpZiAoZXJyb3IpIHtcbi8vIFx0XHRcdFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoZXJyb3IuZXJyb3IsIGVycm9yLnJlYXNvbik7XG4vLyBcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0aW5zdGFuY2VGaWxlLm5hbWUoaW5zLm5hbWUgKyBcIi5odG1sXCIpO1xuLy8gXHRcdFx0XHRcdGluc3RhbmNlRmlsZS5zaXplKGluc3RhbmNlSHRtbC5sZW5ndGgpO1xuXG4vLyBcdFx0XHRcdFx0dmFyIG1ldGFkYXRhID0ge1xuLy8gXHRcdFx0XHRcdFx0b3duZXI6IHVzZXJfaWQsXG4vLyBcdFx0XHRcdFx0XHRvd25lcl9uYW1lOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcbi8vIFx0XHRcdFx0XHRcdGluc3RhbmNlOiBuZXdfaW5zX2lkLFxuLy8gXHRcdFx0XHRcdFx0YXBwcm92ZTogYXBwcl9vYmouX2lkLFxuLy8gXHRcdFx0XHRcdFx0Y3VycmVudDogdHJ1ZVxuLy8gXHRcdFx0XHRcdH07XG4vLyBcdFx0XHRcdFx0aW5zdGFuY2VGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4vLyBcdFx0XHRcdFx0dmFyIGZpbGVPYmogPSBjb2xsZWN0aW9uLmluc2VydChpbnN0YW5jZUZpbGUpO1xuLy8gXHRcdFx0XHRcdGZpbGVPYmoudXBkYXRlKHtcbi8vIFx0XHRcdFx0XHRcdCRzZXQ6IHtcbi8vIFx0XHRcdFx0XHRcdFx0J21ldGFkYXRhLnBhcmVudCc6IGZpbGVPYmouX2lkXG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0fSlcblxuLy8gXHRcdFx0XHQvLyB9IGNhdGNoIChlKSB7XG4vLyBcdFx0XHRcdC8vICAgICBjb25zb2xlLmVycm9yKGUpO1xuLy8gXHRcdFx0XHQvLyB9XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdGlmIChpc0ZvcndhcmRBdHRhY2htZW50cyAmJiBhY3Rpb25fdHlwZSA9PSAnZm9yd2FyZCcpIHtcbi8vIFx0XHRcdFx0dmFyIGZpbGVzID0gY29sbGVjdGlvbi5maW5kKHtcbi8vIFx0XHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnN0YW5jZV9pZCxcbi8vIFx0XHRcdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWVcbi8vIFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0XHQvLyDliKTmlq3mlrDnmoTmtYHnqIvlvIDlp4voioLngrnmmK/lkKbmnInnvJbovpHmraPmloflkoznvJbovpHpmYTku7bmnYPpmZBcbi8vIFx0XHRcdFx0XHRpZiAoZi5tZXRhZGF0YS5tYWluID09IHRydWUpIHtcbi8vIFx0XHRcdFx0XHRcdGlmIChjYW5fZWRpdF9tYWluX2F0dGFjaCAhPSB0cnVlICYmIGNhbl9lZGl0X25vcm1hbF9hdHRhY2ggIT0gdHJ1ZSlcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRcdFx0XHRpZiAoY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCAhPSB0cnVlKVxuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0dmFyIG5ld0ZpbGUgPSBuZXcgRlMuRmlsZSgpO1xuLy8gXHRcdFx0XHRcdG5ld0ZpbGUuYXR0YWNoRGF0YShmLmNyZWF0ZVJlYWRTdHJlYW0oJ2luc3RhbmNlcycpLCB7XG4vLyBcdFx0XHRcdFx0XHR0eXBlOiBmLm9yaWdpbmFsLnR5cGVcbi8vIFx0XHRcdFx0XHR9LCBmdW5jdGlvbiAoZXJyKSB7XG4vLyBcdFx0XHRcdFx0XHRpZiAoZXJyKSB7XG4vLyBcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoZXJyLmVycm9yLCBlcnIucmVhc29uKTtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdG5ld0ZpbGUubmFtZShmLm5hbWUoKSk7XG4vLyBcdFx0XHRcdFx0XHRuZXdGaWxlLnNpemUoZi5zaXplKCkpO1xuLy8gXHRcdFx0XHRcdFx0dmFyIG1ldGFkYXRhID0ge1xuLy8gXHRcdFx0XHRcdFx0XHRvd25lcjogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHRcdFx0b3duZXJfbmFtZTogdXNlcl9pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcbi8vIFx0XHRcdFx0XHRcdFx0aW5zdGFuY2U6IG5ld19pbnNfaWQsXG4vLyBcdFx0XHRcdFx0XHRcdGFwcHJvdmU6IGFwcHJfb2JqLl9pZCxcbi8vIFx0XHRcdFx0XHRcdFx0Y3VycmVudDogdHJ1ZVxuLy8gXHRcdFx0XHRcdFx0fTtcbi8vIFx0XHRcdFx0XHRcdGlmIChmLm1ldGFkYXRhLm1haW4gPT0gdHJ1ZSAmJiBjYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlKSB7XG4vLyBcdFx0XHRcdFx0XHRcdG1ldGFkYXRhLm1haW4gPSB0cnVlO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0bmV3RmlsZS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuLy8gXHRcdFx0XHRcdFx0dmFyIGZpbGVPYmogPSBjb2xsZWN0aW9uLmluc2VydChuZXdGaWxlKTtcbi8vIFx0XHRcdFx0XHRcdGZpbGVPYmoudXBkYXRlKHtcbi8vIFx0XHRcdFx0XHRcdFx0JHNldDoge1xuLy8gXHRcdFx0XHRcdFx0XHRcdCdtZXRhZGF0YS5wYXJlbnQnOiBmaWxlT2JqLl9pZFxuLy8gXHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHRcdH0pXG5cbi8vIFx0XHRcdFx0fSlcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0aWYgKGFjdGlvbl90eXBlID09PSAnZGlzdHJpYnV0ZScpIHtcbi8vIFx0XHRcdFx0Ly8g57uZ5b2T5YmN55qE55Sz6K+35Y2V5aKe5Yqg5YiG5Y+R6K6w5b2VXG4vLyBcdFx0XHRcdHZhciBhcHByID0ge1xuLy8gXHRcdFx0XHRcdCdfaWQnOiBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyLFxuLy8gXHRcdFx0XHRcdCdpbnN0YW5jZSc6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcdCd0cmFjZSc6IGN1cnJlbnRfdHJhY2VfaWQsXG4vLyBcdFx0XHRcdFx0J2lzX2ZpbmlzaGVkJzogdHJ1ZSxcbi8vIFx0XHRcdFx0XHQndXNlcic6IHVzZXJfaWQsXG4vLyBcdFx0XHRcdFx0J3VzZXJfbmFtZSc6IHVzZXJfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyJzogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9uYW1lJzogdXNlcl9pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXJfb3JnYW5pemF0aW9uJzogc3BhY2VfdXNlci5vcmdhbml6YXRpb24sXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUnOiBzcGFjZV91c2VyX29yZ19pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lJzogc3BhY2VfdXNlcl9vcmdfaW5mby5mdWxsbmFtZSxcbi8vIFx0XHRcdFx0XHQndHlwZSc6IGFjdGlvbl90eXBlLFxuLy8gXHRcdFx0XHRcdCdzdGFydF9kYXRlJzogbmV3IERhdGUoKSxcbi8vIFx0XHRcdFx0XHQnZmluaXNoX2RhdGUnOiBuZXcgRGF0ZSgpLFxuLy8gXHRcdFx0XHRcdCdpc19yZWFkJzogZmFsc2UsXG4vLyBcdFx0XHRcdFx0J2p1ZGdlJzogJ3N1Ym1pdHRlZCcsXG4vLyBcdFx0XHRcdFx0J2Zyb21fdXNlcic6IGN1cnJlbnRfdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHQnZnJvbV91c2VyX25hbWUnOiBmcm9tX3VzZXJfbmFtZSxcbi8vIFx0XHRcdFx0XHQnZm9yd2FyZF9zcGFjZSc6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHRcdCdmb3J3YXJkX2luc3RhbmNlJzogbmV3X2luc19pZCxcbi8vIFx0XHRcdFx0XHQnZGVzY3JpcHRpb24nOiBkZXNjcmlwdGlvbixcbi8vIFx0XHRcdFx0XHQnZnJvbV9hcHByb3ZlX2lkJzogZnJvbV9hcHByb3ZlX2lkXG4vLyBcdFx0XHRcdH07XG5cbi8vIFx0XHRcdFx0Zm9yd2FyZF9hcHByb3Zlcy5wdXNoKGFwcHIpO1xuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHRuZXdfaW5zX2lkcy5wdXNoKG5ld19pbnNfaWQpO1xuLy8gXHRcdFx0cHVzaE1hbmFnZXIuc2VuZF9tZXNzYWdlX3RvX3NwZWNpZnlVc2VyKFwiY3VycmVudF91c2VyXCIsIHVzZXJfaWQpO1xuLy8gXHRcdH0pXG5cbi8vIFx0XHRpZiAoIV8uaXNFbXB0eShmb3J3YXJkX2FwcHJvdmVzKSkge1xuLy8gXHRcdFx0c2V0X29iai5tb2RpZmllZCA9IG5ldyBEYXRlKCk7XG4vLyBcdFx0XHRzZXRfb2JqLm1vZGlmaWVkX2J5ID0gY3VycmVudF91c2VyX2lkO1xuLy8gXHRcdFx0dmFyIHIgPSBkYi5pbnN0YW5jZXMudXBkYXRlKHtcbi8vIFx0XHRcdFx0X2lkOiBpbnN0YW5jZV9pZCxcbi8vIFx0XHRcdFx0XCJ0cmFjZXMuX2lkXCI6IGN1cnJlbnRfdHJhY2VfaWRcbi8vIFx0XHRcdH0sIHtcbi8vIFx0XHRcdFx0JHNldDogc2V0X29iaixcbi8vIFx0XHRcdFx0JGFkZFRvU2V0OiB7XG4vLyBcdFx0XHRcdFx0J3RyYWNlcy4kLmFwcHJvdmVzJzoge1xuLy8gXHRcdFx0XHRcdFx0JGVhY2g6IGZvcndhcmRfYXBwcm92ZXNcbi8vIFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pO1xuLy8gXHRcdH1cblxuXG4vLyBcdFx0aWYgKHIpIHtcbi8vIFx0XHRcdF8uZWFjaChjdXJyZW50X3RyYWNlLmFwcHJvdmVzLCBmdW5jdGlvbiAoYSwgaWR4KSB7XG4vLyBcdFx0XHRcdGlmIChhLl9pZCA9PSBmcm9tX2FwcHJvdmVfaWQpIHtcbi8vIFx0XHRcdFx0XHR2YXIgdXBkYXRlX3JlYWQgPSB7fTtcbi8vIFx0XHRcdFx0XHR1cGRhdGVfcmVhZFtcInRyYWNlcy4kLmFwcHJvdmVzLlwiICsgaWR4ICsgXCIucmVhZF9kYXRlXCJdID0gbmV3IERhdGUoKTtcbi8vIFx0XHRcdFx0XHRkYi5pbnN0YW5jZXMudXBkYXRlKHtcbi8vIFx0XHRcdFx0XHRcdF9pZDogaW5zdGFuY2VfaWQsXG4vLyBcdFx0XHRcdFx0XHRcInRyYWNlcy5faWRcIjogY3VycmVudF90cmFjZV9pZFxuLy8gXHRcdFx0XHRcdH0sIHtcbi8vIFx0XHRcdFx0XHRcdCRzZXQ6IHVwZGF0ZV9yZWFkXG4vLyBcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pXG5cbi8vIFx0XHR9XG5cbi8vIFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyBcdFx0XHRjb2RlOiAyMDAsXG4vLyBcdFx0XHRkYXRhOiB7IG5ld19pbnNfaWRzOiBuZXdfaW5zX2lkcyB9XG4vLyBcdFx0fSlcbi8vIFx0fSBjYXRjaCAoZSkge1xuLy8gXHRcdGNvbnNvbGUuZXJyb3IoZS5zdGFjaylcbi8vIFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyBcdFx0XHRjb2RlOiAyMDAsXG4vLyBcdFx0XHRkYXRhOiB7XG4vLyBcdFx0XHRcdGVycm9yczogW2VdXG4vLyBcdFx0XHR9XG4vLyBcdFx0fSlcbi8vIFx0fVxuXG4vLyB9KSIsImlmIHByb2Nlc3MuZW52LkNSRUFUT1JfTk9ERV9FTlYgPT0gJ2RldmVsb3BtZW50J1xuICAgIEpzb25Sb3V0ZXMuYWRkICdwb3N0JywgJy90ZXN0L3dlYmhvb2snLCAocmVxLCByZXMsIG5leHQpIC0+XG4gICAgICAgIHRyeVxuXG4gICAgICAgICAgICBoYXNoRGF0YSA9IHJlcS5ib2R5XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAnYWN0aW9uOiAnLCBoYXNoRGF0YS5hY3Rpb25cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICdmcm9tX3VzZXI6ICcsIGhhc2hEYXRhLmZyb21fdXNlclxuICAgICAgICAgICAgY29uc29sZS5sb2cgJ3RvX3VzZXJzOiAnLCBoYXNoRGF0YS50b191c2Vyc1xuXG5cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IDIwMFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fVxuICAgICAgICBjYXRjaCBlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yIGUuc3RhY2tcbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICAgICAgY29kZTogMjAwXG4gICAgICAgICAgICAgICAgZGF0YTogeyBlcnJvcnM6IFt7ZXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2V9XSB9IiwiaWYgKHByb2Nlc3MuZW52LkNSRUFUT1JfTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgSnNvblJvdXRlcy5hZGQoJ3Bvc3QnLCAnL3Rlc3Qvd2ViaG9vaycsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgdmFyIGUsIGhhc2hEYXRhO1xuICAgIHRyeSB7XG4gICAgICBoYXNoRGF0YSA9IHJlcS5ib2R5O1xuICAgICAgY29uc29sZS5sb2coJ2FjdGlvbjogJywgaGFzaERhdGEuYWN0aW9uKTtcbiAgICAgIGNvbnNvbGUubG9nKCdmcm9tX3VzZXI6ICcsIGhhc2hEYXRhLmZyb21fdXNlcik7XG4gICAgICBjb25zb2xlLmxvZygndG9fdXNlcnM6ICcsIGhhc2hEYXRhLnRvX3VzZXJzKTtcbiAgICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgZGF0YToge31cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlID0gZXJyb3I7XG4gICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogMjAwLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZS5tZXNzYWdlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdHNldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmU6IChpbnNfaWQsIHN0ZXBfYXBwcm92ZSwgc3RlcHNBcHByb3Zlc09wdGlvbnMpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnNldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHRzZXRfaW5zdGFuY2Vfc2tpcF9zdGVwczogKGluc19pZCwgc3RlcElkLCBhY3Rpb24pLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnNldF9pbnN0YW5jZV9za2lwX3N0ZXBzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yMiAxNToxODo1OVxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuY29uc3QgeyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzKHtcblxuXHRnZXRfaW5zdGFuY2VfZGF0YTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBmb3JtQ2FjaGVkLCBmbG93Q2FjaGVkKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfaW5zdGFuY2VfZGF0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cblxufSk7XG4iLCJjb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXG5cdGRyYWZ0X3NhdmVfaW5zdGFuY2U6IGZ1bmN0aW9uIChpbnMpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmRyYWZ0X3NhdmVfaW5zdGFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGluYm94X3NhdmVfaW5zdGFuY2U6IGZ1bmN0aW9uIChhcHByb3ZlKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5pbmJveF9zYXZlX2luc3RhbmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fVxuXG59KSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMy0wMS0xMyAxNzozNToxM1xuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIzLTAzLTExIDEwOjUxOjI5XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXHRjY19kbzogZnVuY3Rpb24gKGFwcHJvdmUsIGNjX3VzZXJfaWRzLCBkZXNjcmlwdGlvbikge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2NfZG8uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3JlYWQ6IGZ1bmN0aW9uIChhcHByb3ZlKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19yZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjY19zdWJtaXQ6IGZ1bmN0aW9uIChpbnNfaWQsIGRlc2NyaXB0aW9uLCBteUFwcHJvdmUsIGNjSGFzRWRpdFBlcm1pc3Npb24pIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3N1Ym1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2NfcmVtb3ZlOiBmdW5jdGlvbiAoaW5zdGFuY2VJZCwgYXBwcm92ZUlkKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19yZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGJhdGNoX2NhbmNlbF9jYzogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBhcHByb3ZlX2lkcykge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuYmF0Y2hfY2FuY2VsX2NjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjY19zYXZlOiBmdW5jdGlvbiAoaW5zX2lkLCBkZXNjcmlwdGlvbiwgbXlBcHByb3ZlLCBjY0hhc0VkaXRQZXJtaXNzaW9uKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19zYXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fVxufSkiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yMiAxNToxODozOFxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuY29uc3QgeyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzKHtcblx0Ly8g5pS55Li66YCa6L+HYXBp6LCD55SoXG5cdGZvcndhcmRfaW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0YW5jZV9pZCwgc3BhY2VfaWQsIGZsb3dfaWQsIGhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudCwgZGVzY3JpcHRpb24sIGlzRm9yd2FyZEF0dGFjaG1lbnRzLCBzZWxlY3RlZFVzZXJzLCBhY3Rpb25fdHlwZSwgcmVsYXRlZCwgZnJvbV9hcHByb3ZlX2lkKSB7XG5cdFx0aWYgKCF0aGlzLnVzZXJJZClcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ25vdC1hdXRob3JpemVkJyk7XG5cblx0XHRyZXR1cm47XG5cdH0sXG5cblxuXHRmb3J3YXJkX3JlbW92ZTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCB0cmFjZV9pZCwgYXBwcm92ZV9pZCkge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZm9yd2FyZF9yZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNhbmNlbERpc3RyaWJ1dGU6IGZ1bmN0aW9uIChpbnN0YW5jZV9pZCwgYXBwcm92ZV9pZHMpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNhbmNlbERpc3RyaWJ1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG5cblxufSkiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yMiAxNToxNzo1NFxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuY29uc3QgeyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzKHtcbiAgICBjZnNfaW5zdGFuY2VzX3JlbW92ZTogZnVuY3Rpb24gKGZpbGVfaWQpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jZnNfaW5zdGFuY2VzX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfSxcblxuICAgIGNmc19pbnN0YW5jZXNfc2V0X2N1cnJlbnQ6IGZ1bmN0aW9uIChmaWxlX2lkKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfSxcblxuICAgIGNmc19pbnN0YW5jZXNfbG9jazogZnVuY3Rpb24gKGZpbGVfaWQsIHVzZXJfaWQsIHVzZXJfbmFtZSkge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNmc19pbnN0YW5jZXNfbG9jay5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfSxcblxuICAgIGNmc19pbnN0YW5jZXNfdW5sb2NrOiBmdW5jdGlvbiAoZmlsZV9pZCkge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNmc19pbnN0YW5jZXNfdW5sb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgZG93bmxvYWRfc3BhY2VfaW5zdGFuY2VfYXR0YWNobWVudHNfdG9fZGlzazogZnVuY3Rpb24gKHNwYWNlSWQsIGNmc1JlY29yZElkcykge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmRvd25sb2FkX3NwYWNlX2luc3RhbmNlX2F0dGFjaG1lbnRzX3RvX2Rpc2suYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbn0pIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdHNldF9hcHByb3ZlX2hhdmVfcmVhZDogKGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnNldF9hcHByb3ZlX2hhdmVfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0Y2hhbmdlX2FwcHJvdmVfaW5mbzogKGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgZGVzY3JpcHRpb24sIGZpbmlzaF9kYXRlKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2hhbmdlX2FwcHJvdmVfaW5mby5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0dXBkYXRlX2FwcHJvdmVfc2lnbjogKGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgc2lnbl9maWVsZF9jb2RlLCBkZXNjcmlwdGlvbiwgc2lnbl90eXBlLCBsYXN0U2lnbkFwcHJvdmUpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZV9hcHByb3ZlX3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cblx0dXBkYXRlX3NpZ25fc2hvdzogKG9ianMsIG15QXBwcm92ZV9pZCkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZV9zaWduX3Nob3cuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGluc3RhbmNlX3JldHVybjogKGFwcHJvdmUsIHJlYXNvbiktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaW5zdGFuY2VfcmV0dXJuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0aW5zdGFuY2VfcmVtaW5kOiAocmVtaW5kX3VzZXJzLCByZW1pbmRfY291bnQsIHJlbWluZF9kZWFkbGluZSwgaW5zdGFuY2VfaWQsIGFjdGlvbl90eXBlcywgdHJhY2VfaWQpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluc3RhbmNlX3JlbWluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0bmV4dF9zdGVwX3VzZXJzX25vdF9mb3VuZDogKGRlYWxfdHlwZSwgc3RlcF9uYW1lLCBwYXJhbXMpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5uZXh0X3N0ZXBfdXNlcnNfbm90X2ZvdW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5fZXZhbCA9IHJlcXVpcmUoJ2V2YWwnKVxuXG5NZXRlb3IubWV0aG9kc1xuXHRpbnN0YW5jZU51bWJlckJ1aWxkZXI6IChzcGFjZUlkLCBuYW1lKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5pbnN0YW5jZU51bWJlckJ1aWxkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGNoZWNrX21haW5fYXR0YWNoOiAoaW5zX2lkLCBuYW1lKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jaGVja19tYWluX2F0dGFjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0cmVtb3ZlX3JlbGF0ZWQ6IChpbnNfaWQsIHJlX2luc19pZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMucmVtb3ZlX3JlbGF0ZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdHVwZGF0ZV9pbnN0YW5jZV9yZWxhdGVkOiAoaW5zX2lkLCByZWxhdGVkX2luc3RhbmNlcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlX2luc3RhbmNlX3JlbGF0ZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdHVwZGF0ZUZsb3dQb3NpdGlvbjogKGRhdGEpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVGbG93UG9zaXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdHVwZGF0ZUZsb3dSb2xlOiAoZGF0YSkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZUZsb3dSb2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0c3RhcnRfZmxvdzogKHNwYWNlLCBmbG93SWQsIHN0YXJ0KSAtPlxuXG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5zdGFydF9mbG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGdldF9pbnN0YW5jZV90cmFjZXM6IChpbnNfaWQpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9pbnN0YW5jZV90cmFjZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHQnZ2V0X2JhdGNoX2luc3RhbmNlcyc6IChzcGFjZSwgY2F0ZWdvcnlJZCwgZmxvd0lkcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2JhdGNoX2luc3RhbmNlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0J2dldF9iYXRjaF9pbnN0YW5jZXNfY291bnQnOiAoc3BhY2UsIGNhdGVnb3J5SWQsIGZsb3dJZHMpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9iYXRjaF9pbnN0YW5jZXNfY291bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdCdnZXRfbXlfYXBwcm92ZXMnOiAoaW5zdGFuY2VJZHMpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9teV9hcHByb3Zlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblxuXG5cblxuXG5cblxuXG5cblxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGNoYW5nZV9mbG93X3N0YXRlOiAoZmxvd3MpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jaGFuZ2VfZmxvd19zdGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblxuXG5cbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXG5cdGhpZGVfaW5zdGFuY2U6IChpbnNJZCwgaXNfaGlkZGVuKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaGlkZV9pbnN0YW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Z2V0SW5zdGFuY2VWYWx1ZXM6IChpbnNJZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0SW5zdGFuY2VWYWx1ZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsIkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKVxuXG5nZXRJbnN0YW5jZVJlYWRPbmx5ID0gKHJlcSwgcmVzLCBuZXh0LCBvcHRpb25zKSAtPlxuXG5cdHVzZXIgPSBTdGVlZG9zLmdldEFQSUxvZ2luVXNlcihyZXEsIHJlcylcblxuXHRpZiByZXE/LnF1ZXJ5Py5hY2Nlc3NfdG9rZW5cblx0XHR1c2VySWQgPSBTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbihyZXEucXVlcnkuYWNjZXNzX3Rva2VuKVxuXHRcdGlmIHVzZXJJZFxuXHRcdFx0dXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtfaWQ6IHVzZXJJZH0pXG5cblx0c3BhY2VJZCA9IHJlcS5wYXJhbXMuc3BhY2VcblxuXHRpbnN0YW5jZUlkID0gcmVxLnBhcmFtcy5pbnN0YW5jZV9pZFxuXG5cdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VJZH0pO1xuXG5cdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoe19pZDogc3BhY2VJZH0pO1xuXG5cdGhpZGVfdHJhY2VzID0gcmVxLnF1ZXJ5Py5oaWRlX3RyYWNlc1xuXG5cdGlmICFvcHRpb25zXG5cdFx0b3B0aW9ucyA9IHtzaG93VHJhY2U6IHRydWV9XG5cdGVsc2Vcblx0XHRvcHRpb25zLnNob3dUcmFjZSA9IHRydWVcblxuXHRpZiBoaWRlX3RyYWNlcyBpcyBcIjFcIlxuXHRcdGlmIG9wdGlvbnNcblx0XHRcdG9wdGlvbnMuc2hvd1RyYWNlID0gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRvcHRpb25zID0ge3Nob3dUcmFjZTogZmFsc2V9XG5cblx0aWYgIW9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzXG5cdFx0b3B0aW9ucy5zaG93QXR0YWNobWVudHMgPSB0cnVlXG5cblx0aWYgIXNwYWNlXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc3BhY2VcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGlmICAhaW5zdGFuY2Vcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBpbnN0YW5jZVwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aWYgIXVzZXJcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLUF1dGgtVG9rZW4sWC1Vc2VyLUlkXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRpZiBpbnN0YW5jZS5zcGFjZSAhPSBzcGFjZUlkXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc3BhY2Ugb3IgaW5zdGFuY2VcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cblxuXHRzcGFjZVVzZXJDb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoeyB1c2VyOiB1c2VyLl9pZCwgc3BhY2U6IHNwYWNlSWQgfSkuY291bnQoKVxuXG5cdGlmIHNwYWNlVXNlckNvdW50IGlzIDBcblx0XHRpZiAhc3BhY2Vcblx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNhcGNlVXNlclwiLFxuXHRcdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdFx0cmV0dXJuO1xuXG5cdCPmoKHpqox1c2Vy5piv5ZCm5a+5aW5zdGFuY2XmnInmn6XnnIvmnYPpmZBcblx0X2hhc1Blcm1pc3Npb24gPSBXb3JrZmxvd01hbmFnZXIuaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyh1c2VyLCBpbnN0YW5jZSlcblxuXHRpZiAhX2hhc1Blcm1pc3Npb24gICYmIGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZVxuXHRcdF9wYXJlbnRfaW5zdGFuY2VzID0gXy51bmlvbihbaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlXSwgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcyB8fCBbXSlcblxuXHRcdF9oYXNQZXJtaXNzaW9uID0gXy5maW5kIF9wYXJlbnRfaW5zdGFuY2VzLCAoX3BhcmVudF9pZCktPlxuXHRcdFx0X3BhcmVudF9pbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOl9wYXJlbnRfaWR9LCB7ZmllbGRzOiB7dHJhY2VzOiAwfX0pXG5cblx0XHRcdHJldHVybiBXb3JrZmxvd01hbmFnZXIuaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyh1c2VyLCBfcGFyZW50X2lucylcblxuXHRpZiAhX2hhc1Blcm1pc3Npb25cblx0XHRfbG9jYWxlID0gU3RlZWRvcy5sb2NhbGUodXNlci5faWQsIHRydWUpXG5cdFx0ZXJyb3IgPSBUQVBpMThuLl9fKFwiaW5zdGFuY2VfcGVybWlzc2lvbnNfZXJyb3JcIiwge30sIF9sb2NhbGUpXG5cdFx0cmVzLmNoYXJzZXQgPSBcInV0Zi04XCJcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBlcnJvcixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucylcblx0ZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbCk7XG5cdHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcblx0cmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBkYXRhQnVmLmxlbmd0aClcblx0cmVzLnNldEhlYWRlcignY29udGVudC1yYW5nZScsIFwiYnl0ZXMgMC0je2RhdGFCdWYubGVuZ3RoIC0gMX0vI3tkYXRhQnVmLmxlbmd0aH1cIilcblx0cmVzLnN0YXR1c0NvZGUgPSAyMDBcblx0cmVzLmVuZChodG1sKVxuXG5Kc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9yZWFkb25seS86aW5zdGFuY2VfaWRcIiwgZ2V0SW5zdGFuY2VSZWFkT25seVxuXG5Kc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9yZWFkb25seS86aW5zdGFuY2VfaWQvOmluc3RhbmNlX25hbWVcIiwgKHJlcSwgcmVzLCBuZXh0KS0+XG5cdHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQnKTtcblx0cmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50O2ZpbGVuYW1lPScrZW5jb2RlVVJJKHJlcS5wYXJhbXMuaW5zdGFuY2VfbmFtZSkpO1xuXHRyZXMuc2V0SGVhZGVyKCdUcmFuc2Zlci1FbmNvZGluZycsICcnKVxuXG5cdG9wdGlvbnMgPSB7YWJzb2x1dGU6IHRydWV9XG5cblx0cmV0dXJuIGdldEluc3RhbmNlUmVhZE9ubHkocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpXG4jIyNcblx06I635Y+W55Sz6K+35Y2V5YiX6KGo77yaXG4gICAgZmluYWxfZGVjaXNpb27vvJrlrqHmibnnu5PmnpxcbiAgICBzdGF0ZTog55Sz6K+35Y2V54q25oCBXG4jIyNcbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL2FwaS93b3JrZmxvdy9pbnN0YW5jZXNcIiwgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXG5cdGlmICFTdGVlZG9zLkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2socmVxLCByZXMpXG5cdFx0cmV0dXJuIDtcblxuXHR1c2VyX2lkID0gcmVxLnVzZXJJZFxuXG5cdHNwYWNlSWQgPSByZXEuaGVhZGVyc1tcIngtc3BhY2UtaWRcIl1cblxuXHRpZiBub3Qgc3BhY2VJZFxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtU3BhY2UtSWRcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGZsb3dJZCA9IHJlcS5xdWVyeT8uZmxvd0lkXG5cblx0aWYgIWZsb3dJZFxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDAsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGZsb3dJZFwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0cXVlcnkgPSB7fVxuXG5cdHJldF9zeW5jX3Rva2VuID0gbmV3IERhdGUoKS5nZXRUaW1lKClcblxuXHRmbG93SWRzID0gZmxvd0lkLnNwbGl0KFwiLFwiKVxuXG5cblx0Zmxvd3MgPSBkYi5mbG93cy5maW5kKHtfaWQ6IHskaW46IGZsb3dJZHN9fSkuZmV0Y2goKVxuXG5cdGkgPSAwXG5cdHdoaWxlIGkgPCBmbG93cy5sZW5ndGhcblx0XHRmID0gZmxvd3NbaV1cblx0XHRzcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtzcGFjZTogZi5zcGFjZSwgdXNlcjogdXNlcl9pZH0pXG5cdFx0aWYgIXNwYWNlVXNlclxuXHRcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE5vIHBlcm1pc3Npb24sIGZsb3cgaXMgI3tmLl9pZH1cIixcblx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdHJldHVybjtcblx0XHRlbHNlXG5cblx0I1x05piv5ZCm5bel5L2c5Yy6566h55CG5ZGYXG5cdFx0aWYgIVN0ZWVkb3MuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJfaWQpXG5cdFx0XHRzcGFjZVVzZXJPcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcblx0XHRcdFx0X2lkOiB7XG5cdFx0XHRcdFx0JGluOiBzcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuXHRcdFx0XHR9XG5cdFx0XHR9KS5mZXRjaCgpO1xuXG5cdFx0XHRpZiAhV29ya2Zsb3dNYW5hZ2VyLmNhbk1vbml0b3IoZiwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zKSAmJiAhV29ya2Zsb3dNYW5hZ2VyLmNhbkFkbWluKGYsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucylcblx0XHRcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE5vIHBlcm1pc3Npb24sIGZsb3cgaXMgI3tmLl9pZH1cIixcblx0XHRcdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0aSsrXG5cblxuXHRxdWVyeS5mbG93ID0geyRpbjogZmxvd0lkc31cblxuXHRxdWVyeS5zcGFjZSA9IHNwYWNlSWRcblxuXHRpZiByZXEucXVlcnk/LnN5bmNfdG9rZW5cblx0XHRzeW5jX3Rva2VuID0gbmV3IERhdGUoTnVtYmVyKHJlcS5xdWVyeS5zeW5jX3Rva2VuKSlcblx0XHRxdWVyeS5tb2RpZmllZCA9IHskZ3Q6IHN5bmNfdG9rZW59XG5cblx0aWYgcmVxLnF1ZXJ5Py5maW5hbF9kZWNpc2lvblxuXHRcdHF1ZXJ5LmZpbmFsX2RlY2lzaW9uID0geyRpbiA6IHJlcS5xdWVyeS5maW5hbF9kZWNpc2lvbi5zcGxpdChcIixcIil9XG5cdGVsc2Vcblx0XHRxdWVyeS5maW5hbF9kZWNpc2lvbiA9IHskbmluOiBbXCJ0ZXJtaW5hdGVkXCIsIFwicmVqZWN0ZWRcIl19XG5cblx0aWYgcmVxLnF1ZXJ5Py5zdGF0ZVxuXHRcdHF1ZXJ5LnN0YXRlID0geyRpbjogcmVxLnF1ZXJ5LnN0YXRlLnNwbGl0KFwiLFwiKX1cblx0ZWxzZVxuXHRcdHF1ZXJ5LnN0YXRlID0gXCJjb21wbGV0ZWRcIlxuXG4jXHTmnIDlpJrov5Tlm541MDDmnaHmlbDmja5cblx0aW5zdGFuY2VzID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtmaWVsZHM6IHtpbmJveF91ZXJzOiAwLCBjY191c2VyczogMCwgb3V0Ym94X3VzZXJzOiAwLCB0cmFjZXM6IDAsIGF0dGFjaG1lbnRzOiAwfSwgc2tpcDogMCwgbGltaXQ6IDUwMH0pLmZldGNoKClcblx0aW5zdGFuY2VzLmZvckVhY2ggKGluc3RhbmNlKS0+XG5cblx0XHRhdHRhY2htZW50cyA9IGNmcy5pbnN0YW5jZXMuZmluZCh7J21ldGFkYXRhLmluc3RhbmNlJzogaW5zdGFuY2UuX2lkLCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSwgXCJtZXRhZGF0YS5pc19wcml2YXRlXCI6IHskbmU6IHRydWV9fSwge2ZpZWxkczoge2NvcGllczogMH19KS5mZXRjaCgpXG5cblx0XHRpbnN0YW5jZS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzXG5cblxuXHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogMjAwLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJzdGF0dXNcIjogXCJzdWNjZXNzXCIsXG5cdFx0XHRcdFwic3luY190b2tlblwiOiByZXRfc3luY190b2tlblxuXHRcdFx0XHRcImRhdGFcIjogaW5zdGFuY2VzXG5cdHJldHVybjtcbiIsInZhciBDb29raWVzLCBnZXRJbnN0YW5jZVJlYWRPbmx5O1xuXG5Db29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIik7XG5cbmdldEluc3RhbmNlUmVhZE9ubHkgPSBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykge1xuICB2YXIgX2hhc1Blcm1pc3Npb24sIF9sb2NhbGUsIF9wYXJlbnRfaW5zdGFuY2VzLCBkYXRhQnVmLCBlcnJvciwgaGlkZV90cmFjZXMsIGh0bWwsIGluc3RhbmNlLCBpbnN0YW5jZUlkLCByZWYsIHJlZjEsIHNwYWNlLCBzcGFjZUlkLCBzcGFjZVVzZXJDb3VudCwgdXNlciwgdXNlcklkO1xuICB1c2VyID0gU3RlZWRvcy5nZXRBUElMb2dpblVzZXIocmVxLCByZXMpO1xuICBpZiAocmVxICE9IG51bGwgPyAocmVmID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmLmFjY2Vzc190b2tlbiA6IHZvaWQgMCA6IHZvaWQgMCkge1xuICAgIHVzZXJJZCA9IFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuKHJlcS5xdWVyeS5hY2Nlc3NfdG9rZW4pO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogdXNlcklkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgc3BhY2VJZCA9IHJlcS5wYXJhbXMuc3BhY2U7XG4gIGluc3RhbmNlSWQgPSByZXEucGFyYW1zLmluc3RhbmNlX2lkO1xuICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICBfaWQ6IGluc3RhbmNlSWRcbiAgfSk7XG4gIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoe1xuICAgIF9pZDogc3BhY2VJZFxuICB9KTtcbiAgaGlkZV90cmFjZXMgPSAocmVmMSA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjEuaGlkZV90cmFjZXMgOiB2b2lkIDA7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBzaG93VHJhY2U6IHRydWVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMuc2hvd1RyYWNlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaGlkZV90cmFjZXMgPT09IFwiMVwiKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMuc2hvd1RyYWNlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHNob3dUcmFjZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucy5zaG93QXR0YWNobWVudHMpIHtcbiAgICBvcHRpb25zLnNob3dBdHRhY2htZW50cyA9IHRydWU7XG4gIH1cbiAgaWYgKCFzcGFjZSkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZVwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBpbnN0YW5jZVwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF1c2VyKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWRcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbnN0YW5jZS5zcGFjZSAhPT0gc3BhY2VJZCkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZSBvciBpbnN0YW5jZVwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3BhY2VVc2VyQ291bnQgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICB1c2VyOiB1c2VyLl9pZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9KS5jb3VudCgpO1xuICBpZiAoc3BhY2VVc2VyQ291bnQgPT09IDApIHtcbiAgICBpZiAoIXNwYWNlKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc2FwY2VVc2VyXCIsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBfaGFzUGVybWlzc2lvbiA9IFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIGluc3RhbmNlKTtcbiAgaWYgKCFfaGFzUGVybWlzc2lvbiAmJiBpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UpIHtcbiAgICBfcGFyZW50X2luc3RhbmNlcyA9IF8udW5pb24oW2luc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZV0sIGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMgfHwgW10pO1xuICAgIF9oYXNQZXJtaXNzaW9uID0gXy5maW5kKF9wYXJlbnRfaW5zdGFuY2VzLCBmdW5jdGlvbihfcGFyZW50X2lkKSB7XG4gICAgICB2YXIgX3BhcmVudF9pbnM7XG4gICAgICBfcGFyZW50X2lucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBfcGFyZW50X2lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHRyYWNlczogMFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBXb3JrZmxvd01hbmFnZXIuaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyh1c2VyLCBfcGFyZW50X2lucyk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFfaGFzUGVybWlzc2lvbikge1xuICAgIF9sb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSh1c2VyLl9pZCwgdHJ1ZSk7XG4gICAgZXJyb3IgPSBUQVBpMThuLl9fKFwiaW5zdGFuY2VfcGVybWlzc2lvbnNfZXJyb3JcIiwge30sIF9sb2NhbGUpO1xuICAgIHJlcy5jaGFyc2V0ID0gXCJ1dGYtOFwiO1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBlcnJvcixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIGRhdGFCdWYgPSBuZXcgQnVmZmVyKGh0bWwpO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgZGF0YUJ1Zi5sZW5ndGgpO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXJhbmdlJywgXCJieXRlcyAwLVwiICsgKGRhdGFCdWYubGVuZ3RoIC0gMSkgKyBcIi9cIiArIGRhdGFCdWYubGVuZ3RoKTtcbiAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gIHJldHVybiByZXMuZW5kKGh0bWwpO1xufTtcblxuSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvcmVhZG9ubHkvOmluc3RhbmNlX2lkXCIsIGdldEluc3RhbmNlUmVhZE9ubHkpO1xuXG5Kc29uUm91dGVzLmFkZChcImdldFwiLCBcIi93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9yZWFkb25seS86aW5zdGFuY2VfaWQvOmluc3RhbmNlX25hbWVcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIG9wdGlvbnM7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQnKTtcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50O2ZpbGVuYW1lPScgKyBlbmNvZGVVUkkocmVxLnBhcmFtcy5pbnN0YW5jZV9uYW1lKSk7XG4gIHJlcy5zZXRIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJycpO1xuICBvcHRpb25zID0ge1xuICAgIGFic29sdXRlOiB0cnVlXG4gIH07XG4gIHJldHVybiBnZXRJbnN0YW5jZVJlYWRPbmx5KHJlcSwgcmVzLCBuZXh0LCBvcHRpb25zKTtcbn0pO1xuXG5cbi8qXG5cdOiOt+WPlueUs+ivt+WNleWIl+ihqO+8mlxuICAgIGZpbmFsX2RlY2lzaW9u77ya5a6h5om557uT5p6cXG4gICAgc3RhdGU6IOeUs+ivt+WNleeKtuaAgVxuICovXG5cbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL2FwaS93b3JrZmxvdy9pbnN0YW5jZXNcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGYsIGZsb3dJZCwgZmxvd0lkcywgZmxvd3MsIGksIGluc3RhbmNlcywgcXVlcnksIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmV0X3N5bmNfdG9rZW4sIHNwYWNlSWQsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucywgc3luY190b2tlbiwgdXNlcl9pZDtcbiAgaWYgKCFTdGVlZG9zLkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2socmVxLCByZXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHVzZXJfaWQgPSByZXEudXNlcklkO1xuICBzcGFjZUlkID0gcmVxLmhlYWRlcnNbXCJ4LXNwYWNlLWlkXCJdO1xuICBpZiAoIXNwYWNlSWQpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1TcGFjZS1JZFwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgZmxvd0lkID0gKHJlZiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZi5mbG93SWQgOiB2b2lkIDA7XG4gIGlmICghZmxvd0lkKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAwLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGZsb3dJZFwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgcXVlcnkgPSB7fTtcbiAgcmV0X3N5bmNfdG9rZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgZmxvd0lkcyA9IGZsb3dJZC5zcGxpdChcIixcIik7XG4gIGZsb3dzID0gZGIuZmxvd3MuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGZsb3dJZHNcbiAgICB9XG4gIH0pLmZldGNoKCk7XG4gIGkgPSAwO1xuICB3aGlsZSAoaSA8IGZsb3dzLmxlbmd0aCkge1xuICAgIGYgPSBmbG93c1tpXTtcbiAgICBzcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBmLnNwYWNlLFxuICAgICAgdXNlcjogdXNlcl9pZFxuICAgIH0pO1xuICAgIGlmICghc3BhY2VVc2VyKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE5vIHBlcm1pc3Npb24sIGZsb3cgaXMgXCIgKyBmLl9pZCxcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcblxuICAgIH1cbiAgICBpZiAoIVN0ZWVkb3MuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJfaWQpKSB7XG4gICAgICBzcGFjZVVzZXJPcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBzcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgICAgaWYgKCFXb3JrZmxvd01hbmFnZXIuY2FuTW9uaXRvcihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpICYmICFXb3JrZmxvd01hbmFnZXIuY2FuQWRtaW4oZiwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zKSkge1xuICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE5vIHBlcm1pc3Npb24sIGZsb3cgaXMgXCIgKyBmLl9pZCxcbiAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaSsrO1xuICB9XG4gIHF1ZXJ5LmZsb3cgPSB7XG4gICAgJGluOiBmbG93SWRzXG4gIH07XG4gIHF1ZXJ5LnNwYWNlID0gc3BhY2VJZDtcbiAgaWYgKChyZWYxID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMS5zeW5jX3Rva2VuIDogdm9pZCAwKSB7XG4gICAgc3luY190b2tlbiA9IG5ldyBEYXRlKE51bWJlcihyZXEucXVlcnkuc3luY190b2tlbikpO1xuICAgIHF1ZXJ5Lm1vZGlmaWVkID0ge1xuICAgICAgJGd0OiBzeW5jX3Rva2VuXG4gICAgfTtcbiAgfVxuICBpZiAoKHJlZjIgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYyLmZpbmFsX2RlY2lzaW9uIDogdm9pZCAwKSB7XG4gICAgcXVlcnkuZmluYWxfZGVjaXNpb24gPSB7XG4gICAgICAkaW46IHJlcS5xdWVyeS5maW5hbF9kZWNpc2lvbi5zcGxpdChcIixcIilcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5LmZpbmFsX2RlY2lzaW9uID0ge1xuICAgICAgJG5pbjogW1widGVybWluYXRlZFwiLCBcInJlamVjdGVkXCJdXG4gICAgfTtcbiAgfVxuICBpZiAoKHJlZjMgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYzLnN0YXRlIDogdm9pZCAwKSB7XG4gICAgcXVlcnkuc3RhdGUgPSB7XG4gICAgICAkaW46IHJlcS5xdWVyeS5zdGF0ZS5zcGxpdChcIixcIilcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJjb21wbGV0ZWRcIjtcbiAgfVxuICBpbnN0YW5jZXMgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuICAgIGZpZWxkczoge1xuICAgICAgaW5ib3hfdWVyczogMCxcbiAgICAgIGNjX3VzZXJzOiAwLFxuICAgICAgb3V0Ym94X3VzZXJzOiAwLFxuICAgICAgdHJhY2VzOiAwLFxuICAgICAgYXR0YWNobWVudHM6IDBcbiAgICB9LFxuICAgIHNraXA6IDAsXG4gICAgbGltaXQ6IDUwMFxuICB9KS5mZXRjaCgpO1xuICBpbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgIHZhciBhdHRhY2htZW50cztcbiAgICBhdHRhY2htZW50cyA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG4gICAgICAnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnN0YW5jZS5faWQsXG4gICAgICAnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG4gICAgICBcIm1ldGFkYXRhLmlzX3ByaXZhdGVcIjoge1xuICAgICAgICAkbmU6IHRydWVcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgY29waWVzOiAwXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICByZXR1cm4gaW5zdGFuY2UuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgfSk7XG4gIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICBjb2RlOiAyMDAsXG4gICAgZGF0YToge1xuICAgICAgXCJzdGF0dXNcIjogXCJzdWNjZXNzXCIsXG4gICAgICBcInN5bmNfdG9rZW5cIjogcmV0X3N5bmNfdG9rZW4sXG4gICAgICBcImRhdGFcIjogaW5zdGFuY2VzXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiXG5Kc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi9zdGVlZG9zLWNzc1wiLCAocmVxLCByZXMsIG5leHQpLT5cblx0cmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvY3NzJyk7XG5cdGFsbENzcyA9IFdlYkFwcC5nZXRSZWZyZXNoYWJsZUFzc2V0cygpXG5cblx0YWxsQ3NzTGluayA9IFwiXCJcblxuXHRhbGxDc3MuZm9yRWFjaCAoY3NzKSAtPlxuXHRcdGlmIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVhcblx0XHRcdHJvb3RVcmwgPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMXG5cdFx0XHRpZiByb290VXJsLmVuZHNXaXRoKFwiL1wiKVxuXHRcdFx0XHRjc3NIcmVmID0gcm9vdFVybC5yZXBsYWNlKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVggKyBcIi9cIiwgXCJcIikgKyBjc3MudXJsXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNzc0hyZWYgPSByb290VXJsLnJlcGxhY2UoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCwgXCJcIikgKyBjc3MudXJsXG5cdFx0ZWxzZVxuXHRcdFx0Y3NzSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChjc3MudXJsKVxuXHRcdGFsbENzc0xpbmsgKz0gXCJAaW1wb3J0IHVybCgje2Nzc0hyZWZ9KTtcIlxuXG5cdHJlcy5zdGF0dXNDb2RlID0gMjAwXG5cdHJlcy5lbmQoYWxsQ3NzTGluaykiLCJKc29uUm91dGVzLmFkZChcImdldFwiLCBcIi9zdGVlZG9zLWNzc1wiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYWxsQ3NzLCBhbGxDc3NMaW5rO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9jc3MnKTtcbiAgYWxsQ3NzID0gV2ViQXBwLmdldFJlZnJlc2hhYmxlQXNzZXRzKCk7XG4gIGFsbENzc0xpbmsgPSBcIlwiO1xuICBhbGxDc3MuZm9yRWFjaChmdW5jdGlvbihjc3MpIHtcbiAgICB2YXIgY3NzSHJlZiwgcm9vdFVybDtcbiAgICBpZiAoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCkge1xuICAgICAgcm9vdFVybCA9IF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkw7XG4gICAgICBpZiAocm9vdFVybC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgY3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYICsgXCIvXCIsIFwiXCIpICsgY3NzLnVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNzc0hyZWYgPSByb290VXJsLnJlcGxhY2UoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCwgXCJcIikgKyBjc3MudXJsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjc3NIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKGNzcy51cmwpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsQ3NzTGluayArPSBcIkBpbXBvcnQgdXJsKFwiICsgY3NzSHJlZiArIFwiKTtcIjtcbiAgfSk7XG4gIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICByZXR1cm4gcmVzLmVuZChhbGxDc3NMaW5rKTtcbn0pO1xuIiwiSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L2RyYWZ0LzpmbG93XCIsIChyZXEsIHJlcywgbmV4dCkgLT5cblx0aWYgIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcylcblx0XHRyZXR1cm5cblxuXHR1c2VyX2lkID0gcmVxLnVzZXJJZFxuXG5cdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHsgX2lkOiB1c2VyX2lkIH0pXG5cblx0c3BhY2VJZCA9IHJlcS5wYXJhbXMuc3BhY2VcblxuXHRmbG93SWQgPSByZXEucGFyYW1zLmZsb3dcblxuXHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHsgX2lkOiBzcGFjZUlkIH0pXG5cblx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoeyBfaWQ6IGZsb3dJZCB9LCB7IGZpZWxkczogeyBuYW1lOiAxLCAnY3VycmVudC5faWQnOiAxLCBmb3JtOiAxIH0gfSlcblxuXHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7IF9pZDogZmxvdy5mb3JtIH0sIHsgZmllbGRzOiB7ICdjdXJyZW50Ll9pZCc6IDEgfSB9KVxuXG5cdG9wdGlvbnMgPSB7XG5cdFx0c2hvd1RyYWNlOiBmYWxzZSxcblx0XHRzaG93QXR0YWNobWVudHM6IGZhbHNlLFxuXHRcdHRlbXBsYXRlTmFtZTogXCJkZWZhdWx0XCIsXG5cdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdGluc3RhbmNlX3N0eWxlOiBcImluc3RhbmNlLWRlZmF1bHRcIixcblx0XHRwbHVnaW5zOiBcIlwiXCJcblxuXHRcdFx0PG1ldGEgaHR0cC1lcXVpdj1cIlgtVUEtQ29tcGF0aWJsZVwiIGNvbnRlbnQ9XCJJRT1lZGdlLGNocm9tZT0xXCIgLz5cblx0XHRcdDxtZXRhIG5hbWU9XCJmb3JtYXQtZGV0ZWN0aW9uXCIgY29udGVudD1cInRlbGVwaG9uZT1ub1wiPlxuXHRcdFx0PG1ldGEgaHR0cC1lcXVpdj1cIngtcmltLWF1dG8tbWF0Y2hcIiBjb250ZW50PVwibm9uZVwiPlxuXHRcdFx0PHRpdGxlPiN7Zmxvdy5uYW1lfTwvdGl0bGU+XG5cdFx0XHQ8bWV0YSBjb250ZW50PSd3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT0wJyBuYW1lPSd2aWV3cG9ydCcgLz5cblx0XHRcdDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuXG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9jc3MvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLm1pbi5jc3NcIj5cblxuXHRcdFx0PHNjcmlwdCBzcmM9XCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvanMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLm1pbi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblxuXHRcdFx0PHNjcmlwdCBzcmM9XCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvanMvbG9jYWxlcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIuemgtQ04uanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgY2hhcnNldD1cIlVURi04XCI+PC9zY3JpcHQ+XG5cblx0XHRcdDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiL3BsdWdpbnMvdG9hc3RyL3RvYXN0ci5taW4uY3NzXCI+XG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIvanMvd29ya2Zsb3dfY2xpZW50LmNzc1wiPlxuXHRcdFx0PHNjcmlwdCBzcmM9XCIvanMvd29ya2Zsb3dfY2xpZW50LmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXHRcdFwiXCJcIlxuXHR9XG5cblx0aW5zdGFuY2UgPSB7XG5cdFx0ZmxvdzogZmxvdy5faWQsXG5cdFx0Zmxvd192ZXJzaW9uOiBmbG93LmN1cnJlbnQuX2lkLFxuXHRcdGZvcm06IGZvcm0uX2lkLFxuXHRcdGZvcm1fdmVyc2lvbjogZm9ybS5jdXJyZW50Ll9pZCxcblx0XHR2YWx1ZXM6IHt9LFxuXHRcdG5hbWU6IGZsb3cubmFtZSxcblx0XHRzcGFjZTogc3BhY2VJZFxuXHR9XG5cblx0aHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXG5cdGRhdGFCdWYgPSBuZXcgQnVmZmVyKGh0bWwpXG5cblx0cmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBkYXRhQnVmLmxlbmd0aClcblxuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LXJhbmdlJywgXCJieXRlcyAwLSN7ZGF0YUJ1Zi5sZW5ndGggLSAxfS8je2RhdGFCdWYubGVuZ3RofVwiKVxuXG5cdHJlcy5zdGF0dXNDb2RlID0gMjAwXG5cblx0cmVzLmVuZChodG1sKVxuIiwiSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L2RyYWZ0LzpmbG93XCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBkYXRhQnVmLCBmbG93LCBmbG93SWQsIGZvcm0sIGh0bWwsIGluc3RhbmNlLCBvcHRpb25zLCBzcGFjZSwgc3BhY2VJZCwgdXNlciwgdXNlcl9pZDtcbiAgaWYgKCFTdGVlZG9zLkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2socmVxLCByZXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHVzZXJfaWQgPSByZXEudXNlcklkO1xuICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgX2lkOiB1c2VyX2lkXG4gIH0pO1xuICBzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZTtcbiAgZmxvd0lkID0gcmVxLnBhcmFtcy5mbG93O1xuICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHtcbiAgICBfaWQ6IHNwYWNlSWRcbiAgfSk7XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICBfaWQ6IGZsb3dJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgJ2N1cnJlbnQuX2lkJzogMSxcbiAgICAgIGZvcm06IDFcbiAgICB9XG4gIH0pO1xuICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7XG4gICAgX2lkOiBmbG93LmZvcm1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgJ2N1cnJlbnQuX2lkJzogMVxuICAgIH1cbiAgfSk7XG4gIG9wdGlvbnMgPSB7XG4gICAgc2hvd1RyYWNlOiBmYWxzZSxcbiAgICBzaG93QXR0YWNobWVudHM6IGZhbHNlLFxuICAgIHRlbXBsYXRlTmFtZTogXCJkZWZhdWx0XCIsXG4gICAgZWRpdGFibGU6IHRydWUsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGluc3RhbmNlX3N0eWxlOiBcImluc3RhbmNlLWRlZmF1bHRcIixcbiAgICBwbHVnaW5zOiBcIlxcbjxtZXRhIGh0dHAtZXF1aXY9XFxcIlgtVUEtQ29tcGF0aWJsZVxcXCIgY29udGVudD1cXFwiSUU9ZWRnZSxjaHJvbWU9MVxcXCIgLz5cXG48bWV0YSBuYW1lPVxcXCJmb3JtYXQtZGV0ZWN0aW9uXFxcIiBjb250ZW50PVxcXCJ0ZWxlcGhvbmU9bm9cXFwiPlxcbjxtZXRhIGh0dHAtZXF1aXY9XFxcIngtcmltLWF1dG8tbWF0Y2hcXFwiIGNvbnRlbnQ9XFxcIm5vbmVcXFwiPlxcbjx0aXRsZT5cIiArIGZsb3cubmFtZSArIFwiPC90aXRsZT5cXG48bWV0YSBjb250ZW50PSd3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT0wJyBuYW1lPSd2aWV3cG9ydCcgLz5cXG48bWV0YSBuYW1lPVxcXCJ2aWV3cG9ydFxcXCIgY29udGVudD1cXFwid2lkdGg9ZGV2aWNlLXdpZHRoXFxcIiAvPlxcblxcbjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9jc3MvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLm1pbi5jc3NcXFwiPlxcblxcbjxzY3JpcHQgc3JjPVxcXCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvanMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLm1pbi5qc1xcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cXG5cXG48c2NyaXB0IHNyYz1cXFwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2pzL2xvY2FsZXMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLnpoLUNOLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiIGNoYXJzZXQ9XFxcIlVURi04XFxcIj48L3NjcmlwdD5cXG5cXG48bGluayByZWw9XFxcInN0eWxlc2hlZXRcXFwiIHR5cGU9XFxcInRleHQvY3NzXFxcIiBocmVmPVxcXCIvcGx1Z2lucy90b2FzdHIvdG9hc3RyLm1pbi5jc3NcXFwiPlxcbjxzY3JpcHQgc3JjPVxcXCIvcGx1Z2lucy90b2FzdHIvdG9hc3RyLm1pbi5qc1xcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cXG48bGluayByZWw9XFxcInN0eWxlc2hlZXRcXFwiIHR5cGU9XFxcInRleHQvY3NzXFxcIiBocmVmPVxcXCIvanMvd29ya2Zsb3dfY2xpZW50LmNzc1xcXCI+XFxuPHNjcmlwdCBzcmM9XFxcIi9qcy93b3JrZmxvd19jbGllbnQuanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCI+PC9zY3JpcHQ+XCJcbiAgfTtcbiAgaW5zdGFuY2UgPSB7XG4gICAgZmxvdzogZmxvdy5faWQsXG4gICAgZmxvd192ZXJzaW9uOiBmbG93LmN1cnJlbnQuX2lkLFxuICAgIGZvcm06IGZvcm0uX2lkLFxuICAgIGZvcm1fdmVyc2lvbjogZm9ybS5jdXJyZW50Ll9pZCxcbiAgICB2YWx1ZXM6IHt9LFxuICAgIG5hbWU6IGZsb3cubmFtZSxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9O1xuICBodG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBkYXRhQnVmID0gbmV3IEJ1ZmZlcihodG1sKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtXCIgKyAoZGF0YUJ1Zi5sZW5ndGggLSAxKSArIFwiL1wiICsgZGF0YUJ1Zi5sZW5ndGgpO1xuICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgcmV0dXJuIHJlcy5lbmQoaHRtbCk7XG59KTtcbiIsIkFycmF5LnByb3RvdHlwZS5maWx0ZXJQcm9wZXJ0eSA9IGZ1bmN0aW9uKGgsIGwpe1xuICAgIHZhciBnID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe1xuICAgICAgICB2YXIgbSA9IHQ/IHRbaF06bnVsbDtcbiAgICAgICAgdmFyIGQgPSBmYWxzZTtcbiAgICAgICAgaWYobSBpbnN0YW5jZW9mIEFycmF5KXtcbiAgICAgICAgICAgIGQgPSBtLmluY2x1ZGVzKGwpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGQgPSAobCA9PT0gdW5kZWZpbmVkKT8gZmFsc2U6bT09bDtcbiAgICAgICAgfVxuICAgICAgICBpZihkKXtcbiAgICAgICAgICAgIGcucHVzaCh0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnO1xufTtcblxuQXJyYXkucHJvdG90eXBlLmdldFByb3BlcnR5ID0gZnVuY3Rpb24oayl7XG4gICAgdmFyIHYgPSBuZXcgQXJyYXkoKTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odCl7XG4gICAgICAgIHZhciBtID0gdD8gdFtrXTpudWxsO1xuICAgICAgICB2LnB1c2gobSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHY7XG59XG5cbkFycmF5LnByb3RvdHlwZS5nZXRFYWNoID0gZnVuY3Rpb24oY29kZSl7XG4gICAgdmFyIHJldiA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDAgOyBpIDwgdGhpcy5sZW5ndGggOyBpKyspe1xuICAgICAgICByZXYucHVzaCh0aGlzW2ldW2NvZGVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldjtcbn07XG5cbkFycmF5LnByb3RvdHlwZS51bmlxID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgYSA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihiKXsgXG4gICAgICAgIGlmKGEuaW5kZXhPZihiKSA8IDApXG4gICAgICAgICAgICB7YVthLmxlbmd0aF0gPSBifVxuICAgIH0pO1xuICAgIHJldHVybiBhO1xufTtcblxuRm9ybV9mb3JtdWxhID0ge307XG5cblxuRm9ybV9mb3JtdWxhLm1peGluID0gZnVuY3Rpb24oZGVzdCwgc3JjKXtcbiAgICBmb3IodmFyIGtleSBpbiBzcmMpe1xuICAgICAgICBkZXN0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59O1xuXG5cbkZvcm1fZm9ybXVsYS5oYW5kZXJVc2VyT2JqZWN0ID0gZnVuY3Rpb24odSl7XG5cbiAgICBpZih1IGluc3RhbmNlb2YgQXJyYXkpe1xuICAgICAgICB2YXIgdXNlciA9IHt9O1xuXG4gICAgICAgIHVzZXIubmFtZSA9IHUuZ2V0UHJvcGVydHkoXCJuYW1lXCIpXG4gICAgICAgIHVzZXIub3JnYW5pemF0aW9uID0ge307XG4gICAgICAgIHVzZXIub3JnYW5pemF0aW9uLm5hbWUgPSB1LmdldFByb3BlcnR5KFwib3JnYW5pemF0aW9uXCIpLmdldFByb3BlcnR5KFwibmFtZVwiKTtcbiAgICAgICAgdXNlci5vcmdhbml6YXRpb24uZnVsbG5hbWUgPSB1LmdldFByb3BlcnR5KFwib3JnYW5pemF0aW9uXCIpLmdldFByb3BlcnR5KFwiZnVsbG5hbWVcIik7XG5cbiAgICAgICAgdXNlci5ociA9IHUuZ2V0UHJvcGVydHkoXCJoclwiKVxuXG4gICAgICAgIHVzZXIuc29ydF9ubyA9IHUuZ2V0UHJvcGVydHkoXCJzb3J0X25vXCIpXG5cblx0XHR1c2VyLm1vYmlsZSA9IHUuZ2V0UHJvcGVydHkoXCJtb2JpbGVcIilcblxuXHRcdHVzZXIud29ya19waG9uZSA9IHUuZ2V0UHJvcGVydHkoXCJ3b3JrX3Bob25lXCIpXG5cblx0XHR1c2VyLnBvc2l0aW9uID0gdS5nZXRQcm9wZXJ0eShcInBvc2l0aW9uXCIpXG5cbiAgICAgICAgdmFyIHVzZXJSb2xlcyA9IHUuZ2V0UHJvcGVydHkoXCJyb2xlc1wiKTtcbiAgICAgICAgdmFyIHJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHVzZXJSb2xlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5jb25jYXQoaSk7XG4gICAgICAgIH0pOyBcbiAgICAgICAgcm9sZXMudW5pcSgpO1xuICAgICAgICB1c2VyLnJvbGVzID0gcm9sZXM7XG4gICAgICAgIHJldHVybiB1c2VyO1xuICAgIH1lbHNle1xuICAgICAgICByZXR1cm4gdTtcbiAgICB9XG59XG5cbkZvcm1fZm9ybXVsYS5oYW5kZXJPcmdPYmplY3QgPSBmdW5jdGlvbihvKXtcblxuICAgIGlmKG8gaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgIHZhciBvcmcgPSB7fTtcblx0XHRvcmcuaWQgPSBvLmdldFByb3BlcnR5KFwiX2lkXCIpO1xuICAgICAgICBvcmcubmFtZSA9IG8uZ2V0UHJvcGVydHkoXCJuYW1lXCIpO1xuICAgICAgICBvcmcuZnVsbG5hbWUgPSBvLmdldFByb3BlcnR5KFwiZnVsbG5hbWVcIik7XG5cbiAgICAgICAgcmV0dXJuIG9yZztcbiAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgfVxufVxuXG5cblxuLyoqXG4gICAgKiDojrflvpflhazlvI/pnIDopoHnlKjliLDnmoTliJ3lp4vlgLxcbiAgICAqIOi+k+WFpe+8mmZpZWxkcywgdmFsdWVzLCBhcHBsaWNhbnRcbiAgICAqIOi+k+WHuu+8ml9fdmFsdWVzXG4qKi9cbkZvcm1fZm9ybXVsYS5pbml0X2Zvcm11bGFfdmFsdWVzID0gZnVuY3Rpb24oZmllbGRzLCBhdXRvRm9ybURvYywgYXBwcm92ZXIsIGFwcGxpY2FudCwgc3BhY2VJZCl7XG4gICAgdmFyIF9fdmFsdWVzID0ge307XG4gICAgLy/nlLPor7fljZXkuK3loavnmoTlgLzlpITnkIZcbiAgICBpZihmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCAmJiBhdXRvRm9ybURvYykge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCl7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICBpZih0eXBlKSB7XG4gICAgICAgICAgICAgICAgaWYodHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAqIOWwhuihqOagvOWtl+auteeahOWAvOi/m+ihjOi9rOaNouWQjuS8oOWFpV9fdmFsdWVz5LitXG4gICAgICAgICAgICAgICAgICAgICogdmFsdWVz5Lit6KGo5qC855qE5YC85qC85byP5Li6XG4gICAgICAgICAgICAgICAgICAgICogW3tcImFcIjoxLFwiYlwiOjR9LHtcImFcIjoyLFwiYlwiOjV9LHtcImFcIjozLFwiYlwiOjZ9XVxuICAgICAgICAgICAgICAgICAgICAqIF9fdmFsdWVz6ZyA6KaB6L2s5YyW5Li65LiL6Z2i5qC85byP5LiU5ZKM5Li76KGo55qE5YC85LiA5qC35pS+5Yiw56ys5LiA5bGCXG4gICAgICAgICAgICAgICAgICAgICoge1wiYVwiOlsxLDIsM10sXCJiXCI6WzQsNSw2XX1cbiAgICAgICAgICAgICAgICAgICAgKiovXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZUZpZWxkcyA9IGZpZWxkLnNmaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVZhbHVlcyA9IGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYVRhYmxlVmFsdWVzID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlVmFsdWVzID0ge307XG4gICAgICAgICAgICAgICAgICAgIC8v5oyJ5YWs5byP55qE5qC85byP6L2s5o2i5YC85Li6X190YWJsZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBpZih0YWJsZUZpZWxkcyAmJiB0YWJsZUZpZWxkcy5sZW5ndGggJiYgdGFibGVWYWx1ZXMgJiYgdGFibGVWYWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbih0YWJsZVZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhVGFibGVWYWx1ZXMucHVzaChGb3JtX2Zvcm11bGEuaW5pdF9mb3JtdWxhX3ZhbHVlcyh0YWJsZUZpZWxkcywgdGFibGVWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL+aMieS4u+ihqOeahOagvOW8j+i9rOaNol9fdGFibGVWYWx1ZXPliqDliLBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRmllbGRzLmZvckVhY2goZnVuY3Rpb24odGFibGVmaWVsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZVZhbHVlc1t0YWJsZWZpZWxkLmNvZGVdID0gZm9ybXVsYVRhYmxlVmFsdWVzLmdldEVhY2godGFibGVmaWVsZC5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX192YWx1ZXMgPSBGb3JtX2Zvcm11bGEubWl4aW4oX192YWx1ZXMsIF9fdGFibGVWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICd1c2VyJyl7XG4gICAgICAgICAgICAgICAgICAgIF9fdmFsdWVzW2ZpZWxkLmNvZGVdID0gRm9ybV9mb3JtdWxhLmhhbmRlclVzZXJPYmplY3QoV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm11bGFVc2VyT2JqZWN0cyhzcGFjZUlkLCBhdXRvRm9ybURvY1tmaWVsZC5jb2RlXSkpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdncm91cCcpe1xuICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlc1tmaWVsZC5jb2RlXSA9IEZvcm1fZm9ybXVsYS5oYW5kZXJPcmdPYmplY3QoV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm11bGFPcmdPYmplY3RzKGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ29kYXRhJyl7XG5cdFx0XHRcdFx0X192YWx1ZXNbZmllbGQuY29kZV0gPSBhdXRvRm9ybURvY1tmaWVsZC5jb2RlXSB8fCB7fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8v5q2k5aSE5Lygc3BhY2VJZOe7memAieS6uuaOp+S7tueahOaXp+aVsOaNruiuoeeul3JvbGVz5ZKMb3JnYW5pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgIF9fdmFsdWVzW2ZpZWxkLmNvZGVdID0gYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG4gICAgLy/lvZPliY3lpITnkIbkurpcbiAgICBfX3ZhbHVlc1tcImFwcHJvdmVyXCJdID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm11bGFVc2VyT2JqZWN0KHNwYWNlSWQsIGFwcHJvdmVyKTtcbiAgICAvL+eUs+ivt+S6ulxuICAgIF9fdmFsdWVzW1wiYXBwbGljYW50XCJdID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm11bGFVc2VyT2JqZWN0KHNwYWNlSWQsIGFwcGxpY2FudCk7XG5cbiAgICByZXR1cm4gX192YWx1ZXM7XG59O1xuXG4iLCJNZXRlb3IucHVibGlzaCAnY2F0ZWdvcmllcycsIChzcGFjZUlkKSAtPlxuXHRjaGVjayBzcGFjZUlkLCBTdHJpbmdcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRyZXR1cm4gZGIuY2F0ZWdvcmllcy5maW5kKHsgc3BhY2U6IHNwYWNlSWQgfSwgeyBmaWVsZHM6IHsgbmFtZTogMSwgc3BhY2U6IDEsIHNvcnRfbm86IDEsIGFwcDogMSB9IH0pIiwiTWV0ZW9yLnB1Ymxpc2goJ2NhdGVnb3JpZXMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGNoZWNrKHNwYWNlSWQsIFN0cmluZyk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmNhdGVnb3JpZXMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgc29ydF9ubzogMSxcbiAgICAgIGFwcDogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIlxuTWV0ZW9yLnB1Ymxpc2ggJ2Nmc19pbnN0YW5jZXMnLCAoaW5zdGFuY2VJZHMpLT5cblx0Y2hlY2soaW5zdGFuY2VJZHMsIEFycmF5KVxuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgaW5zdGFuY2VJZHNcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gY2ZzLmluc3RhbmNlcy5maW5kKHsnbWV0YWRhdGEuaW5zdGFuY2UnOiB7JGluOiBpbnN0YW5jZUlkc30gLCAkb3I6IFt7J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB7JG5lOiB0cnVlfX0seydtZXRhZGF0YS5pc19wcml2YXRlJzogdHJ1ZSwgXCJtZXRhZGF0YS5vd25lclwiOiB0aGlzLnVzZXJJZH1dfSlcbiIsIk1ldGVvci5wdWJsaXNoKCdjZnNfaW5zdGFuY2VzJywgZnVuY3Rpb24oaW5zdGFuY2VJZHMpIHtcbiAgY2hlY2soaW5zdGFuY2VJZHMsIEFycmF5KTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZUlkcykge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGNmcy5pbnN0YW5jZXMuZmluZCh7XG4gICAgJ21ldGFkYXRhLmluc3RhbmNlJzoge1xuICAgICAgJGluOiBpbnN0YW5jZUlkc1xuICAgIH0sXG4gICAgJG9yOiBbXG4gICAgICB7XG4gICAgICAgICdtZXRhZGF0YS5pc19wcml2YXRlJzoge1xuICAgICAgICAgICRuZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgICdtZXRhZGF0YS5pc19wcml2YXRlJzogdHJ1ZSxcbiAgICAgICAgXCJtZXRhZGF0YS5vd25lclwiOiB0aGlzLnVzZXJJZFxuICAgICAgfVxuICAgIF1cbiAgfSk7XG59KTtcbiIsIlxuXG5NZXRlb3IucHVibGlzaCAnZmxvd19wb3NpdGlvbnMnLCAoc3BhY2VJZCktPlxuXHRcblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXHRcblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLmZsb3dfcG9zaXRpb25zLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczoge3JvbGU6MSwgdXNlcnM6IDEsIG9yZzogMX19KTtcbiIsIk1ldGVvci5wdWJsaXNoKCdmbG93X3Bvc2l0aW9ucycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd19wb3NpdGlvbnMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgcm9sZTogMSxcbiAgICAgIHVzZXJzOiAxLFxuICAgICAgb3JnOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgJ2Zsb3dfcG9zaXRpb25zX3RhYnVsYXInLCAodGFibGVOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHRjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR0aGlzLnVuYmxvY2soKVxuXG5cdGZpbmQ6IC0+XG5cdFx0dGhpcy51bmJsb2NrKClcblx0XHRkYi5mbG93X3Bvc2l0aW9ucy5maW5kIHtfaWQ6IHskaW46IGlkc319LCBmaWVsZHM6IGZpZWxkc1xuXG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKHBvc2l0aW9uKSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCBmbG93X3JvbGVzXG5cdFx0XHRcdGRiLmZsb3dfcm9sZXMuZmluZCB7IF9pZDogcG9zaXRpb24ucm9sZSB9LCBmaWVsZHM6IG5hbWU6IDFcblx0XHR9XG5cdFx0e1xuXHRcdFx0ZmluZDogKHBvc2l0aW9uKSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCBvcmdhbml6YXRpb25zXG5cdFx0XHRcdGRiLm9yZ2FuaXphdGlvbnMuZmluZCB7IF9pZDogcG9zaXRpb24ub3JnIH0sIGZpZWxkczogZnVsbG5hbWU6IDFcblx0XHR9XG5cdFx0e1xuXHRcdFx0ZmluZDogKHBvc2l0aW9uKSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCB1c2VyXG5cdFx0XHRcdGRiLnNwYWNlX3VzZXJzLmZpbmQge1xuXHRcdFx0XHRcdHNwYWNlOiBwb3NpdGlvbi5zcGFjZVxuXHRcdFx0XHRcdHVzZXI6ICRpbjogcG9zaXRpb24udXNlcnNcblx0XHRcdFx0fSwgZmllbGRzOlxuXHRcdFx0XHRcdHNwYWNlOiAxXG5cdFx0XHRcdFx0dXNlcjogMVxuXHRcdFx0XHRcdG5hbWU6IDFcblx0XHR9XG5cdF0iLCJNZXRlb3IucHVibGlzaENvbXBvc2l0ZSgnZmxvd19wb3NpdGlvbnNfdGFidWxhcicsIGZ1bmN0aW9uKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgY2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgdGhpcy51bmJsb2NrKCk7XG4gIHJldHVybiB7XG4gICAgZmluZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgIHJldHVybiBkYi5mbG93X3Bvc2l0aW9ucy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpZHNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGlsZHJlbjogW1xuICAgICAge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihwb3NpdGlvbikge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5mbG93X3JvbGVzLmZpbmQoe1xuICAgICAgICAgICAgX2lkOiBwb3NpdGlvbi5yb2xlXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihwb3NpdGlvbikge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICAgICAgX2lkOiBwb3NpdGlvbi5vcmdcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgZnVsbG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihwb3NpdGlvbikge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBwb3NpdGlvbi5zcGFjZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgJGluOiBwb3NpdGlvbi51c2Vyc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgICAgdXNlcjogMSxcbiAgICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xufSk7XG4iLCJcblxuXHRNZXRlb3IucHVibGlzaCAnZmxvd19yb2xlcycsIChzcGFjZUlkKS0+XG5cdFx0XG5cdFx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFx0XG5cdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdFx0cmV0dXJuIGRiLmZsb3dfcm9sZXMuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7bmFtZToxfX0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfcm9sZXMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dfcm9sZXMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdmbG93cycsIChzcGFjZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHQjIOesrOS4gOasoeiuoumYheaXtuWIneWni+WMluW3peS9nOWMulxuXHRpZiBkYi5mbG93cy5maW5kKHtzcGFjZTogc3BhY2VJZH0pLmNvdW50KCkgPT0gMFxuXHRcdGRiLnNwYWNlcy5jcmVhdGVUZW1wbGF0ZUZvcm1BbmRGbG93KHNwYWNlSWQpXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0bmFtZTogMSxcblx0XHRcdGZvcm06IDEsXG5cdFx0XHRzdGF0ZTogMSxcblx0XHRcdHBlcm1zOiAxLFxuXHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRjb21wYW55X2lkOiAxLFxuXHRcdFx0c29ydF9ubzogMSxcblx0XHRcdGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG5cdFx0XHRlbmFibGVfYW1pc2Zvcm06IDFcblx0XHR9XG5cdH0pXG5cbk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZV9mbG93JywgKHNwYWNlSWQsIGZsb3dJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gZGIuZmxvd3MuZmluZCh7X2lkOiBmbG93SWQsIHNwYWNlOiBzcGFjZUlkfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0bmFtZTogMSxcblx0XHRcdGZvcm06IDEsXG5cdFx0XHRzdGF0ZTogMSxcblx0XHRcdHBlcm1zOiAxLFxuXHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRjb21wYW55X2lkOiAxLFxuXHRcdFx0c29ydF9ubzogMSxcblx0XHRcdGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG5cdFx0XHRlbmFibGVfYW1pc2Zvcm06IDFcblx0XHR9XG5cdH0pXG5cblxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfdmVyc2lvbicsIChzcGFjZUlkLCBmbG93SWQsIHZlcnNpb25JZCkgLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmbG93SWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHZlcnNpb25JZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdGdldEZsb3dWZXJzaW9uID0gKGlkICwgdmVyc2lvbklkKS0+XG5cdFx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe19pZCA6IGlkfSk7XG5cdFx0aWYgZmxvd1xuXHRcdFx0Zmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50XG5cdFx0XHRmbG93X3ZlcnNpb24ubGF0ZXN0ID0gdHJ1ZVxuXG5cdFx0XHRpZiBmbG93X3ZlcnNpb24uX2lkICE9IHZlcnNpb25JZFxuXHRcdFx0XHRmbG93X3ZlcnNpb24gPSBmbG93Lmhpc3RvcnlzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdmVyc2lvbklkKVxuXHRcdFx0XHRmbG93X3ZlcnNpb24ubGF0ZXN0ID0gZmFsc2VcblxuXHRcdFx0cmV0dXJuIGZsb3dfdmVyc2lvblxuXHRoYW5kbGUgPSBkYi5mbG93cy5maW5kKHtfaWQ6IGZsb3dJZH0sIHtmaWVsZHM6IHtfaWQ6IDEsIFwiY3VycmVudC5tb2RpZmllZFwiOiAxfX0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdHNlbGYuY2hhbmdlZChcImZsb3dfdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGbG93VmVyc2lvbihpZCwgdmVyc2lvbklkKSk7XG5cdH1cblxuXG5cdHNlbGYuYWRkZWQoXCJmbG93X3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rmxvd1ZlcnNpb24oZmxvd0lkLCB2ZXJzaW9uSWQpKTtcblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuXG5NZXRlb3IucHVibGlzaCAnZGlzdHJpYnV0ZV9vcHRpb25hbF9mbG93cycsIChmbG93X2lkcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dfaWRzXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5mbG93cy5maW5kKHtfaWQ6IHskaW46IGZsb3dfaWRzfX0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdG5hbWU6IDEsXG5cdFx0XHRmb3JtOiAxLFxuXHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRwZXJtczogMSxcblx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRlbmFibGVfYW1pc2Zvcm06IDFcblx0XHR9XG5cdH0pXG5cbk1ldGVvci5wdWJsaXNoICdmbG93JywgKHNwYWNlSWQsIGZsb3dJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHJldHVybiBkYi5mbG93cy5maW5kKHtfaWQ6IGZsb3dJZCwgc3BhY2U6IHNwYWNlSWR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRwcmludF90ZW1wbGF0ZTogMSxcblx0XHRcdGluc3RhbmNlX3RlbXBsYXRlOiAxLFxuXHRcdFx0ZXZlbnRzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdHVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZDogMSxcblx0XHRcdGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRhbGxvd19zZWxlY3Rfc3RlcDogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcbk1ldGVvci5wdWJsaXNoICdmbG93X2ZpbGVzJywgKHNwYWNlSWQsIGZsb3dJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gY2ZzLmZpbGVzLmZpbmQoeyAnbWV0YWRhdGEuc3BhY2UnOiBzcGFjZUlkLCAnbWV0YWRhdGEub2JqZWN0X25hbWUnOiAnZmxvd3MnLCAnbWV0YWRhdGEucmVjb3JkX2lkJzogZmxvd0lkIH0pXG5cbk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlICdmbG93c190YWJ1bGFyJywgKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0Y2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuXHRjaGVjayhpZHMsIEFycmF5KTtcblx0Y2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dGhpcy51bmJsb2NrKClcblxuXHRmaW5kOiAtPlxuXHRcdHRoaXMudW5ibG9jaygpXG5cdFx0ZGIuZmxvd3MuZmluZCB7X2lkOiB7JGluOiBpZHN9fSwgZmllbGRzOiBmaWVsZHNcblxuXHRjaGlsZHJlbjogW1xuXHRcdHtcblx0XHRcdGZpbmQ6IChmbG93KSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCB1c2VyXG5cdFx0XHRcdGRiLnNwYWNlX3VzZXJzLmZpbmQge1xuXHRcdFx0XHRcdHNwYWNlOiBmbG93LnNwYWNlLFxuXHRcdFx0XHRcdHVzZXI6IGZsb3cuY3VycmVudC5tb2RpZmllZF9ieVxuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHR1c2VyOiAxXG5cdFx0XHRcdFx0bmFtZTogMVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmluZDogKGZsb3cpIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuZm9ybXMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IGZsb3cuc3BhY2UsXG5cdFx0XHRcdFx0X2lkOiBmbG93LmZvcm1cblx0XHRcdFx0fSwgZmllbGRzOlxuXHRcdFx0XHRcdHNwYWNlOiAxXG5cdFx0XHRcdFx0X2lkOiAxXG5cdFx0XHRcdFx0bmFtZTogMSxcblx0XHRcdFx0XHRjYXRlZ29yeTogMVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmluZDogKGZsb3cpIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuY2F0ZWdvcmllcy5maW5kIHtcblx0XHRcdFx0XHRzcGFjZTogZmxvdy5zcGFjZVxuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHRfaWQ6IDFcblx0XHRcdFx0XHRuYW1lOiAxXG5cdFx0fVxuXHRdIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dzJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmIChkYi5mbG93cy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9KS5jb3VudCgpID09PSAwKSB7XG4gICAgZGIuc3BhY2VzLmNyZWF0ZVRlbXBsYXRlRm9ybUFuZEZsb3coc3BhY2VJZCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBwZXJtczogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgY29tcGFueV9pZDogMSxcbiAgICAgIHNvcnRfbm86IDEsXG4gICAgICBkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuICAgICAgZW5hYmxlX2FtaXNmb3JtOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnaW5zdGFuY2VfZmxvdycsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgX2lkOiBmbG93SWQsXG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGZvcm06IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHBlcm1zOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBjb21wYW55X2lkOiAxLFxuICAgICAgc29ydF9ubzogMSxcbiAgICAgIGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG4gICAgICBkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdmbG93X3ZlcnNpb24nLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQsIHZlcnNpb25JZCkge1xuICB2YXIgZ2V0Rmxvd1ZlcnNpb24sIGhhbmRsZSwgc2VsZjtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCF2ZXJzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBnZXRGbG93VmVyc2lvbiA9IGZ1bmN0aW9uKGlkLCB2ZXJzaW9uSWQpIHtcbiAgICB2YXIgZmxvdywgZmxvd192ZXJzaW9uO1xuICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgIF9pZDogaWRcbiAgICB9KTtcbiAgICBpZiAoZmxvdykge1xuICAgICAgZmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50O1xuICAgICAgZmxvd192ZXJzaW9uLmxhdGVzdCA9IHRydWU7XG4gICAgICBpZiAoZmxvd192ZXJzaW9uLl9pZCAhPT0gdmVyc2lvbklkKSB7XG4gICAgICAgIGZsb3dfdmVyc2lvbiA9IGZsb3cuaGlzdG9yeXMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB2ZXJzaW9uSWQpO1xuICAgICAgICBmbG93X3ZlcnNpb24ubGF0ZXN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmxvd192ZXJzaW9uO1xuICAgIH1cbiAgfTtcbiAgaGFuZGxlID0gZGIuZmxvd3MuZmluZCh7XG4gICAgX2lkOiBmbG93SWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgX2lkOiAxLFxuICAgICAgXCJjdXJyZW50Lm1vZGlmaWVkXCI6IDFcbiAgICB9XG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImZsb3dfdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGbG93VmVyc2lvbihpZCwgdmVyc2lvbklkKSk7XG4gICAgfVxuICB9KTtcbiAgc2VsZi5hZGRlZChcImZsb3dfdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGbG93VmVyc2lvbihmbG93SWQsIHZlcnNpb25JZCkpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Rpc3RyaWJ1dGVfb3B0aW9uYWxfZmxvd3MnLCBmdW5jdGlvbihmbG93X2lkcykge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dfaWRzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGZsb3dfaWRzXG4gICAgfVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgZm9ybTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgcGVybXM6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG4gICAgICBkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG4gICAgICBkaXN0cmlidXRlX2VuZF9ub3RpZmljYXRpb246IDEsXG4gICAgICBjb21wYW55X2lkOiAxLFxuICAgICAgZW5hYmxlX2FtaXNmb3JtOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZmxvdycsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgX2lkOiBmbG93SWQsXG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgcHJpbnRfdGVtcGxhdGU6IDEsXG4gICAgICBpbnN0YW5jZV90ZW1wbGF0ZTogMSxcbiAgICAgIGV2ZW50czogMSxcbiAgICAgIGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG4gICAgICBkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG4gICAgICB1cGxvYWRfYWZ0ZXJfYmVpbmdfZGlzdHJpYnV0ZWQ6IDEsXG4gICAgICBkaXN0cmlidXRlX2VuZF9ub3RpZmljYXRpb246IDEsXG4gICAgICBjb21wYW55X2lkOiAxLFxuICAgICAgYWxsb3dfc2VsZWN0X3N0ZXA6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdmbG93X2ZpbGVzJywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBjZnMuZmlsZXMuZmluZCh7XG4gICAgJ21ldGFkYXRhLnNwYWNlJzogc3BhY2VJZCxcbiAgICAnbWV0YWRhdGEub2JqZWN0X25hbWUnOiAnZmxvd3MnLFxuICAgICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBmbG93SWRcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUoJ2Zsb3dzX3RhYnVsYXInLCBmdW5jdGlvbih0YWJsZU5hbWUsIGlkcywgZmllbGRzKSB7XG4gIGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHRoaXMudW5ibG9jaygpO1xuICByZXR1cm4ge1xuICAgIGZpbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogaWRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2hpbGRyZW46IFtcbiAgICAgIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24oZmxvdykge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBmbG93LnNwYWNlLFxuICAgICAgICAgICAgdXNlcjogZmxvdy5jdXJyZW50Lm1vZGlmaWVkX2J5XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICB1c2VyOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24oZmxvdykge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5mb3Jtcy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBmbG93LnNwYWNlLFxuICAgICAgICAgICAgX2lkOiBmbG93LmZvcm1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICAgIF9pZDogMSxcbiAgICAgICAgICAgICAgbmFtZTogMSxcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihmbG93KSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLmNhdGVnb3JpZXMuZmluZCh7XG4gICAgICAgICAgICBzcGFjZTogZmxvdy5zcGFjZVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdmb3JtcycsIChzcGFjZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHJldHVybiBkYi5mb3Jtcy5maW5kKHtzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtuYW1lOiAxLCBjYXRlZ29yeTogMSwgc3RhdGU6IDEsIGRlc2NyaXB0aW9uOiAxLCBpbnN0YW5jZV9zdHlsZTogMSwgYW1pc19zY2hlbWE6IDF9fSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlX2Zvcm0nLCAoc3BhY2VJZCwgZm9ybUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHJldHVybiBkYi5mb3Jtcy5maW5kKHtfaWQ6IGZvcm1JZCwgc3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7bmFtZTogMSwgY2F0ZWdvcnk6IDEsIHN0YXRlOiAxLCBkZXNjcmlwdGlvbjogMSwgaW5zdGFuY2Vfc3R5bGU6IDEsIGFtaXNfc2NoZW1hOiAxfX0pXG5cblxuTWV0ZW9yLnB1Ymxpc2ggJ2Zvcm1fdmVyc2lvbicsIChzcGFjZUlkLCBmb3JtSWQsIHZlcnNpb25JZCkgLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmb3JtSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHZlcnNpb25JZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdGdldEZvcm1WZXJzaW9uID0gKGlkICwgdmVyc2lvbklkKS0+XG5cdFx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe19pZCA6IGlkfSk7XG5cdFx0aWYgIWZvcm1cblx0XHRcdHJldHVybiB7fVxuXHRcdGZvcm1fdmVyc2lvbiA9IGZvcm0uY3VycmVudFxuXHRcdGZvcm1fdmVyc2lvbi5sYXRlc3QgPSB0cnVlXG5cdFx0aWYgZm9ybV92ZXJzaW9uLl9pZCAhPSB2ZXJzaW9uSWRcblx0XHRcdGZvcm1fdmVyc2lvbiA9IGZvcm0uaGlzdG9yeXMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB2ZXJzaW9uSWQpXG5cdFx0XHRmb3JtX3ZlcnNpb24ubGF0ZXN0ID0gZmFsc2Vcblx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uXG5cblx0aGFuZGxlID0gZGIuZm9ybXMuZmluZCh7X2lkOiBmb3JtSWR9LCB7ZmllbGRzOiB7X2lkOiAxLCBcImN1cnJlbnQubW9kaWZpZWRcIjogMX19KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oaWQsIHZlcnNpb25JZCkpO1xuXHR9XG5cblx0c2VsZi5hZGRlZChcImZvcm1fdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGb3JtVmVyc2lvbihmb3JtSWQsIHZlcnNpb25JZCkpO1xuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zvcm1zJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mb3Jtcy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgY2F0ZWdvcnk6IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIGRlc2NyaXB0aW9uOiAxLFxuICAgICAgaW5zdGFuY2Vfc3R5bGU6IDEsXG4gICAgICBhbWlzX3NjaGVtYTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX2Zvcm0nLCBmdW5jdGlvbihzcGFjZUlkLCBmb3JtSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZm9ybXMuZmluZCh7XG4gICAgX2lkOiBmb3JtSWQsXG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGNhdGVnb3J5OiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBkZXNjcmlwdGlvbjogMSxcbiAgICAgIGluc3RhbmNlX3N0eWxlOiAxLFxuICAgICAgYW1pc19zY2hlbWE6IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdmb3JtX3ZlcnNpb24nLCBmdW5jdGlvbihzcGFjZUlkLCBmb3JtSWQsIHZlcnNpb25JZCkge1xuICB2YXIgZ2V0Rm9ybVZlcnNpb24sIGhhbmRsZSwgc2VsZjtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZvcm1JZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCF2ZXJzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBnZXRGb3JtVmVyc2lvbiA9IGZ1bmN0aW9uKGlkLCB2ZXJzaW9uSWQpIHtcbiAgICB2YXIgZm9ybSwgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgIF9pZDogaWRcbiAgICB9KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgZm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50O1xuICAgIGZvcm1fdmVyc2lvbi5sYXRlc3QgPSB0cnVlO1xuICAgIGlmIChmb3JtX3ZlcnNpb24uX2lkICE9PSB2ZXJzaW9uSWQpIHtcbiAgICAgIGZvcm1fdmVyc2lvbiA9IGZvcm0uaGlzdG9yeXMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB2ZXJzaW9uSWQpO1xuICAgICAgZm9ybV92ZXJzaW9uLmxhdGVzdCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybV92ZXJzaW9uO1xuICB9O1xuICBoYW5kbGUgPSBkYi5mb3Jtcy5maW5kKHtcbiAgICBfaWQ6IGZvcm1JZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBcImN1cnJlbnQubW9kaWZpZWRcIjogMVxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiZm9ybV92ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZvcm1WZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiZm9ybV92ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZvcm1WZXJzaW9uKGZvcm1JZCwgdmVyc2lvbklkKSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlX2RhdGEnLCAoaW5zdGFuY2VJZCwgYm94KS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgKGluc3RhbmNlSWQgJiYgZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogaW5zdGFuY2VJZH0pLmNvdW50KCkpXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdG1pbmlBcHByb3ZlRmllbGRzID0gWydfaWQnLCAnaXNfZmluaXNoZWQnLCAndXNlcicsICdoYW5kbGVyJywgJ2hhbmRsZXJfbmFtZScsICd0eXBlJywgJ3N0YXJ0X2RhdGUnLCAnZGVzY3JpcHRpb24nLFxuXHRcdCdpc19yZWFkJywgJ2p1ZGdlJywgJ2ZpbmlzaF9kYXRlJywgJ2Zyb21fdXNlcl9uYW1lJywgJ2Zyb21fdXNlcicsICdjY19kZXNjcmlwdGlvbicsICdhdXRvX3N1Ym1pdHRlZCddXG5cblx0dHJpZ2dlckNoYW5nZUZpZWxkcyA9IFsnZm9ybV92ZXJzaW9uJywgJ2Zsb3dfdmVyc2lvbicsICdyZWxhdGVkX2luc3RhbmNlcycsICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJywgJ3ZhbHVlcycsICdjaGFuZ2VfdGltZSddXG5cblx0dHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlcyA9IHt9XG5cblx0aW5zdGFuY2VfZmllbGRzXzAgPSB7XG5cdFx0XCJyZWNvcmRfc3luY2VkXCI6IDAsXG5cbiNcdFx0XCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25cIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5jb3N0X3RpbWVcIjogMCxcbiNcdFx0XCJ0cmFjZXMuYXBwcm92ZXMucmVhZF9kYXRlXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuaXNfZXJyb3JcIjogMCxcblx0XHQjIFwidHJhY2VzLmFwcHJvdmVzLnVzZXJfbmFtZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmRlYWRsaW5lXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMucmVtaW5kX2RhdGVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5yZW1pbmRlZF9jb3VudFwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLm1vZGlmaWVkX2J5XCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMubW9kaWZpZWRcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5nZW9sb2NhdGlvblwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmNjX3VzZXJzXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuZnJvbV9hcHByb3ZlX2lkXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMudmFsdWVzX2hpc3RvcnlcIjogMFxuXHR9XG5cblx0Z2V0TXlhcHByb3ZlTW9kaWZpZWQgPSAodHJhY2VzKS0+XG5cdFx0bXlBcHByb3ZlTW9kaWZpZWRzID0gbmV3IEFycmF5KClcblxuXHRcdHRyYWNlcz8uZm9yRWFjaCAodHJhY2UpLT5cblx0XHRcdHRyYWNlPy5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSktPlxuXHRcdFx0XHRpZiAoYXBwcm92ZS51c2VyID09IHNlbGYudXNlcklkIHx8IGFwcHJvdmUuaGFuZGxlciA9PSBzZWxmLnVzZXJJZClcblx0XHRcdFx0IyAmJiAhYXBwcm92ZS5pc19maW5pc2hlZFxuI1x0XHRcdFx0XHRjb25zb2xlLmxvZyhcImFwcHJvdmVcIiwgYXBwcm92ZS5faWQsIGFwcHJvdmUucmVhZF9kYXRlKVxuXG5cdFx0XHRcdFx0bXlBcHByb3ZlTW9kaWZpZWRzLnB1c2goYXBwcm92ZS5yZWFkX2RhdGUpXG5cblx0XHRyZXR1cm4gbXlBcHByb3ZlTW9kaWZpZWRzXG5cblxuXHRnZXRNaW5pSW5zdGFuY2UgPSAoX2luc3RhbmNlSWQpLT5cblx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IF9pbnN0YW5jZUlkfSwge2ZpZWxkczogaW5zdGFuY2VfZmllbGRzXzB9KVxuXG5cdFx0aWYgaW5zdGFuY2VcblxuXHRcdFx0dHJpZ2dlckNoYW5nZUZpZWxkcy5mb3JFYWNoIChrZXkpLT5cblx0XHRcdFx0aWYga2V5ID09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJ1xuXHRcdFx0XHRcdHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSA9IGdldE15YXBwcm92ZU1vZGlmaWVkKGluc3RhbmNlLnRyYWNlcylcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSA9IGluc3RhbmNlW2tleV1cblxuI1x0XHRcdGhhc09waW5pb25GaWVsZCA9IEluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQoaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKVxuXG5cdFx0XHRzaG93X21vZGFsX3RyYWNlc19saXN0ID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7IHNwYWNlOiBpbnN0YW5jZS5zcGFjZSwga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIiB9LCB7IGZpZWxkczogeyB2YWx1ZXM6IDEgfSB9KT8udmFsdWVzIHx8IGZhbHNlXG5cblx0XHRcdGlmIHNob3dfbW9kYWxfdHJhY2VzX2xpc3RcblxuXHRcdFx0XHR0cmFjZXMgPSBuZXcgQXJyYXkoKTtcblxuXHRcdFx0XHRpbnN0YW5jZT8udHJhY2VzPy5mb3JFYWNoICh0cmFjZSktPlxuXHRcdFx0XHRcdF90cmFjZSA9IF8uY2xvbmUodHJhY2UpXG5cblx0XHRcdFx0XHRhcHByb3ZlcyA9IG5ldyBBcnJheSgpXG5cblx0XHRcdFx0XHR0cmFjZT8uYXBwcm92ZXM/LmZvckVhY2ggKGFwcHJvdmUpLT5cblx0XHRcdFx0XHRcdGlmIGFwcHJvdmUudHlwZSAhPSAnY2MnIHx8IGFwcHJvdmUudXNlciA9PSBzZWxmLnVzZXJJZCB8fCBhcHByb3ZlLmhhbmRsZXIgPT0gc2VsZi51c2VySWQgfHwgKCFfLmlzRW1wdHkoYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUpKVxuXHRcdFx0XHRcdFx0XHRhcHByb3Zlcy5wdXNoKGFwcHJvdmUpXG5cblx0XHRcdFx0XHRfdHJhY2UuYXBwcm92ZXMgPSBhcHByb3Zlc1xuXG5cdFx0XHRcdFx0dHJhY2VzLnB1c2goX3RyYWNlKVxuXG5cdFx0XHRcdGluc3RhbmNlLnRyYWNlcyA9IHRyYWNlcztcblxuXHRcdHJldHVybiBpbnN0YW5jZVxuXG5cblx0bmVlZENoYW5nZSA9IChjaGFuZ2VGaWVsZHMpLT5cblx0XHRpZiBjaGFuZ2VGaWVsZHNcblxuXHRcdFx0X2NoYW5nZSA9IGZhbHNlXG5cblx0XHRcdF9yZXYgPSBfLmZpbmQgdHJpZ2dlckNoYW5nZUZpZWxkcywgKGtleSktPlxuXHRcdFx0XHRfa2V5ID0ga2V5XG5cblx0XHRcdFx0aWYga2V5ID09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJ1xuXHRcdFx0XHRcdF9rZXkgPSAndHJhY2VzJ1xuXG5cdFx0XHRcdGlmIF8uaGFzKGNoYW5nZUZpZWxkcywgX2tleSlcblxuXHRcdFx0XHRcdGlmIGtleSA9PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcydcblxuXHRcdFx0XHRcdFx0X215X2FwcHJvdmVfbW9kaWZpZWRzID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoY2hhbmdlRmllbGRzLnRyYWNlcylcblxuI1x0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgX215X2FwcHJvdmVfbW9kaWZpZWRzKVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gIV8uaXNFcXVhbCh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIF9teV9hcHByb3ZlX21vZGlmaWVkcylcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gIV8uaXNFcXVhbCh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIGNoYW5nZUZpZWxkc1trZXldKVxuXG5cdFx0XHRpZiBfcmV2XG5cdFx0XHRcdF9jaGFuZ2UgPSB0cnVlXG5cbiNcdFx0XHRjb25zb2xlLmxvZyhfcmV2LCBfY2hhbmdlKVxuXG5cdFx0XHRyZXR1cm4gX2NoYW5nZVxuXG5cdFx0cmV0dXJuIHRydWVcblx0I+atpOWkhOS4jeiDvea3u+WKoGZpZWxkc+mZkOWItu+8jOWQpuWImeS8muWvvOiHtOaVsOaNruS4jeWunuaXtlxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiBpbnN0YW5jZUlkfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCwgZmllbGRzKS0+XG5cdFx0XHRpZihib3ggIT0gJ2luYm94JyB8fCBuZWVkQ2hhbmdlKGZpZWxkcykpXG5cdFx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgZ2V0TWluaUluc3RhbmNlKGlkKSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0aW5zdGFuY2UgPSBnZXRNaW5pSW5zdGFuY2UoaW5zdGFuY2VJZClcblxuXHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGluc3RhbmNlPy5faWQsIGluc3RhbmNlKTtcblxuXHRzZWxmLnJlYWR5KCk7XG5cblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcblxuXG5NZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfdHJhY2VzJywgKGluc3RhbmNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBpbnN0YW5jZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzXG5cblx0Z2V0SW5zdGFuY2VUcmFjZXMgPSAoX2luc0lkKS0+XG5cdFx0cmV0dXJuIGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IF9pbnNJZH0sIHtmaWVsZHM6IHtfaWQ6IDEsIHRyYWNlczogMX19KVxuXG5cblx0aGFuZGxlID0gIGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IGluc3RhbmNlSWR9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZV90cmFjZXNcIiwgaW5zdGFuY2VJZCwgZ2V0SW5zdGFuY2VUcmFjZXMoaW5zdGFuY2VJZCkpO1xuXHR9XG5cblx0c2VsZi5hZGRlZChcImluc3RhbmNlX3RyYWNlc1wiLCBpbnN0YW5jZUlkLCBnZXRJbnN0YW5jZVRyYWNlcyhpbnN0YW5jZUlkKSk7XG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKSIsIk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZV9kYXRhJywgZnVuY3Rpb24oaW5zdGFuY2VJZCwgYm94KSB7XG4gIHZhciBnZXRNaW5pSW5zdGFuY2UsIGdldE15YXBwcm92ZU1vZGlmaWVkLCBoYW5kbGUsIGluc3RhbmNlLCBpbnN0YW5jZV9maWVsZHNfMCwgbWluaUFwcHJvdmVGaWVsZHMsIG5lZWRDaGFuZ2UsIHNlbGYsIHRyaWdnZXJDaGFuZ2VGaWVsZHMsIHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXM7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghKGluc3RhbmNlSWQgJiYgZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KS5jb3VudCgpKSkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIG1pbmlBcHByb3ZlRmllbGRzID0gWydfaWQnLCAnaXNfZmluaXNoZWQnLCAndXNlcicsICdoYW5kbGVyJywgJ2hhbmRsZXJfbmFtZScsICd0eXBlJywgJ3N0YXJ0X2RhdGUnLCAnZGVzY3JpcHRpb24nLCAnaXNfcmVhZCcsICdqdWRnZScsICdmaW5pc2hfZGF0ZScsICdmcm9tX3VzZXJfbmFtZScsICdmcm9tX3VzZXInLCAnY2NfZGVzY3JpcHRpb24nLCAnYXV0b19zdWJtaXR0ZWQnXTtcbiAgdHJpZ2dlckNoYW5nZUZpZWxkcyA9IFsnZm9ybV92ZXJzaW9uJywgJ2Zsb3dfdmVyc2lvbicsICdyZWxhdGVkX2luc3RhbmNlcycsICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJywgJ3ZhbHVlcycsICdjaGFuZ2VfdGltZSddO1xuICB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzID0ge307XG4gIGluc3RhbmNlX2ZpZWxkc18wID0ge1xuICAgIFwicmVjb3JkX3N5bmNlZFwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWVcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvblwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmNvc3RfdGltZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmlzX2Vycm9yXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuZGVhZGxpbmVcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5yZW1pbmRfZGF0ZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZGVkX2NvdW50XCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMubW9kaWZpZWRfYnlcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZFwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmdlb2xvY2F0aW9uXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuY2NfdXNlcnNcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5mcm9tX2FwcHJvdmVfaWRcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy52YWx1ZXNfaGlzdG9yeVwiOiAwXG4gIH07XG4gIGdldE15YXBwcm92ZU1vZGlmaWVkID0gZnVuY3Rpb24odHJhY2VzKSB7XG4gICAgdmFyIG15QXBwcm92ZU1vZGlmaWVkcztcbiAgICBteUFwcHJvdmVNb2RpZmllZHMgPSBuZXcgQXJyYXkoKTtcbiAgICBpZiAodHJhY2VzICE9IG51bGwpIHtcbiAgICAgIHRyYWNlcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIHJldHVybiB0cmFjZSAhPSBudWxsID8gKHJlZiA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsID8gcmVmLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgIGlmIChhcHByb3ZlLnVzZXIgPT09IHNlbGYudXNlcklkIHx8IGFwcHJvdmUuaGFuZGxlciA9PT0gc2VsZi51c2VySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBteUFwcHJvdmVNb2RpZmllZHMucHVzaChhcHByb3ZlLnJlYWRfZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbXlBcHByb3ZlTW9kaWZpZWRzO1xuICB9O1xuICBnZXRNaW5pSW5zdGFuY2UgPSBmdW5jdGlvbihfaW5zdGFuY2VJZCkge1xuICAgIHZhciBpbnN0YW5jZSwgcmVmLCByZWYxLCBzaG93X21vZGFsX3RyYWNlc19saXN0LCB0cmFjZXM7XG4gICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IF9pbnN0YW5jZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiBpbnN0YW5jZV9maWVsZHNfMFxuICAgIH0pO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgdHJpZ2dlckNoYW5nZUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcycpIHtcbiAgICAgICAgICByZXR1cm4gdHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoaW5zdGFuY2UudHJhY2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gaW5zdGFuY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBzaG93X21vZGFsX3RyYWNlc19saXN0ID0gKChyZWYgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgICAgc3BhY2U6IGluc3RhbmNlLnNwYWNlLFxuICAgICAgICBrZXk6IFwic2hvd19tb2RhbF90cmFjZXNfbGlzdFwiXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHZhbHVlczogMVxuICAgICAgICB9XG4gICAgICB9KSkgIT0gbnVsbCA/IHJlZi52YWx1ZXMgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgICAgaWYgKHNob3dfbW9kYWxfdHJhY2VzX2xpc3QpIHtcbiAgICAgICAgdHJhY2VzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKChyZWYxID0gaW5zdGFuY2UudHJhY2VzKSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZWYxLmZvckVhY2goZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgICAgICAgICAgdmFyIF90cmFjZSwgYXBwcm92ZXMsIHJlZjI7XG4gICAgICAgICAgICAgIF90cmFjZSA9IF8uY2xvbmUodHJhY2UpO1xuICAgICAgICAgICAgICBhcHByb3ZlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICBpZiAodHJhY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICgocmVmMiA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICByZWYyLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwcm92ZS50eXBlICE9PSAnY2MnIHx8IGFwcHJvdmUudXNlciA9PT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09PSBzZWxmLnVzZXJJZCB8fCAoIV8uaXNFbXB0eShhcHByb3ZlLnNpZ25fZmllbGRfY29kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVzLnB1c2goYXBwcm92ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfdHJhY2UuYXBwcm92ZXMgPSBhcHByb3ZlcztcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlcy5wdXNoKF90cmFjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UudHJhY2VzID0gdHJhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG4gIG5lZWRDaGFuZ2UgPSBmdW5jdGlvbihjaGFuZ2VGaWVsZHMpIHtcbiAgICB2YXIgX2NoYW5nZSwgX3JldjtcbiAgICBpZiAoY2hhbmdlRmllbGRzKSB7XG4gICAgICBfY2hhbmdlID0gZmFsc2U7XG4gICAgICBfcmV2ID0gXy5maW5kKHRyaWdnZXJDaGFuZ2VGaWVsZHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB2YXIgX2tleSwgX215X2FwcHJvdmVfbW9kaWZpZWRzO1xuICAgICAgICBfa2V5ID0ga2V5O1xuICAgICAgICBpZiAoa2V5ID09PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcycpIHtcbiAgICAgICAgICBfa2V5ID0gJ3RyYWNlcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaGFzKGNoYW5nZUZpZWxkcywgX2tleSkpIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcycpIHtcbiAgICAgICAgICAgIF9teV9hcHByb3ZlX21vZGlmaWVkcyA9IGdldE15YXBwcm92ZU1vZGlmaWVkKGNoYW5nZUZpZWxkcy50cmFjZXMpO1xuICAgICAgICAgICAgcmV0dXJuICFfLmlzRXF1YWwodHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBfbXlfYXBwcm92ZV9tb2RpZmllZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gIV8uaXNFcXVhbCh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIGNoYW5nZUZpZWxkc1trZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKF9yZXYpIHtcbiAgICAgICAgX2NoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2NoYW5nZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IGluc3RhbmNlSWRcbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkLCBmaWVsZHMpIHtcbiAgICAgIGlmIChib3ggIT09ICdpbmJveCcgfHwgbmVlZENoYW5nZShmaWVsZHMpKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGdldE1pbmlJbnN0YW5jZShpZCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuICAgIH1cbiAgfSk7XG4gIGluc3RhbmNlID0gZ2V0TWluaUluc3RhbmNlKGluc3RhbmNlSWQpO1xuICBzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGluc3RhbmNlICE9IG51bGwgPyBpbnN0YW5jZS5faWQgOiB2b2lkIDAsIGluc3RhbmNlKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZV90cmFjZXMnLCBmdW5jdGlvbihpbnN0YW5jZUlkKSB7XG4gIHZhciBnZXRJbnN0YW5jZVRyYWNlcywgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBnZXRJbnN0YW5jZVRyYWNlcyA9IGZ1bmN0aW9uKF9pbnNJZCkge1xuICAgIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IF9pbnNJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIHRyYWNlczogMVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiBpbnN0YW5jZUlkXG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImluc3RhbmNlX3RyYWNlc1wiLCBpbnN0YW5jZUlkLCBnZXRJbnN0YW5jZVRyYWNlcyhpbnN0YW5jZUlkKSk7XG4gICAgfVxuICB9KTtcbiAgc2VsZi5hZGRlZChcImluc3RhbmNlX3RyYWNlc1wiLCBpbnN0YW5jZUlkLCBnZXRJbnN0YW5jZVRyYWNlcyhpbnN0YW5jZUlkKSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuIiwiXG5cdE1ldGVvci5wdWJsaXNoICdpbnN0YW5jZXNfbGlzdCcsIChzcGFjZUlkLCBib3gsIGZsb3dJZCktPlxuXG5cdFx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFx0XG5cdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRcdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXHRcdGlmIGJveCA9PSBcImluYm94XCJcblx0XHRcdHF1ZXJ5LmluYm94X3VzZXJzID0gdGhpcy51c2VySWQ7XG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJvdXRib3hcIlxuXHRcdFx0cXVlcnkub3V0Ym94X3VzZXJzID0gdGhpcy51c2VySWQ7XG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJkcmFmdFwiXG5cdFx0XHRxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcblx0XHRcdHF1ZXJ5LnN0YXRlID0gXCJkcmFmdFwiXG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJwZW5kaW5nXCJcblx0XHRcdHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuXHRcdFx0cXVlcnkuc3RhdGUgPSBcInBlbmRpbmdcIlxuXHRcdGVsc2UgaWYgYm94ID09IFwiY29tcGxldGVkXCJcblx0XHRcdHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuXHRcdFx0cXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiXG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJtb25pdG9yXCJcblx0XHRcdHF1ZXJ5LmZsb3cgPSBmbG93SWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IHskaW46IFtcInBlbmRpbmdcIixcImNvbXBsZXRlZFwiXX07XG5cdFx0ZWxzZVxuXHRcdFx0cXVlcnkuc3RhdGUgPSBcIm5vbmVcIlxuXG5cdFx0cmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7ZmllbGRzOiB7bmFtZToxLCBjcmVhdGVkOjEsIGZvcm06MSwgZmxvdzogMSwgc3BhY2U6MSwgbW9kaWZpZWQ6MSwgYXBwbGljYW50OiAxLCBpc19hcmNoaXZlZDoxLCBmb3JtX3ZlcnNpb246IDEsIGZsb3dfdmVyc2lvbjogMX19KVxuXG4iLCJNZXRlb3IucHVibGlzaCgnaW5zdGFuY2VzX2xpc3QnLCBmdW5jdGlvbihzcGFjZUlkLCBib3gsIGZsb3dJZCkge1xuICB2YXIgcXVlcnk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcXVlcnkgPSB7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfTtcbiAgaWYgKGJveCA9PT0gXCJpbmJveFwiKSB7XG4gICAgcXVlcnkuaW5ib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwib3V0Ym94XCIpIHtcbiAgICBxdWVyeS5vdXRib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwiZHJhZnRcIikge1xuICAgIHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJkcmFmdFwiO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICBxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcbiAgICBxdWVyeS5zdGF0ZSA9IFwicGVuZGluZ1wiO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgIHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJjb21wbGV0ZWRcIjtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwibW9uaXRvclwiKSB7XG4gICAgcXVlcnkuZmxvdyA9IGZsb3dJZDtcbiAgICBxdWVyeS5zdGF0ZSA9IHtcbiAgICAgICRpbjogW1wicGVuZGluZ1wiLCBcImNvbXBsZXRlZFwiXVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkuc3RhdGUgPSBcIm5vbmVcIjtcbiAgfVxuICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBjcmVhdGVkOiAxLFxuICAgICAgZm9ybTogMSxcbiAgICAgIGZsb3c6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIG1vZGlmaWVkOiAxLFxuICAgICAgYXBwbGljYW50OiAxLFxuICAgICAgaXNfYXJjaGl2ZWQ6IDEsXG4gICAgICBmb3JtX3ZlcnNpb246IDEsXG4gICAgICBmbG93X3ZlcnNpb246IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlID0gKGluc3RhbmNlaWQsIHVzZXJJZCwgZGF0YU1hcCwgY2FsbGJhY2spLT5cblx0b3BlcmF0aW9uID0gW3tcblx0XHRcIiRtYXRjaFwiOiB7XG5cdFx0XHRcIl9pZFwiOiBpbnN0YW5jZWlkXG5cdFx0fVxuXHR9LCB7XCIkcHJvamVjdFwiOiB7XCJuYW1lXCI6IDEsIFwiX2FwcHJvdmVcIjogXCIkdHJhY2VzLmFwcHJvdmVzXCJ9fSwge1wiJHVud2luZFwiOiBcIiRfYXBwcm92ZVwifSwge1wiJHVud2luZFwiOiBcIiRfYXBwcm92ZVwifSxcblx0XHR7XCIkbWF0Y2hcIjoge1wiX2FwcHJvdmUuaXNfZmluaXNoZWRcIjogdHJ1ZSwgJG9yOlt7XCJfYXBwcm92ZS5oYW5kbGVyXCI6IHVzZXJJZH0se1wiX2FwcHJvdmUudXNlclwiOiB1c2VySWR9XX19LFxuXHRcdHtcIiRncm91cFwiOiB7XCJfaWRcIjogXCIkX2lkXCIsIFwiZmluaXNoX2RhdGVcIjoge1wiJGxhc3RcIjogXCIkX2FwcHJvdmUuZmluaXNoX2RhdGVcIn19fVxuXHRdXG5cblx0ZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUob3BlcmF0aW9uKS50b0FycmF5IChlcnIsIGRhdGEpLT5cblx0XHRpZiBlcnJcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnIpXG5cblx0XHRkYXRhLmZvckVhY2ggKGRvYykgLT5cblx0XHRcdGRhdGFNYXAucHVzaCBkb2NcblxuXHRcdGlmIGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaylcblx0XHRcdGNhbGxiYWNrKClcblx0XHRyZXR1cm5cblxuYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlID0gTWV0ZW9yLndyYXBBc3luYyhsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlKVxuXG5NZXRlb3IucHVibGlzaCBcImluc3RhbmNlX3RhYnVsYXJcIiwgKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcblxuXHRjaGVjayhpZHMsIEFycmF5KTtcblxuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpXG5cblx0ZmllbGRzLmNjX3VzZXJzID0gMVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZSA9ICh1c2VySWQsIGluc3RhbmNlSWQpLT5cblx0XHRkYXRhID0gW11cblx0XHRhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUoaW5zdGFuY2VJZCwgdXNlcklkLCBkYXRhKVxuXHRcdGlmIGRhdGEubGVuZ3RoID4gMFxuXHRcdFx0cmV0dXJuIGRhdGFbMF1cblxuXG5cdGdldE15QXBwcm92ZSA9ICh1c2VySWQsIGluc3RhbmNlSWQpLT5cblx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlSWR9LCB7ZmllbGRzOiB7dHJhY2VzOiAxfX0pXG5cdFx0bXlBcHByb3ZlID0gbnVsbFxuXG5cdFx0aWYgIWluc3RhbmNlXG5cdFx0XHRyZXR1cm5cblxuXHRcdGlmICFpbnN0YW5jZS50cmFjZXMgfHwgaW5zdGFuY2UudHJhY2VzLmxlbmd0aCA8IDFcblx0XHRcdHJldHVyblxuXG5cdFx0bm90RmluaXNoZWRUcmFjZXMgPSBpbnN0YW5jZS50cmFjZXMuZmlsdGVyUHJvcGVydHkoXCJpc19maW5pc2hlZFwiLCBmYWxzZSlcblxuXHRcdGlmIG5vdEZpbmlzaGVkVHJhY2VzLmxlbmd0aCA+IDBcblx0XHRcdGFwcHJvdmVzID0gbm90RmluaXNoZWRUcmFjZXNbMF0uYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJpc19maW5pc2hlZFwiLCBmYWxzZSkuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIHVzZXJJZCk7XG5cblx0XHRcdGlmIGFwcHJvdmVzLmxlbmd0aCA+IDBcblx0XHRcdFx0YXBwcm92ZSA9IGFwcHJvdmVzWzBdXG5cdFx0XHRcdG15QXBwcm92ZSA9IHtcblx0XHRcdFx0XHRpZDogYXBwcm92ZS5faWQsXG5cdFx0XHRcdFx0aW5zdGFuY2U6IGFwcHJvdmUuaW5zdGFuY2UsXG5cdFx0XHRcdFx0dHJhY2U6IGFwcHJvdmUudHJhY2UsXG5cdFx0XHRcdFx0aXNfcmVhZDogYXBwcm92ZS5pc19yZWFkLFxuXHRcdFx0XHRcdHN0YXJ0X2RhdGU6IGFwcHJvdmUuc3RhcnRfZGF0ZVxuXHRcdFx0XHRcdGFnZW50OiBhcHByb3ZlLmFnZW50XG5cdFx0XHRcdFx0dXNlcl9uYW1lOiBhcHByb3ZlLnVzZXJfbmFtZVxuXHRcdFx0XHR9XG5cblx0XHRpZiAhbXlBcHByb3ZlXG5cdFx0XHRpc19yZWFkID0gZmFsc2Vcblx0XHRcdGluc3RhbmNlLnRyYWNlcy5mb3JFYWNoICh0cmFjZSkgLT5cblx0XHRcdFx0dHJhY2U/LmFwcHJvdmVzPy5mb3JFYWNoIChhcHByb3ZlKSAtPlxuXHRcdFx0XHRcdGlmIGFwcHJvdmUudHlwZSA9PSAnY2MnIGFuZCBhcHByb3ZlLnVzZXIgPT0gdXNlcklkIGFuZCBhcHByb3ZlLmlzX2ZpbmlzaGVkID09IGZhbHNlXG5cdFx0XHRcdFx0XHRpZiBhcHByb3ZlLmlzX3JlYWRcblx0XHRcdFx0XHRcdFx0aXNfcmVhZCA9IHRydWVcblx0XHRcdFx0XHRcdG15QXBwcm92ZSA9IHtpZDogYXBwcm92ZS5faWQsIGlzX3JlYWQ6IGlzX3JlYWQsIHN0YXJ0X2RhdGU6IGFwcHJvdmUuc3RhcnRfZGF0ZSwgYWdlbnQ6IGFwcHJvdmUuYWdlbnQsIHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWV9XG5cblx0XHRyZXR1cm4gbXlBcHByb3ZlXG5cblx0Z2V0U3RlcEN1cnJlbnROYW1lID0gKGluc3RhbmNlSWQpIC0+XG5cdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZUlkfSwge2ZpZWxkczoge1widHJhY2VzLm5hbWVcIjogMSwgXCJ0cmFjZXNcIjogeyRzbGljZTogLTF9fX0pXG5cdFx0aWYgaW5zdGFuY2Vcblx0XHRcdHN0ZXBDdXJyZW50TmFtZSA9IGluc3RhbmNlLnRyYWNlcz9bMF0/Lm5hbWVcblxuXHRcdHJldHVybiBzdGVwQ3VycmVudE5hbWVcblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpZHN9fSwge2ZpZWxkczoge3RyYWNlczogMH19KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdG15QXBwcm92ZSA9IGdldE15QXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0XHRteUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUoc2VsZi51c2VySWQsIGlkKVxuXHRcdFx0aWYgbXlBcHByb3ZlXG5cdFx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSBteUFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0XHRpbnN0YW5jZS5zdGFydF9kYXRlID0gbXlBcHByb3ZlLnN0YXJ0X2RhdGVcblx0XHRcdFx0aWYgbXlBcHByb3ZlLmFnZW50XG5cdFx0XHRcdFx0aW5zdGFuY2UuYWdlbnRfdXNlcl9uYW1lID0gbXlBcHByb3ZlLnVzZXJfbmFtZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbnN0YW5jZS5pc19yZWFkID0gdHJ1ZVxuXG5cdFx0XHRpZiBteUxhc3RGaW5pc2hlZEFwcHJvdmVcblx0XHRcdFx0aW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGVcblxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRpbnN0YW5jZS5jY19jb3VudCA9IGluc3RhbmNlLmNjX3VzZXJzPy5sZW5ndGggfHwgMFxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHR0cnlcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG5cdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRjb25zb2xlLmxvZygnaW5zdGFuY2Ugb2JzZXJ2ZUNoYW5nZXMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnc2VsZi51c2VySWQ6ICcsIHNlbGYudXNlcklkKTtcblx0XHRcdFx0Y29uc29sZS5sb2coJ3RhYmxlTmFtZTogJywgdGFibGVOYW1lKTtcblx0XHRcdFx0Y29uc29sZS5sb2coJ2lkczogJywgSlNPTi5zdHJpbmdpZnkoaWRzKSk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdteUFwcHJvdmU6ICcsIEpTT04uc3RyaW5naWZ5KG15QXBwcm92ZSkpO1xuXHRcdHJlbW92ZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcblx0fVxuXG5cdGlkcy5mb3JFYWNoIChpZCktPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRteUFwcHJvdmUgPSBnZXRNeUFwcHJvdmUoc2VsZi51c2VySWQsIGlkKVxuXHRcdG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0aWYgbXlBcHByb3ZlXG5cdFx0XHRpbnN0YW5jZS5pc19yZWFkID0gbXlBcHByb3ZlLmlzX3JlYWRcblx0XHRcdGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZVxuXHRcdFx0aWYgbXlBcHByb3ZlLmFnZW50XG5cdFx0XHRcdFx0aW5zdGFuY2UuYWdlbnRfdXNlcl9uYW1lID0gbXlBcHByb3ZlLnVzZXJfbmFtZVxuXHRcdGVsc2Vcblx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlXG5cblx0XHRpZiBteUxhc3RGaW5pc2hlZEFwcHJvdmVcblx0XHRcdGluc3RhbmNlLm15X2ZpbmlzaF9kYXRlID0gbXlMYXN0RmluaXNoZWRBcHByb3ZlLmZpbmlzaF9kYXRlXG5cblx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRpbnN0YW5jZS5jY19jb3VudCA9IGluc3RhbmNlLmNjX3VzZXJzPy5sZW5ndGggfHwgMFxuXHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG5cbk1ldGVvci5wdWJsaXNoIFwiaW5zdGFuY2VfdGFza3NfdGFidWxhclwiLCAodGFidWxhck5hbWUsIGlkcywgZmllbGRzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRjaGVjayh0YWJ1bGFyTmFtZSwgU3RyaW5nKTtcblxuXHRjaGVjayhpZHMsIEFycmF5KTtcblxuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpXG5cblx0IyBjb25zb2xlLmxvZygndGFidWxhck5hbWU6ICcsIHRhYnVsYXJOYW1lKTtcblx0IyBjb25zb2xlLmxvZygnaWRzOiAnLCBKU09OLnN0cmluZ2lmeShpZHMpKTtcblx0IyBjb25zb2xlLmxvZygnZmllbGRzOiAnLCBKU09OLnN0cmluZ2lmeShmaWVsZHMpKTtcblxuXHRkYi5pbnN0YW5jZV90YXNrcy5maW5kKHtcblx0XHRfaWQ6IHtcblx0XHRcdCRpbjogaWRzXG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmllbGRzOiBmaWVsZHNcblx0fSlcblxuTWV0ZW9yLnB1Ymxpc2ggXCJpbnN0YW5jZXNfdGFidWxhclwiLCAodGFidWxhck5hbWUsIGlkcywgZmllbGRzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRjaGVjayh0YWJ1bGFyTmFtZSwgU3RyaW5nKTtcblxuXHRjaGVjayhpZHMsIEFycmF5KTtcblxuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpXG5cblx0IyBjb25zb2xlLmxvZygndGFidWxhck5hbWU6ICcsIHRhYnVsYXJOYW1lKTtcblx0IyBjb25zb2xlLmxvZygnaWRzOiAnLCBKU09OLnN0cmluZ2lmeShpZHMpKTtcblx0IyBjb25zb2xlLmxvZygnZmllbGRzOiAnLCBKU09OLnN0cmluZ2lmeShmaWVsZHMpKTtcblxuXHRkYi5pbnN0YW5jZXMuZmluZCh7XG5cdFx0X2lkOiB7XG5cdFx0XHQkaW46IGlkc1xuXHRcdH1cblx0fSwge1xuXHRcdGZpZWxkczogZmllbGRzXG5cdH0pIiwidmFyIGFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZSwgbGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZTtcblxubGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZSA9IGZ1bmN0aW9uKGluc3RhbmNlaWQsIHVzZXJJZCwgZGF0YU1hcCwgY2FsbGJhY2spIHtcbiAgdmFyIG9wZXJhdGlvbjtcbiAgb3BlcmF0aW9uID0gW1xuICAgIHtcbiAgICAgIFwiJG1hdGNoXCI6IHtcbiAgICAgICAgXCJfaWRcIjogaW5zdGFuY2VpZFxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIFwiJHByb2plY3RcIjoge1xuICAgICAgICBcIm5hbWVcIjogMSxcbiAgICAgICAgXCJfYXBwcm92ZVwiOiBcIiR0cmFjZXMuYXBwcm92ZXNcIlxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIFwiJHVud2luZFwiOiBcIiRfYXBwcm92ZVwiXG4gICAgfSwge1xuICAgICAgXCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJcbiAgICB9LCB7XG4gICAgICBcIiRtYXRjaFwiOiB7XG4gICAgICAgIFwiX2FwcHJvdmUuaXNfZmluaXNoZWRcIjogdHJ1ZSxcbiAgICAgICAgJG9yOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJfYXBwcm92ZS5oYW5kbGVyXCI6IHVzZXJJZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIFwiX2FwcHJvdmUudXNlclwiOiB1c2VySWRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBcIiRncm91cFwiOiB7XG4gICAgICAgIFwiX2lkXCI6IFwiJF9pZFwiLFxuICAgICAgICBcImZpbmlzaF9kYXRlXCI6IHtcbiAgICAgICAgICBcIiRsYXN0XCI6IFwiJF9hcHByb3ZlLmZpbmlzaF9kYXRlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgXTtcbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKG9wZXJhdGlvbikudG9BcnJheShmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGRvYykge1xuICAgICAgcmV0dXJuIGRhdGFNYXAucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIGlmIChjYWxsYmFjayAmJiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5hc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUgPSBNZXRlb3Iud3JhcEFzeW5jKGxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUpO1xuXG5NZXRlb3IucHVibGlzaChcImluc3RhbmNlX3RhYnVsYXJcIiwgZnVuY3Rpb24odGFibGVOYW1lLCBpZHMsIGZpZWxkcykge1xuICB2YXIgZ2V0TXlBcHByb3ZlLCBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUsIGdldFN0ZXBDdXJyZW50TmFtZSwgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICBmaWVsZHMuY2NfdXNlcnMgPSAxO1xuICBzZWxmID0gdGhpcztcbiAgZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZnVuY3Rpb24odXNlcklkLCBpbnN0YW5jZUlkKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgZGF0YSA9IFtdO1xuICAgIGFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZShpbnN0YW5jZUlkLCB1c2VySWQsIGRhdGEpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkYXRhWzBdO1xuICAgIH1cbiAgfTtcbiAgZ2V0TXlBcHByb3ZlID0gZnVuY3Rpb24odXNlcklkLCBpbnN0YW5jZUlkKSB7XG4gICAgdmFyIGFwcHJvdmUsIGFwcHJvdmVzLCBpbnN0YW5jZSwgaXNfcmVhZCwgbXlBcHByb3ZlLCBub3RGaW5pc2hlZFRyYWNlcztcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICB0cmFjZXM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBteUFwcHJvdmUgPSBudWxsO1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpbnN0YW5jZS50cmFjZXMgfHwgaW5zdGFuY2UudHJhY2VzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbm90RmluaXNoZWRUcmFjZXMgPSBpbnN0YW5jZS50cmFjZXMuZmlsdGVyUHJvcGVydHkoXCJpc19maW5pc2hlZFwiLCBmYWxzZSk7XG4gICAgaWYgKG5vdEZpbmlzaGVkVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcHJvdmVzID0gbm90RmluaXNoZWRUcmFjZXNbMF0uYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJpc19maW5pc2hlZFwiLCBmYWxzZSkuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIHVzZXJJZCk7XG4gICAgICBpZiAoYXBwcm92ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhcHByb3ZlID0gYXBwcm92ZXNbMF07XG4gICAgICAgIG15QXBwcm92ZSA9IHtcbiAgICAgICAgICBpZDogYXBwcm92ZS5faWQsXG4gICAgICAgICAgaW5zdGFuY2U6IGFwcHJvdmUuaW5zdGFuY2UsXG4gICAgICAgICAgdHJhY2U6IGFwcHJvdmUudHJhY2UsXG4gICAgICAgICAgaXNfcmVhZDogYXBwcm92ZS5pc19yZWFkLFxuICAgICAgICAgIHN0YXJ0X2RhdGU6IGFwcHJvdmUuc3RhcnRfZGF0ZSxcbiAgICAgICAgICBhZ2VudDogYXBwcm92ZS5hZ2VudCxcbiAgICAgICAgICB1c2VyX25hbWU6IGFwcHJvdmUudXNlcl9uYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbXlBcHByb3ZlKSB7XG4gICAgICBpc19yZWFkID0gZmFsc2U7XG4gICAgICBpbnN0YW5jZS50cmFjZXMuZm9yRWFjaChmdW5jdGlvbih0cmFjZSkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICByZXR1cm4gdHJhY2UgIT0gbnVsbCA/IChyZWYgPSB0cmFjZS5hcHByb3ZlcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICBpZiAoYXBwcm92ZS50eXBlID09PSAnY2MnICYmIGFwcHJvdmUudXNlciA9PT0gdXNlcklkICYmIGFwcHJvdmUuaXNfZmluaXNoZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoYXBwcm92ZS5pc19yZWFkKSB7XG4gICAgICAgICAgICAgIGlzX3JlYWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG15QXBwcm92ZSA9IHtcbiAgICAgICAgICAgICAgaWQ6IGFwcHJvdmUuX2lkLFxuICAgICAgICAgICAgICBpc19yZWFkOiBpc19yZWFkLFxuICAgICAgICAgICAgICBzdGFydF9kYXRlOiBhcHByb3ZlLnN0YXJ0X2RhdGUsXG4gICAgICAgICAgICAgIGFnZW50OiBhcHByb3ZlLmFnZW50LFxuICAgICAgICAgICAgICB1c2VyX25hbWU6IGFwcHJvdmUudXNlcl9uYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG15QXBwcm92ZTtcbiAgfTtcbiAgZ2V0U3RlcEN1cnJlbnROYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VJZCkge1xuICAgIHZhciBpbnN0YW5jZSwgcmVmLCByZWYxLCBzdGVwQ3VycmVudE5hbWU7XG4gICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgXCJ0cmFjZXMubmFtZVwiOiAxLFxuICAgICAgICBcInRyYWNlc1wiOiB7XG4gICAgICAgICAgJHNsaWNlOiAtMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBzdGVwQ3VycmVudE5hbWUgPSAocmVmID0gaW5zdGFuY2UudHJhY2VzKSAhPSBudWxsID8gKHJlZjEgPSByZWZbMF0pICE9IG51bGwgPyByZWYxLm5hbWUgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBzdGVwQ3VycmVudE5hbWU7XG4gIH07XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogaWRzXG4gICAgfVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICB0cmFjZXM6IDBcbiAgICB9XG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIGVycm9yLCBpbnN0YW5jZSwgbXlBcHByb3ZlLCBteUxhc3RGaW5pc2hlZEFwcHJvdmUsIHJlZiwgcmVmMTtcbiAgICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGlkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgICBteUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUoc2VsZi51c2VySWQsIGlkKTtcbiAgICAgIGlmIChteUFwcHJvdmUpIHtcbiAgICAgICAgaW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkO1xuICAgICAgICBpbnN0YW5jZS5zdGFydF9kYXRlID0gbXlBcHByb3ZlLnN0YXJ0X2RhdGU7XG4gICAgICAgIGlmIChteUFwcHJvdmUuYWdlbnQpIHtcbiAgICAgICAgICBpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5pc19yZWFkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChteUxhc3RGaW5pc2hlZEFwcHJvdmUpIHtcbiAgICAgICAgaW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGU7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZS5pc19jYyA9ICgocmVmID0gaW5zdGFuY2UuY2NfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoc2VsZi51c2VySWQpIDogdm9pZCAwKSB8fCBmYWxzZTtcbiAgICAgIGluc3RhbmNlLmNjX2NvdW50ID0gKChyZWYxID0gaW5zdGFuY2UuY2NfdXNlcnMpICE9IG51bGwgPyByZWYxLmxlbmd0aCA6IHZvaWQgMCkgfHwgMDtcbiAgICAgIGRlbGV0ZSBpbnN0YW5jZS5jY191c2VycztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luc3RhbmNlIG9ic2VydmVDaGFuZ2VzIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3NlbGYudXNlcklkOiAnLCBzZWxmLnVzZXJJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0YWJsZU5hbWU6ICcsIHRhYmxlTmFtZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coJ215QXBwcm92ZTogJywgSlNPTi5zdHJpbmdpZnkobXlBcHByb3ZlKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZW1vdmVkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG4gICAgfVxuICB9KTtcbiAgaWRzLmZvckVhY2goZnVuY3Rpb24oaWQpIHtcbiAgICB2YXIgaW5zdGFuY2UsIG15QXBwcm92ZSwgbXlMYXN0RmluaXNoZWRBcHByb3ZlLCByZWYsIHJlZjE7XG4gICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICB9KTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG15QXBwcm92ZSA9IGdldE15QXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpO1xuICAgIG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpO1xuICAgIGlmIChteUFwcHJvdmUpIHtcbiAgICAgIGluc3RhbmNlLmlzX3JlYWQgPSBteUFwcHJvdmUuaXNfcmVhZDtcbiAgICAgIGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZTtcbiAgICAgIGlmIChteUFwcHJvdmUuYWdlbnQpIHtcbiAgICAgICAgaW5zdGFuY2UuYWdlbnRfdXNlcl9uYW1lID0gbXlBcHByb3ZlLnVzZXJfbmFtZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuaXNfcmVhZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChteUxhc3RGaW5pc2hlZEFwcHJvdmUpIHtcbiAgICAgIGluc3RhbmNlLm15X2ZpbmlzaF9kYXRlID0gbXlMYXN0RmluaXNoZWRBcHByb3ZlLmZpbmlzaF9kYXRlO1xuICAgIH1cbiAgICBpbnN0YW5jZS5pc19jYyA9ICgocmVmID0gaW5zdGFuY2UuY2NfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoc2VsZi51c2VySWQpIDogdm9pZCAwKSB8fCBmYWxzZTtcbiAgICBpbnN0YW5jZS5jY19jb3VudCA9ICgocmVmMSA9IGluc3RhbmNlLmNjX3VzZXJzKSAhPSBudWxsID8gcmVmMS5sZW5ndGggOiB2b2lkIDApIHx8IDA7XG4gICAgZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzO1xuICAgIHJldHVybiBzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG4gIH0pO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsIGZ1bmN0aW9uKHRhYnVsYXJOYW1lLCBpZHMsIGZpZWxkcykge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBjaGVjayh0YWJ1bGFyTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIHJldHVybiBkYi5pbnN0YW5jZV90YXNrcy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogaWRzXG4gICAgfVxuICB9LCB7XG4gICAgZmllbGRzOiBmaWVsZHNcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goXCJpbnN0YW5jZXNfdGFidWxhclwiLCBmdW5jdGlvbih0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgY2hlY2sodGFidWxhck5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IGZpZWxkc1xuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlc19kcmFmdCcsIChzcGFjZUlkKSAtPlxuXHRjaGVjayBzcGFjZUlkLCBTdHJpbmdcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dXNlcklkID0gdGhpcy51c2VySWRcblx0cmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtzdGF0ZTpcImRyYWZ0XCIsc3BhY2U6c3BhY2VJZCxzdWJtaXR0ZXI6dXNlcklkLCRvcjpbe2luYm94X3VzZXJzOiB7JGV4aXN0czpmYWxzZX19LCB7aW5ib3hfdXNlcnM6IFtdfV19LCB7ZmllbGRzOiB7X2lkOiAxLCBzdGF0ZTogMSwgc3BhY2U6IDEsIHN1Ym1pdHRlcjogMSwgaW5ib3hfdXNlcnM6IDEsIG1vZGlmaWVkOiAxLCBuYW1lOiAxfSwgc29ydDp7bW9kaWZpZWQ6IC0xfX0pIiwiTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlc19kcmFmdCcsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgdmFyIHVzZXJJZDtcbiAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgdXNlcklkID0gdGhpcy51c2VySWQ7XG4gIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgc3RhdGU6IFwiZHJhZnRcIixcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICBzdWJtaXR0ZXI6IHVzZXJJZCxcbiAgICAkb3I6IFtcbiAgICAgIHtcbiAgICAgICAgaW5ib3hfdXNlcnM6IHtcbiAgICAgICAgICAkZXhpc3RzOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGluYm94X3VzZXJzOiBbXVxuICAgICAgfVxuICAgIF1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgX2lkOiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIHN1Ym1pdHRlcjogMSxcbiAgICAgIGluYm94X3VzZXJzOiAxLFxuICAgICAgbW9kaWZpZWQ6IDEsXG4gICAgICBuYW1lOiAxXG4gICAgfSxcbiAgICBzb3J0OiB7XG4gICAgICBtb2RpZmllZDogLTFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnZGlzdHJpYnV0ZWRfaW5zdGFuY2VzX3N0YXRlX2J5X2lkcycsIChpbnN0YW5jZV9pZHMpLT5cblx0Y2hlY2soaW5zdGFuY2VfaWRzLCBBcnJheSlcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFxuXHR1bmxlc3MgaW5zdGFuY2VfaWRzXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGlmIF8uaXNFbXB0eShpbnN0YW5jZV9pZHMpXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzXG5cblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbjogaW5zdGFuY2VfaWRzfX0sIHtmaWVsZHM6IHtzdGF0ZTogMSwgdHJhY2VzOnskc2xpY2U6IDF9IH0gfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGFkZGVkOiAoaWQsIGZpZWxkcyktPlxuXHRcdFx0c2VsZi5hZGRlZCgnaW5zdGFuY2VzJywgaWQsIHtzdGF0ZTogZmllbGRzLnN0YXRlLCBpc19yZWFkOiBmaWVsZHMudHJhY2VzWzBdLmFwcHJvdmVzWzBdLmlzX3JlYWR9KVxuXG5cdFx0Y2hhbmdlZDogKGlkLCBmaWVsZHMpLT5cblx0XHRcdGlmIGZpZWxkcy5zdGF0ZVxuXHRcdFx0XHRzZWxmLmNoYW5nZWQoJ2luc3RhbmNlcycsIGlkLCB7c3RhdGU6IGZpZWxkcy5zdGF0ZX0pXG5cdFx0XHRpZiBmaWVsZHMudHJhY2VzXG5cdFx0XHRcdHNlbGYuY2hhbmdlZCgnaW5zdGFuY2VzJywgaWQsIHtpc19yZWFkOiBmaWVsZHMudHJhY2VzWzBdLmFwcHJvdmVzWzBdLmlzX3JlYWR9KVxuXHR9XG5cblx0dGhpcy5yZWFkeSgpXG5cdHRoaXMub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG4iLCJNZXRlb3IucHVibGlzaCgnZGlzdHJpYnV0ZWRfaW5zdGFuY2VzX3N0YXRlX2J5X2lkcycsIGZ1bmN0aW9uKGluc3RhbmNlX2lkcykge1xuICB2YXIgaGFuZGxlLCBzZWxmO1xuICBjaGVjayhpbnN0YW5jZV9pZHMsIEFycmF5KTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZV9pZHMpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkoaW5zdGFuY2VfaWRzKSkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogaW5zdGFuY2VfaWRzXG4gICAgfVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHRyYWNlczoge1xuICAgICAgICAkc2xpY2U6IDFcbiAgICAgIH1cbiAgICB9XG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBhZGRlZDogZnVuY3Rpb24oaWQsIGZpZWxkcykge1xuICAgICAgcmV0dXJuIHNlbGYuYWRkZWQoJ2luc3RhbmNlcycsIGlkLCB7XG4gICAgICAgIHN0YXRlOiBmaWVsZHMuc3RhdGUsXG4gICAgICAgIGlzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCwgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGRzLnN0YXRlKSB7XG4gICAgICAgIHNlbGYuY2hhbmdlZCgnaW5zdGFuY2VzJywgaWQsIHtcbiAgICAgICAgICBzdGF0ZTogZmllbGRzLnN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkcy50cmFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZCgnaW5zdGFuY2VzJywgaWQsIHtcbiAgICAgICAgICBpc19yZWFkOiBmaWVsZHMudHJhY2VzWzBdLmFwcHJvdmVzWzBdLmlzX3JlYWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy5yZWFkeSgpO1xuICByZXR1cm4gdGhpcy5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAncmVsYXRlZF9pbnN0YWNlcycsIChpbnN0YW5jZUlkLCByZWxhdGVkX2luc3RhbmNlcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGluc3RhbmNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmVsYXRlZF9pbnN0YW5jZV9pZHMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZUlkLHtmaWVsZHM6IHtyZWxhdGVkX2luc3RhbmNlczogMX19KT8ucmVsYXRlZF9pbnN0YW5jZXNcblxuXHRpZiByZWxhdGVkX2luc3RhbmNlX2lkcyAmJiBfLmlzQXJyYXkocmVsYXRlZF9pbnN0YW5jZV9pZHMpXG5cdFx0cmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW4gOiByZWxhdGVkX2luc3RhbmNlX2lkc319LCB7ZmllbGRzOiB7X2lkOiAxLCBuYW1lOiAxLCBzcGFjZTogMX19KVxuXHRlbHNlXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKSIsIk1ldGVvci5wdWJsaXNoKCdyZWxhdGVkX2luc3RhY2VzJywgZnVuY3Rpb24oaW5zdGFuY2VJZCwgcmVsYXRlZF9pbnN0YW5jZXMpIHtcbiAgdmFyIHJlZiwgcmVsYXRlZF9pbnN0YW5jZV9pZHM7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmVsYXRlZF9pbnN0YW5jZV9pZHMgPSAocmVmID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VJZCwge1xuICAgIGZpZWxkczoge1xuICAgICAgcmVsYXRlZF9pbnN0YW5jZXM6IDFcbiAgICB9XG4gIH0pKSAhPSBudWxsID8gcmVmLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwO1xuICBpZiAocmVsYXRlZF9pbnN0YW5jZV9pZHMgJiYgXy5pc0FycmF5KHJlbGF0ZWRfaW5zdGFuY2VfaWRzKSkge1xuICAgIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgICBfaWQ6IHtcbiAgICAgICAgJGluOiByZWxhdGVkX2luc3RhbmNlX2lkc1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIG5hbWU6IDEsXG4gICAgICAgIHNwYWNlOiAxXG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufSk7XG4iLCJpZiBNZXRlb3IuaXNTZXJ2ZXJcbiAgICBNZXRlb3IucHVibGlzaCAnc3BhY2VfdXNlcl9zaWducycsIChzcGFjZUlkKSAtPlxuICAgICAgICBjaGVjayBzcGFjZUlkLCBTdHJpbmdcblxuICAgICAgICB1bmxlc3MgdGhpcy51c2VySWRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5KClcblxuICAgICAgICByZXR1cm4gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kKHsgc3BhY2U6IHNwYWNlSWQgfSwge2ZpZWxkczoge2NyZWF0ZWRfYnk6IDAsIGNyZWF0ZWQ6IDAsIG1vZGlmaWVkX2J5OiAwfX0pXG4iLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5wdWJsaXNoKCdzcGFjZV91c2VyX3NpZ25zJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgIGNoZWNrKHNwYWNlSWQsIFN0cmluZyk7XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJfc2lnbnMuZmluZCh7XG4gICAgICBzcGFjZTogc3BhY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICBjcmVhdGVkOiAwLFxuICAgICAgICBtb2RpZmllZF9ieTogMFxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbiIsIiMjI1xuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgXCJ1c2VyX2luYm94X2luc3RhbmNlXCIsICgpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHRcdHVzZXI6IHRoaXMudXNlcklkLFxuXHRcdHVzZXJfYWNjZXB0ZWQ6IHRydWVcblx0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXHRxdWVyeSA9IHtzcGFjZTogeyRpbjogdXNlclNwYWNlSWRzfX1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGZpbmQ6IC0+XG5cdFx0ZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcblx0XHRcdGZpZWxkczoge1xuXHRcdFx0XHRzcGFjZTogMSxcblx0XHRcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0XHRcdGZsb3c6IDEsXG5cdFx0XHRcdGluYm94X3VzZXJzOiAxLFxuXHRcdFx0XHRjY191c2VyczogMSxcblx0XHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRcdG5hbWU6IDEsXG5cdFx0XHRcdG1vZGlmaWVkOiAxLFxuXHRcdFx0XHRmb3JtOiAxXG5cdFx0XHR9LCBzb3J0OiB7bW9kaWZpZWQ6IC0xfSwgc2tpcDogMCwgbGltaXQ6IDIwMFxuXHRcdH0pO1xuXHRjaGlsZHJlbjogW1xuXHRcdHtcblx0XHRcdGZpbmQ6IChpbnN0YW5jZSwgcG9zdCktPlxuXHRcdFx0XHRkYi5mbG93cy5maW5kKHtfaWQ6IGluc3RhbmNlLmZsb3d9LCB7ZmllbGRzOiB7bmFtZTogMSwgc3BhY2U6IDF9fSk7XG5cdFx0fVxuXHRdXG4jIyNcblxuIyMjXG5NZXRlb3IucHVibGlzaCAnbXlfaW5ib3hfaW5zdGFuY2VzJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdCNcdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHQjXHRcdHVzZXI6IHRoaXMudXNlcklkLFxuXHQjXHRcdHVzZXJfYWNjZXB0ZWQ6IHRydWVcblx0I1x0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXG5cdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmllbGRzID0ge1xuXHRcdHNwYWNlOiAxLFxuI1x0XHRhcHBsaWNhbnRfbmFtZTogMSxcblx0XHRmbG93OiAxLFxuXHRcdGluYm94X3VzZXJzOiAxLFxuXHRcdGNjX3VzZXJzOiAxLFxuXHRcdHN0YXRlOiAxLFxuI1x0XHRuYW1lOiAxLFxuI1x0XHRtb2RpZmllZDogMSxcblx0XHRmb3JtOiAxXG5cdH1cblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge3NvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogNTAwfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGFkZGVkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKVxuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuIyMjXG5cbl9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlID0gKHNwYWNlSWQsIHVzZXJJZCwgX2l0ZW1zLCBjYWxsYmFjayktPlxuXHRkYi5pbnN0YW5jZXMucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShbXG5cdFx0e1xuXHRcdFx0JG1hdGNoOiB7XG5cdFx0XHRcdHNwYWNlOiBzcGFjZUlkLFxuXHRcdFx0XHQkb3I6IFt7aW5ib3hfdXNlcnM6IHVzZXJJZH0sIHtjY191c2VyczogdXNlcklkfV1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdCRncm91cDoge1xuXHRcdFx0XHRfaWQ6IHtmbG93OiBcIiRmbG93XCIsIGNhdGVnb3J5OiBcIiRjYXRlZ29yeVwifSwgY291bnQ6IHskc3VtOiAxfVxuXHRcdFx0fVxuXHRcdH1cblx0XSkudG9BcnJheSAoZXJyLCBkYXRhKS0+XG5cdFx0aWYgZXJyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyKVxuXG5cdFx0ZGF0YS5mb3JFYWNoIChkb2MpIC0+XG5cdFx0XHRfaXRlbXMucHVzaCBkb2NcblxuXHRcdGlmIGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaylcblx0XHRcdGNhbGxiYWNrKClcblx0XHRyZXR1cm5cblxuX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSBNZXRlb3Iud3JhcEFzeW5jKF9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKVxuXG5NZXRlb3IucHVibGlzaCAnbXlfaW5ib3hfZmxvd19pbnN0YW5jZXNfY291bnQnLCAoc3BhY2VJZCktPlxuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpcztcblxuXHRxdWVyeSA9IHtzcGFjZTogc3BhY2VJZH1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGRhdGEgPSBbXSAgI+aVsOaNruagvOW8j++8mlt7X2lkOmZsb3dJZCwgY291bnQ6IOW+heWKnuaVsOmHj30sIHtfaWQ6Zmxvd0lkMiwgY291bnQ6IOW+heWKnuaVsOmHjzJ9XVxuXHRfYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZShzcGFjZUlkLCBzZWxmLnVzZXJJZCwgZGF0YSlcblxuXHRfZmxvd3NEYXRhID0gW11cblxuXHRfLmVhY2ggZGF0YSwgKGRhdGFJdGVtKS0+XG5cdFx0X2Zsb3dzRGF0YS5wdXNoKHtfaWQ6IGRhdGFJdGVtLl9pZC5mbG93LCBjYXRlZ29yeTogZGF0YUl0ZW0uX2lkLmNhdGVnb3J5LCBjb3VudDogZGF0YUl0ZW0uY291bnR9KVxuXG5cdHNlbGYuYWRkZWQoXCJmbG93X2luc3RhbmNlc1wiLCBzcGFjZUlkLCB7Zmxvd3M6IF9mbG93c0RhdGF9KTtcblxuXHRfY2hhbmdlRGF0YSA9IChkb2MsIGFjdGlvbiktPlxuXHRcdGZsb3dfaW5zdGFuY2UgPSBfLmZpbmQgX2Zsb3dzRGF0YSwgKGYpLT5cblx0XHRcdHJldHVybiBmLl9pZCA9PSBkb2MuZmxvd1xuXHRcdGlmIGZsb3dfaW5zdGFuY2Vcblx0XHRcdGlmIGFjdGlvbiA9PSBcImFkZGVkXCJcblx0XHRcdFx0Zmxvd19pbnN0YW5jZS5jb3VudCsrXG5cdFx0XHRlbHNlIGlmIGFjdGlvbiA9PSBcInJlbW92ZWRcIlxuXHRcdFx0XHRmbG93X2luc3RhbmNlLmNvdW50LS1cblx0XHRlbHNlIGlmIGFjdGlvbiA9PSBcImFkZGVkXCJcblx0XHRcdF9mbG93c0RhdGEucHVzaCB7X2lkOiBkb2MuZmxvdywgY2F0ZWdvcnk6IGRvYy5jYXRlZ29yeSwgY291bnQ6IDF9XG5cblx0XHRzZWxmLmNoYW5nZWQoXCJmbG93X2luc3RhbmNlc1wiLCBzcGFjZUlkLCB7Zmxvd3M6IF9mbG93c0RhdGF9KTtcblxuXHRfaW5pdCA9IHRydWVcblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtmaWVsZHM6IHtfaWQ6IDEsIGluYm94X3VzZXJzOiAxLCBjY191c2VyczogMSwgZmxvdzogMSwgY2F0ZWdvcnk6IDF9fSkub2JzZXJ2ZSB7XG5cdFx0YWRkZWQ6IChkb2MpLT5cblx0XHRcdGlmICFfaW5pdFxuXHRcdFx0XHRfY2hhbmdlRGF0YShkb2MsIFwiYWRkZWRcIilcblx0XHRyZW1vdmVkOiAoZG9jKS0+XG5cdFx0XHRpZiAhX2luaXRcblx0XHRcdFx0X2NoYW5nZURhdGEoZG9jLCBcInJlbW92ZWRcIilcblx0fVxuXHRfaW5pdCA9IGZhbHNlXG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKSIsIlxuLypcbk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlIFwidXNlcl9pbmJveF9pbnN0YW5jZVwiLCAoKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1c2VyU3BhY2VJZHMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcblx0XHR1c2VyOiB0aGlzLnVzZXJJZCxcblx0XHR1c2VyX2FjY2VwdGVkOiB0cnVlXG5cdH0sIHtmaWVsZHM6IHtzcGFjZTogMX19KS5mZXRjaCgpLmdldEVhY2goXCJzcGFjZVwiKTtcblx0cXVlcnkgPSB7c3BhY2U6IHskaW46IHVzZXJTcGFjZUlkc319XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRmaW5kOiAtPlxuXHRcdGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG5cdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRcdGFwcGxpY2FudF9uYW1lOiAxLFxuXHRcdFx0XHRmbG93OiAxLFxuXHRcdFx0XHRpbmJveF91c2VyczogMSxcblx0XHRcdFx0Y2NfdXNlcnM6IDEsXG5cdFx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0XHRuYW1lOiAxLFxuXHRcdFx0XHRtb2RpZmllZDogMSxcblx0XHRcdFx0Zm9ybTogMVxuXHRcdFx0fSwgc29ydDoge21vZGlmaWVkOiAtMX0sIHNraXA6IDAsIGxpbWl0OiAyMDBcblx0XHR9KTtcblx0Y2hpbGRyZW46IFtcblx0XHR7XG5cdFx0XHRmaW5kOiAoaW5zdGFuY2UsIHBvc3QpLT5cblx0XHRcdFx0ZGIuZmxvd3MuZmluZCh7X2lkOiBpbnN0YW5jZS5mbG93fSwge2ZpZWxkczoge25hbWU6IDEsIHNwYWNlOiAxfX0pO1xuXHRcdH1cblx0XVxuICovXG5cbi8qXG5NZXRlb3IucHVibGlzaCAnbXlfaW5ib3hfaW5zdGFuY2VzJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdCAqXHR1c2VyU3BhY2VJZHMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcblx0ICpcdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdCAqXHRcdHVzZXJfYWNjZXB0ZWQ6IHRydWVcblx0ICpcdH0sIHtmaWVsZHM6IHtzcGFjZTogMX19KS5mZXRjaCgpLmdldEVhY2goXCJzcGFjZVwiKTtcblxuXHRxdWVyeSA9IHtzcGFjZTogc3BhY2VJZH1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGZpZWxkcyA9IHtcblx0XHRzcGFjZTogMSxcbiAqXHRcdGFwcGxpY2FudF9uYW1lOiAxLFxuXHRcdGZsb3c6IDEsXG5cdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0Y2NfdXNlcnM6IDEsXG5cdFx0c3RhdGU6IDEsXG4gKlx0XHRuYW1lOiAxLFxuICpcdFx0bW9kaWZpZWQ6IDEsXG5cdFx0Zm9ybTogMVxuXHR9XG5cblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtzb3J0OiB7bW9kaWZpZWQ6IC0xfSwgc2tpcDogMCwgbGltaXQ6IDUwMH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRhZGRlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSlcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuXHRcdHJlbW92ZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcblx0fVxuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcbiAqL1xudmFyIF9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlLCBfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZTtcblxuX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQsIF9pdGVtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKFtcbiAgICB7XG4gICAgICAkbWF0Y2g6IHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluYm94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBjY191c2VyczogdXNlcklkXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgJGdyb3VwOiB7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgIGZsb3c6IFwiJGZsb3dcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCIkY2F0ZWdvcnlcIlxuICAgICAgICB9LFxuICAgICAgICBjb3VudDoge1xuICAgICAgICAgICRzdW06IDFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgXSkudG9BcnJheShmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGRvYykge1xuICAgICAgcmV0dXJuIF9pdGVtcy5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgaWYgKGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbn07XG5cbl9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlID0gTWV0ZW9yLndyYXBBc3luYyhfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSk7XG5cbk1ldGVvci5wdWJsaXNoKCdteV9pbmJveF9mbG93X2luc3RhbmNlc19jb3VudCcsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgdmFyIF9jaGFuZ2VEYXRhLCBfZmxvd3NEYXRhLCBfaW5pdCwgZGF0YSwgaGFuZGxlLCBxdWVyeSwgc2VsZjtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIHF1ZXJ5ID0ge1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH07XG4gIHF1ZXJ5LiRvciA9IFtcbiAgICB7XG4gICAgICBpbmJveF91c2VyczogdGhpcy51c2VySWRcbiAgICB9LCB7XG4gICAgICBjY191c2VyczogdGhpcy51c2VySWRcbiAgICB9XG4gIF07XG4gIGRhdGEgPSBbXTtcbiAgX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUoc3BhY2VJZCwgc2VsZi51c2VySWQsIGRhdGEpO1xuICBfZmxvd3NEYXRhID0gW107XG4gIF8uZWFjaChkYXRhLCBmdW5jdGlvbihkYXRhSXRlbSkge1xuICAgIHJldHVybiBfZmxvd3NEYXRhLnB1c2goe1xuICAgICAgX2lkOiBkYXRhSXRlbS5faWQuZmxvdyxcbiAgICAgIGNhdGVnb3J5OiBkYXRhSXRlbS5faWQuY2F0ZWdvcnksXG4gICAgICBjb3VudDogZGF0YUl0ZW0uY291bnRcbiAgICB9KTtcbiAgfSk7XG4gIHNlbGYuYWRkZWQoXCJmbG93X2luc3RhbmNlc1wiLCBzcGFjZUlkLCB7XG4gICAgZmxvd3M6IF9mbG93c0RhdGFcbiAgfSk7XG4gIF9jaGFuZ2VEYXRhID0gZnVuY3Rpb24oZG9jLCBhY3Rpb24pIHtcbiAgICB2YXIgZmxvd19pbnN0YW5jZTtcbiAgICBmbG93X2luc3RhbmNlID0gXy5maW5kKF9mbG93c0RhdGEsIGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiBmLl9pZCA9PT0gZG9jLmZsb3c7XG4gICAgfSk7XG4gICAgaWYgKGZsb3dfaW5zdGFuY2UpIHtcbiAgICAgIGlmIChhY3Rpb24gPT09IFwiYWRkZWRcIikge1xuICAgICAgICBmbG93X2luc3RhbmNlLmNvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gXCJyZW1vdmVkXCIpIHtcbiAgICAgICAgZmxvd19pbnN0YW5jZS5jb3VudC0tO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBcImFkZGVkXCIpIHtcbiAgICAgIF9mbG93c0RhdGEucHVzaCh7XG4gICAgICAgIF9pZDogZG9jLmZsb3csXG4gICAgICAgIGNhdGVnb3J5OiBkb2MuY2F0ZWdvcnksXG4gICAgICAgIGNvdW50OiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtcbiAgICAgIGZsb3dzOiBfZmxvd3NEYXRhXG4gICAgfSk7XG4gIH07XG4gIF9pbml0ID0gdHJ1ZTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIGluYm94X3VzZXJzOiAxLFxuICAgICAgY2NfdXNlcnM6IDEsXG4gICAgICBmbG93OiAxLFxuICAgICAgY2F0ZWdvcnk6IDFcbiAgICB9XG4gIH0pLm9ic2VydmUoe1xuICAgIGFkZGVkOiBmdW5jdGlvbihkb2MpIHtcbiAgICAgIGlmICghX2luaXQpIHtcbiAgICAgICAgcmV0dXJuIF9jaGFuZ2VEYXRhKGRvYywgXCJhZGRlZFwiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKGRvYykge1xuICAgICAgaWYgKCFfaW5pdCkge1xuICAgICAgICByZXR1cm4gX2NoYW5nZURhdGEoZG9jLCBcInJlbW92ZWRcIik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgX2luaXQgPSBmYWxzZTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJcbk1ldGVvci5wdWJsaXNoICdmbG93X21haW5fYXR0YWNoX3RlbXBsYXRlJywgKHNwYWNlSWQsIGZsb3dJZCktPlxuXHRjaGVjayhzcGFjZUlkLCBTdHJpbmcpXG5cdGNoZWNrKGZsb3dJZCwgU3RyaW5nKVxuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZCAmJiBmbG93SWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbignY21zX2ZpbGVzJykuZmluZCh7IHNwYWNlOiBzcGFjZUlkLCAncGFyZW50Lm8nOiAnZmxvd3MnLCAncGFyZW50Lmlkcyc6IGZsb3dJZCwgIG5hbWU6ICfmraPmlocuZG9jeCcgfSlcbiIsIk1ldGVvci5wdWJsaXNoKCdmbG93X21haW5fYXR0YWNoX3RlbXBsYXRlJywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGNoZWNrKHNwYWNlSWQsIFN0cmluZyk7XG4gIGNoZWNrKGZsb3dJZCwgU3RyaW5nKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCEoc3BhY2VJZCAmJiBmbG93SWQpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdjbXNfZmlsZXMnKS5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAncGFyZW50Lm8nOiAnZmxvd3MnLFxuICAgICdwYXJlbnQuaWRzJzogZmxvd0lkLFxuICAgIG5hbWU6ICfmraPmlocuZG9jeCdcbiAgfSk7XG59KTtcbiIsIndvcmtmbG93VGVtcGxhdGUgPSB7fVxuXG4j5Y+v55So5q2k6ISa5pys5LuO5qih5p2/5bel5L2c5Yy65YGa5om56YeP5a+85Ye677yaXG4j5L2/55So566h55CG5ZGY6LSm5oi355m75b2V5ZCO77yM6L+b5YWlRmxvd01vZHVsZXPvvIzlnKjmjqfliLblj7DmiafooYzku6XkuIvohJrmnKzljbPlj69cbiNkYi5mb3Jtcy5maW5kKHtzdGF0ZTpcImVuYWJsZWRcIn0pLmZvckVhY2goZnVuY3Rpb24oZm9ybSl7d2luZG93Lm9wZW4oTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL3dvcmtmbG93L2V4cG9ydC9mb3JtP2Zvcm09XCIrZm9ybS5faWQpKX0pXG53b3JrZmxvd1RlbXBsYXRlW1wiZW5cIl0gPVtdXG5cbiPlj6/nlKjmraTohJrmnKzku47mqKHmnb/lt6XkvZzljLrlgZrmibnph4/lr7zlh7rvvJpcbiPkvb/nlKjnrqHnkIblkZjotKbmiLfnmbvlvZXlkI7vvIzov5vlhaXmqKHmnb/kuJPljLrvvIzlnKjmjqfliLblj7DmiafooYzku6XkuIvohJrmnKzljbPlj69cbiNkYi5mb3Jtcy5maW5kKHtzdGF0ZTpcImVuYWJsZWRcIn0pLmZvckVhY2goZnVuY3Rpb24oZm9ybSl7d2luZG93Lm9wZW4oTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL3dvcmtmbG93L2V4cG9ydC9mb3JtP2Zvcm09XCIrZm9ybS5faWQpKX0pXG53b3JrZmxvd1RlbXBsYXRlW1wiemgtQ05cIl0gPVtdXG5cbk1ldGVvci5zdGFydHVwICgpLT5cblx0ZnMgPSByZXF1aXJlKCdmcycpXG5cdHBhdGggPSByZXF1aXJlKCdwYXRoJylcblx0bWltZSA9IHJlcXVpcmUoJ21pbWUnKVxuXHRyZWFkRmlsZUxpc3QgPSAocGF0aERpciwgZmlsZXNMaXN0KS0+XG5cdFx0ZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhwYXRoRGlyKVxuXHRcdGZpbGVzLmZvckVhY2ggKG5hbWUsIGluZGV4KS0+XG5cdFx0XHRzdGF0ID0gZnMuc3RhdFN5bmMocGF0aC5qb2luKHBhdGhEaXIsIG5hbWUpKVxuXHRcdFx0aWYgc3RhdC5pc0RpcmVjdG9yeSgpXG5cdFx0XHRcdCMg6YCS5b2S6K+75Y+W5paH5Lu2XG5cdFx0XHRcdHJlYWRGaWxlTGlzdChwYXRoLmpvaW4ocGF0aERpciwgbmFtZSksIGZpbGVzTGlzdClcblx0XHRcdGVsc2Vcblx0XHRcdFx0b2JqID0ge31cblx0XHRcdFx0b2JqLnBhdGggPSBwYXRoRGlyXG5cdFx0XHRcdG9iai5uYW1lID0gbmFtZVxuXHRcdFx0XHRmaWxlc0xpc3QucHVzaChvYmopXG5cblx0I+iOt+WPlnpoLWNu5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XG5cdGZpbGVzTGlzdF9jbiA9IFtdXG5cdHBhdGhfY24gPSBNZXRlb3Iuc2V0dGluZ3Mud29ya2Zsb3dUZW1wbGF0ZXM/LnBhdGhfY25cblx0aWYgcGF0aF9jblxuXHRcdGFic29sdXRlX3BhdGhfY24gPSBwYXRoLnJlc29sdmUocGF0aF9jbilcblx0XHRjb25zb2xlLmxvZyBcImFic29sdXRlX3BhdGhfY25cIiwgYWJzb2x1dGVfcGF0aF9jblxuXHRcdGlmIGZzLmV4aXN0c1N5bmMoYWJzb2x1dGVfcGF0aF9jbilcblx0XHRcdHJlYWRGaWxlTGlzdChhYnNvbHV0ZV9wYXRoX2NuLCBmaWxlc0xpc3RfY24pXG5cdFx0XHRmaWxlc0xpc3RfY24uZm9yRWFjaCAoZmlsZSktPlxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRpZiBtaW1lLmdldFR5cGUoZmlsZS5uYW1lKSBpcyBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdFx0ZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpLCAndXRmOCcpXG5cdFx0XHRcdFx0XHR3b3JrZmxvd1RlbXBsYXRlW1wiemgtQ05cIl0ucHVzaChKU09OLnBhcnNlKGRhdGEpKVxuXHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcIuiOt+WPlnpoLWNu5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XCIsIHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSlcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblxuXHQj6I635Y+WZW4tdXPmlofku7blpLnkuIvnmoTmiYDmnInmlofku7Zcblx0ZmlsZXNMaXN0X3VzID0gW11cblx0cGF0aF91cyA9IE1ldGVvci5zZXR0aW5ncy53b3JrZmxvd1RlbXBsYXRlcz8ucGF0aF91c1xuXHRpZiBwYXRoX3VzXG5cdFx0YWJzb2x1dGVfcGF0aF91cyA9IHBhdGgucmVzb2x2ZShwYXRoX3VzKVxuXHRcdGNvbnNvbGUubG9nIFwiYWJzb2x1dGVfcGF0aF91c1wiLCBhYnNvbHV0ZV9wYXRoX3VzXG5cdFx0aWYgZnMuZXhpc3RzU3luYyhhYnNvbHV0ZV9wYXRoX3VzKVxuXHRcdFx0cmVhZEZpbGVMaXN0KGFic29sdXRlX3BhdGhfdXMsIGZpbGVzTGlzdF91cylcblx0XHRcdGZpbGVzTGlzdF91cy5mb3JFYWNoIChmaWxlKS0+XG5cdFx0XHRcdHRyeVxuXHRcdFx0XHRcdGlmIG1pbWUuZ2V0VHlwZShmaWxlLm5hbWUpIGlzIFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0XHRkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jylcblx0XHRcdFx0XHRcdHdvcmtmbG93VGVtcGxhdGVbXCJlblwiXS5wdXNoKEpTT04ucGFyc2UoZGF0YSkpXG5cdFx0XHRcdGNhdGNoIGVcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwi6I635Y+WZW4tdXPmlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXHRcdFx0XHRcblx0XHRcdFx0XHRcblxuXG4iLCIgICAgICAgICAgICAgICAgICAgICBcblxud29ya2Zsb3dUZW1wbGF0ZSA9IHt9O1xuXG53b3JrZmxvd1RlbXBsYXRlW1wiZW5cIl0gPSBbXTtcblxud29ya2Zsb3dUZW1wbGF0ZVtcInpoLUNOXCJdID0gW107XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB2YXIgYWJzb2x1dGVfcGF0aF9jbiwgYWJzb2x1dGVfcGF0aF91cywgZmlsZXNMaXN0X2NuLCBmaWxlc0xpc3RfdXMsIGZzLCBtaW1lLCBwYXRoLCBwYXRoX2NuLCBwYXRoX3VzLCByZWFkRmlsZUxpc3QsIHJlZiwgcmVmMTtcbiAgZnMgPSByZXF1aXJlKCdmcycpO1xuICBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuICBtaW1lID0gcmVxdWlyZSgnbWltZScpO1xuICByZWFkRmlsZUxpc3QgPSBmdW5jdGlvbihwYXRoRGlyLCBmaWxlc0xpc3QpIHtcbiAgICB2YXIgZmlsZXM7XG4gICAgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhwYXRoRGlyKTtcbiAgICByZXR1cm4gZmlsZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lLCBpbmRleCkge1xuICAgICAgdmFyIG9iaiwgc3RhdDtcbiAgICAgIHN0YXQgPSBmcy5zdGF0U3luYyhwYXRoLmpvaW4ocGF0aERpciwgbmFtZSkpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZXR1cm4gcmVhZEZpbGVMaXN0KHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSwgZmlsZXNMaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBvYmoucGF0aCA9IHBhdGhEaXI7XG4gICAgICAgIG9iai5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIGZpbGVzTGlzdC5wdXNoKG9iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZpbGVzTGlzdF9jbiA9IFtdO1xuICBwYXRoX2NuID0gKHJlZiA9IE1ldGVvci5zZXR0aW5ncy53b3JrZmxvd1RlbXBsYXRlcykgIT0gbnVsbCA/IHJlZi5wYXRoX2NuIDogdm9pZCAwO1xuICBpZiAocGF0aF9jbikge1xuICAgIGFic29sdXRlX3BhdGhfY24gPSBwYXRoLnJlc29sdmUocGF0aF9jbik7XG4gICAgY29uc29sZS5sb2coXCJhYnNvbHV0ZV9wYXRoX2NuXCIsIGFic29sdXRlX3BhdGhfY24pO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfY24pKSB7XG4gICAgICByZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF9jbiwgZmlsZXNMaXN0X2NuKTtcbiAgICAgIGZpbGVzTGlzdF9jbi5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgdmFyIGRhdGEsIGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG1pbWUuZ2V0VHlwZShmaWxlLm5hbWUpID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgICAgICAgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpLCAndXRmOCcpO1xuICAgICAgICAgICAgcmV0dXJuIHdvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXS5wdXNoKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIuiOt+WPlnpoLWNu5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XCIsIHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSkpO1xuICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZmlsZXNMaXN0X3VzID0gW107XG4gIHBhdGhfdXMgPSAocmVmMSA9IE1ldGVvci5zZXR0aW5ncy53b3JrZmxvd1RlbXBsYXRlcykgIT0gbnVsbCA/IHJlZjEucGF0aF91cyA6IHZvaWQgMDtcbiAgaWYgKHBhdGhfdXMpIHtcbiAgICBhYnNvbHV0ZV9wYXRoX3VzID0gcGF0aC5yZXNvbHZlKHBhdGhfdXMpO1xuICAgIGNvbnNvbGUubG9nKFwiYWJzb2x1dGVfcGF0aF91c1wiLCBhYnNvbHV0ZV9wYXRoX3VzKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhhYnNvbHV0ZV9wYXRoX3VzKSkge1xuICAgICAgcmVhZEZpbGVMaXN0KGFic29sdXRlX3BhdGhfdXMsIGZpbGVzTGlzdF91cyk7XG4gICAgICByZXR1cm4gZmlsZXNMaXN0X3VzLmZvckVhY2goZnVuY3Rpb24oZmlsZSkge1xuICAgICAgICB2YXIgZGF0YSwgZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWltZS5nZXRUeXBlKGZpbGUubmFtZSkgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jyk7XG4gICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dUZW1wbGF0ZVtcImVuXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6I635Y+WZW4tdXPmlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSk7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG4iLCIjIyNcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4jIyNcbk1ldGVvci5zdGFydHVwIC0+XG5cdGlmIE1ldGVvci5zZXR0aW5ncy5jcm9uPy5hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb25cblx0XHRzY2hlZHVsZSA9IHJlcXVpcmUoJ25vZGUtc2NoZWR1bGUnKVxuXHRcdCMg5a6a5pe25omn6KGM5ZCM5q2lXG5cdFx0cnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvblxuXHRcdGdvX25leHQgPSB0cnVlXG5cdFx0c2NoZWR1bGUuc2NoZWR1bGVKb2IgcnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCAoKS0+XG5cdFx0XHR0cnlcblx0XHRcdFx0aWYgIWdvX25leHRcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0Z29fbmV4dCA9IGZhbHNlXG5cdFx0XHRcdGNvbnNvbGUudGltZSAnYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uJ1xuXG5cdFx0XHRcdG5vdyA9IG5ldyBEYXRlXG5cblx0XHRcdFx0IyDlsIblp5TmiZjop4TliJnorr7nva7kuLrkuI3lj6/nlKhcblx0XHRcdFx0ZGIucHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzLnVwZGF0ZSh7IGVuYWJsZWQ6IHRydWUsIGVuZF90aW1lOiB7ICRsdGU6IG5vdyB9IH0sIHsgJHNldDogeyBlbmFibGVkOiBmYWxzZSB9IH0sIHsgbXVsdGkgOnRydWUgfSlcblxuXHRcdFx0XHRjb25zb2xlLnRpbWVFbmQgJ2F1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbidcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiQVVUTyBBVVRPX0ZJTklTSF9QUk9DRVNTX0RFTEVHQVRJT04gRVJST1I6IFwiXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXHRcdFx0XHRnb19uZXh0ID0gdHJ1ZVxuXG5cdFx0LCAoZSktPlxuXHRcdFx0Y29uc29sZS5sb2cgJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiBhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlJ1xuXHRcdFx0Y29uc29sZS5sb2cgZS5zdGFja1xuIiwiXG4vKlxuKiAgICAqICAgICogICAgKiAgICAqICAgICpcbuKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIHxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSUIGRheSBvZiB3ZWVrICgwIC0gNykgKDAgb3IgNyBpcyBTdW4pXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSAIG1vbnRoICgxIC0gMTIpXG7ilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgZGF5IG9mIG1vbnRoICgxIC0gMzEpXG7ilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBob3VyICgwIC0gMjMpXG7ilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIG1pbnV0ZSAoMCAtIDU5KVxu4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNlY29uZCAoMCAtIDU5LCBPUFRJT05BTClcbiAqL1xuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHZhciBnb19uZXh0LCByZWYsIHJ1bGUsIHNjaGVkdWxlO1xuICBpZiAoKHJlZiA9IE1ldGVvci5zZXR0aW5ncy5jcm9uKSAhPSBudWxsID8gcmVmLmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbiA6IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpO1xuICAgIHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi5hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb247XG4gICAgZ29fbmV4dCA9IHRydWU7XG4gICAgcmV0dXJuIHNjaGVkdWxlLnNjaGVkdWxlSm9iKHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSwgbm93O1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFnb19uZXh0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdvX25leHQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS50aW1lKCdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nKTtcbiAgICAgICAgbm93ID0gbmV3IERhdGU7XG4gICAgICAgIGRiLnByb2Nlc3NfZGVsZWdhdGlvbl9ydWxlcy51cGRhdGUoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZW5kX3RpbWU6IHtcbiAgICAgICAgICAgICRsdGU6IG5vd1xuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uJyk7XG4gICAgICAgIHJldHVybiBnb19uZXh0ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkFVVE8gQVVUT19GSU5JU0hfUFJPQ0VTU19ERUxFR0FUSU9OIEVSUk9SOiBcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIHJldHVybiBnb19uZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbi5jb2ZmZWUnKTtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICB9KSk7XG4gIH1cbn0pO1xuIiwiIyMjXG4qICAgICogICAgKiAgICAqICAgICogICAgKlxu4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAgfFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJQgZGF5IG9mIHdlZWsgKDAgLSA3KSAoMCBvciA3IGlzIFN1bilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIAgbW9udGggKDEgLSAxMilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBkYXkgb2YgbW9udGggKDEgLSAzMSlcbuKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGhvdXIgKDAgLSAyMylcbuKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgbWludXRlICgwIC0gNTkpXG7ilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2Vjb25kICgwIC0gNTksIE9QVElPTkFMKVxuIyMjXG5NZXRlb3Iuc3RhcnR1cCAtPlxuXHRpZiBNZXRlb3Iuc2V0dGluZ3MuY3Jvbj8udGltZW91dF9hdXRvX3N1Ym1pdFxuXHRcdHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpXG5cdFx0IyDlrprml7bmiafooYzlkIzmraVcblx0XHRydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24udGltZW91dF9hdXRvX3N1Ym1pdFxuXHRcdGdvX25leHQgPSB0cnVlXG5cdFx0c2NoZWR1bGUuc2NoZWR1bGVKb2IgcnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCAoKS0+XG5cdFx0XHR0cnlcblx0XHRcdFx0aWYgIWdvX25leHRcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0Z29fbmV4dCA9IGZhbHNlXG5cdFx0XHRcdGNvbnNvbGUudGltZSAndGltZW91dF9hdXRvX3N1Ym1pdCdcblxuXHRcdFx0XHR1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KClcblxuXHRcdFx0XHRjb25zb2xlLnRpbWVFbmQgJ3RpbWVvdXRfYXV0b19zdWJtaXQnXG5cdFx0XHRcdGdvX25leHQgPSB0cnVlXG5cblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcIkFVVE8gVElNRU9VVF9BVVRPX1NVQk1JVCBFUlJPUjogXCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0XHRcdGdvX25leHQgPSB0cnVlXG5cblx0XHQsIChlKS0+XG5cdFx0XHRjb25zb2xlLmxvZyAnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IHRpbWVvdXRfYXV0b19zdWJtaXQuY29mZmVlJ1xuXHRcdFx0Y29uc29sZS5sb2cgZS5zdGFja1xuXG5NZXRlb3IubWV0aG9kc1xuXHR0aW1lb3V0X2F1dG9fc3VibWl0OiAoaW5zX2lkKS0+XG5cdFx0dXVmbG93TWFuYWdlci50aW1lb3V0QXV0b1N1Ym1pdChpbnNfaWQpXG5cdFx0cmV0dXJuIHRydWVcblxuXG4iLCJcbi8qXG4qICAgICogICAgKiAgICAqICAgICogICAgKlxu4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAgfFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJQgZGF5IG9mIHdlZWsgKDAgLSA3KSAoMCBvciA3IGlzIFN1bilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIAgbW9udGggKDEgLSAxMilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBkYXkgb2YgbW9udGggKDEgLSAzMSlcbuKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGhvdXIgKDAgLSAyMylcbuKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgbWludXRlICgwIC0gNTkpXG7ilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2Vjb25kICgwIC0gNTksIE9QVElPTkFMKVxuICovXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIGdvX25leHQsIHJlZiwgcnVsZSwgc2NoZWR1bGU7XG4gIGlmICgocmVmID0gTWV0ZW9yLnNldHRpbmdzLmNyb24pICE9IG51bGwgPyByZWYudGltZW91dF9hdXRvX3N1Ym1pdCA6IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpO1xuICAgIHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi50aW1lb3V0X2F1dG9fc3VibWl0O1xuICAgIGdvX25leHQgPSB0cnVlO1xuICAgIHJldHVybiBzY2hlZHVsZS5zY2hlZHVsZUpvYihydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGU7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWdvX25leHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ29fbmV4dCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ3RpbWVvdXRfYXV0b19zdWJtaXQnKTtcbiAgICAgICAgdXVmbG93TWFuYWdlci50aW1lb3V0QXV0b1N1Ym1pdCgpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3RpbWVvdXRfYXV0b19zdWJtaXQnKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQVVUTyBUSU1FT1VUX0FVVE9fU1VCTUlUIEVSUk9SOiBcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIHJldHVybiBnb19uZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IHRpbWVvdXRfYXV0b19zdWJtaXQuY29mZmVlJyk7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coZS5zdGFjayk7XG4gICAgfSkpO1xuICB9XG59KTtcblxuTWV0ZW9yLm1ldGhvZHMoe1xuICB0aW1lb3V0X2F1dG9fc3VibWl0OiBmdW5jdGlvbihpbnNfaWQpIHtcbiAgICB1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KGluc19pZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRUYWJ1bGFyVGFibGVzLnJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIgPSBuZXcgVGFidWxhci5UYWJsZVxuXHRcdG5hbWU6IFwicmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhclwiXG5cdFx0Y29sbGVjdGlvbjogZGIuaW5zdGFuY2VzXG5cdFx0Y29sdW1uczogW1xuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIl9pZFwiLFxuXHRcdFx0XHR0aXRsZTogJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwicmV2ZXJzZVwiIGlkPVwicmV2ZXJzZVwiPicsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHdpZHRoOiAnMXB4Jyxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aW5wdXQgPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicmVsYXRlZC1pbnN0YW5jZXMtbGlzdC1jaGVja2JveFwiIG5hbWU9XCJyZWxhdGVkX2luc3RhbmNlc19pZHNcIiBpZD1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIHZhbHVlPVwiJyArIGRvYy5faWQgKyAnXCInXG5cblx0XHRcdFx0XHRpZiBUYWJ1bGFyVGFibGVzLnJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIucmVsYXRlZF9pbnN0YW5jZXM/LmluY2x1ZGVzKGRvYy5faWQpXG5cdFx0XHRcdFx0XHRpbnB1dCArPSBcIiBjaGVja2VkIFwiXG5cblx0XHRcdFx0XHRpbnB1dCArPSBcIj5cIlxuXHRcdFx0XHRcdHJldHVybiBpbnB1dFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJuYW1lXCIsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHdpZHRoOiAnNDUlJyxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aHJlZiA9ICcnO1xuXHRcdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpXG5cdFx0XHRcdFx0XHRocmVmID0gJydcblxuXHRcdFx0XHRcdGFic29sdXRlID0gZmFsc2VcblxuXHRcdFx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdFx0YWJzb2x1dGUgPSB0aGlzLmFic29sdXRlXG5cdFx0XHRcdFx0aWYgYWJzb2x1dGVcblx0XHRcdFx0XHRcdGhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitkb2Muc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGRvYy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGhyZWYgPSBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIrZG9jLnNwYWNlK1wiL3ZpZXcvcmVhZG9ubHkvXCIgKyBkb2MuX2lkICsgJz9oaWRlX3RyYWNlcz0wJylcblx0XHRcdFx0XHRyZXR1cm4gXCI8YSBkYXRhLWlkPScje2RvYy5faWR9JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0nXCIraHJlZitcIic+XCIgKyBkb2MubmFtZSArIFwiPC9hPlwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZsb3dfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImN1cnJlbnRfc3RlcF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiXG5cdFx0XHRcdFx0XHRqdWRnZSA9IGRvYy5maW5hbF9kZWNpc2lvbiB8fCBcImFwcHJvdmVkXCJcblxuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLmN1cnJlbnRfc3RlcF9uYW1lIHx8ICcnXG5cblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwLWN1cnJlbnQtc3RhdGUgI3tqdWRnZX1cIj4je3N0ZXBfY3VycmVudF9uYW1lfTwvZGl2PlxuXHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHR9XG5cdFx0XVxuXG5cdFx0ZG9tOiBcInRwXCIsXG5cdFx0bGVuZ3RoQ2hhbmdlOiBmYWxzZSxcblx0XHRleHRyYUZpZWxkczogW1wic3RhdGVcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcInNwYWNlXCIsIFwia2V5d29yZHNcIl0sXG5cdFx0cGFnZUxlbmd0aDogMTAsXG5cdFx0aW5mbzogZmFsc2UsXG5cdFx0c2VhcmNoaW5nOiB0cnVlLFxuXHRcdHJlc3BvbnNpdmU6XG5cdFx0XHRkZXRhaWxzOiBmYWxzZVxuXHRcdGF1dG9XaWR0aDogZmFsc2UsXG5cdFx0Y2hhbmdlU2VsZWN0b3I6IChzZWxlY3RvciwgdXNlcklkKSAtPlxuXHRcdFx0dW5sZXNzIHVzZXJJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cblx0XHRcdHNwYWNlSWQgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdFx0aWYgc2VsZWN0b3I/LiRhbmQ/Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRzcGFjZUlkID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXVxuXHRcdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKVxuXHRcdFx0aWYgIXNwYWNlXG5cdFx0XHRcdHNlbGVjdG9yLnN0YXRlID0gXCJub25lXCJcblx0XHRcdGlmICFzcGFjZS5hZG1pbnMuaW5jbHVkZXModXNlcklkKVxuXG5cdFx0XHRcdGZsb3dfaWRzID0gW11cblx0XHRcdFx0Y3VyU3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG5cdFx0XHRcdFx0c3BhY2U6IHNwYWNlSWQsXG5cdFx0XHRcdFx0J3VzZXInOiB1c2VySWRcblx0XHRcdFx0fSlcblx0XHRcdFx0aWYgY3VyU3BhY2VVc2VyXG5cdFx0XHRcdFx0b3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG5cdFx0XHRcdFx0XHRfaWQ6IHtcblx0XHRcdFx0XHRcdFx0JGluOiBjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLmZldGNoKClcblx0XHRcdFx0XHRmbG93cyA9IGRiLmZsb3dzLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9KVxuXHRcdFx0XHRcdGZsb3dzLmZvckVhY2ggKGZsKS0+XG5cdFx0XHRcdFx0XHRpZiBXb3JrZmxvd01hbmFnZXIuY2FuTW9uaXRvcihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKSB8fCBXb3JrZmxvd01hbmFnZXIuY2FuQWRtaW4oZmwsIGN1clNwYWNlVXNlciwgb3JnYW5pemF0aW9ucylcblx0XHRcdFx0XHRcdFx0Zmxvd19pZHMucHVzaChmbC5faWQpXG5cblx0XHRcdFx0aWYgc2VsZWN0b3I/LiRhbmQ/Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRzZWxlY3Rvci4kYW5kWzBdLiRvciA9IFt7c3VibWl0dGVyOiB1c2VySWR9LCB7YXBwbGljYW50OiB1c2VySWR9LCB7aW5ib3hfdXNlcnM6IHVzZXJJZH0sIHtvdXRib3hfdXNlcnM6IHVzZXJJZH0sXG5cdFx0XHRcdFx0XHRcdHtjY191c2VyczogdXNlcklkfSwgeyBmbG93OiB7ICRpbjogZmxvd19pZHMgfSB9XVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Xy5leHRlbmQgc2VsZWN0b3IsIHtcblx0XHRcdFx0XHRcdCRvcjogW3tzdWJtaXR0ZXI6IHVzZXJJZH0sIHthcHBsaWNhbnQ6IHVzZXJJZH0sIHtpbmJveF91c2VyczogdXNlcklkfSwge291dGJveF91c2VyczogdXNlcklkfSxcblx0XHRcdFx0XHRcdFx0e2NjX3VzZXJzOiB1c2VySWR9LCB7IGZsb3c6IHsgJGluOiBmbG93X2lkcyB9IH1dXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2VsZWN0b3IiLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhciA9IG5ldyBUYWJ1bGFyLlRhYmxlKHtcbiAgICBuYW1lOiBcInJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXJcIixcbiAgICBjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZXMsXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBkYXRhOiBcIl9pZFwiLFxuICAgICAgICB0aXRsZTogJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwicmV2ZXJzZVwiIGlkPVwicmV2ZXJzZVwiPicsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdpZHRoOiAnMXB4JyxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBpbnB1dCwgcmVmO1xuICAgICAgICAgIGlucHV0ID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInJlbGF0ZWQtaW5zdGFuY2VzLWxpc3QtY2hlY2tib3hcIiBuYW1lPVwicmVsYXRlZF9pbnN0YW5jZXNfaWRzXCIgaWQ9XCJyZWxhdGVkX2luc3RhbmNlc19pZHNcIiB2YWx1ZT1cIicgKyBkb2MuX2lkICsgJ1wiJztcbiAgICAgICAgICBpZiAoKHJlZiA9IFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5yZWxhdGVkX2luc3RhbmNlcykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhkb2MuX2lkKSA6IHZvaWQgMCkge1xuICAgICAgICAgICAgaW5wdXQgKz0gXCIgY2hlY2tlZCBcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQgKz0gXCI+XCI7XG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibmFtZVwiLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICB3aWR0aDogJzQ1JScsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWJzb2x1dGUsIGhyZWY7XG4gICAgICAgICAgaHJlZiA9ICcnO1xuICAgICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKSkge1xuICAgICAgICAgICAgaHJlZiA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICAgIGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFic29sdXRlKSB7XG4gICAgICAgICAgICBocmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBkb2Muc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBocmVmID0gU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgZG9jLnNwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGRvYy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcIjxhIGRhdGEtaWQ9J1wiICsgZG9jLl9pZCArIFwiJyB0YXJnZXQ9J19ibGFuaycgaHJlZj0nXCIpICsgaHJlZiArIFwiJz5cIiArIGRvYy5uYW1lICsgXCI8L2E+XCI7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImZsb3dfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBqdWRnZSwgc3RlcF9jdXJyZW50X25hbWU7XG4gICAgICAgICAgaWYgKGRvYy5zdGF0ZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAganVkZ2UgPSBkb2MuZmluYWxfZGVjaXNpb24gfHwgXCJhcHByb3ZlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5jdXJyZW50X3N0ZXBfbmFtZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJzdGVwLWN1cnJlbnQtc3RhdGUgXCIgKyBqdWRnZSArIFwiXFxcIj5cIiArIHN0ZXBfY3VycmVudF9uYW1lICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF0sXG4gICAgZG9tOiBcInRwXCIsXG4gICAgbGVuZ3RoQ2hhbmdlOiBmYWxzZSxcbiAgICBleHRyYUZpZWxkczogW1wic3RhdGVcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcInNwYWNlXCIsIFwia2V5d29yZHNcIl0sXG4gICAgcGFnZUxlbmd0aDogMTAsXG4gICAgaW5mbzogZmFsc2UsXG4gICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgIGRldGFpbHM6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgIGNoYW5nZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgdXNlcklkKSB7XG4gICAgICB2YXIgY3VyU3BhY2VVc2VyLCBmbG93X2lkcywgZmxvd3MsIG9yZ2FuaXphdGlvbnMsIHJlZiwgcmVmMSwgc3BhY2UsIHNwYWNlSWQ7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlSWQgPSBzZWxlY3Rvci5zcGFjZTtcbiAgICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgICBpZiAoKHNlbGVjdG9yICE9IG51bGwgPyAocmVmID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZi5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgIHNwYWNlSWQgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlSWQpO1xuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICBzZWxlY3Rvci5zdGF0ZSA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgICAgaWYgKCFzcGFjZS5hZG1pbnMuaW5jbHVkZXModXNlcklkKSkge1xuICAgICAgICBmbG93X2lkcyA9IFtdO1xuICAgICAgICBjdXJTcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgICAndXNlcic6IHVzZXJJZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGN1clNwYWNlVXNlcikge1xuICAgICAgICAgIG9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICAgICAgX2lkOiB7XG4gICAgICAgICAgICAgICRpbjogY3VyU3BhY2VVc2VyLm9yZ2FuaXphdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5mZXRjaCgpO1xuICAgICAgICAgIGZsb3dzID0gZGIuZmxvd3MuZmluZCh7XG4gICAgICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZsb3dzLmZvckVhY2goZnVuY3Rpb24oZmwpIHtcbiAgICAgICAgICAgIGlmIChXb3JrZmxvd01hbmFnZXIuY2FuTW9uaXRvcihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKSB8fCBXb3JrZmxvd01hbmFnZXIuY2FuQWRtaW4oZmwsIGN1clNwYWNlVXNlciwgb3JnYW5pemF0aW9ucykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb3dfaWRzLnB1c2goZmwuX2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNlbGVjdG9yICE9IG51bGwgPyAocmVmMSA9IHNlbGVjdG9yLiRhbmQpICE9IG51bGwgPyByZWYxLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc2VsZWN0b3IuJGFuZFswXS4kb3IgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym1pdHRlcjogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGFwcGxpY2FudDogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGluYm94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgb3V0Ym94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgY2NfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBmbG93OiB7XG4gICAgICAgICAgICAgICAgJGluOiBmbG93X2lkc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfLmV4dGVuZChzZWxlY3Rvciwge1xuICAgICAgICAgICAgJG9yOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWJtaXR0ZXI6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgYXBwbGljYW50OiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGluYm94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG91dGJveF91c2VyczogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBjY191c2VyczogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBmbG93OiB7XG4gICAgICAgICAgICAgICAgICAkaW46IGZsb3dfaWRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJTdGVlZG9zLnN1YnNbXCJJbnN0YW5jZVRhYnVsYXJcIl0gPSBuZXcgU3Vic01hbmFnZXIoKVxuXG5cbl9oYW5kbGVMaXN0RmllbGRzID0gKGZpZWxkcykgLT5cblx0aW5zX2ZpZWxkcyA9IG5ldyBBcnJheSgpO1xuXG5cdGZpZWxkcz8uZm9yRWFjaCAoZiktPlxuXHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdGluc19maWVsZHMucHVzaCBmMVxuXHRcdGVsc2Vcblx0XHRcdGluc19maWVsZHMucHVzaCBmXG5cblx0cmV0dXJuIGluc19maWVsZHNcblxuXG51cGRhdGVUYWJ1bGFyVGl0bGUgPSAoKS0+XG5cbiMg5aaC5p6cY29sdW1uc+acieWKoOWHj++8jOivt+S/ruaUuVRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucyDlh73mlbBcbmluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIgPSAoZmxvd0lkLCBmaWVsZHMpLT5cblx0b3B0aW9ucyA9IHtcblx0XHRuYW1lOiBcImluc3RhbmNlc1wiLFxuXHRcdGNvbGxlY3Rpb246IGRiLmluc3RhbmNlcyxcblx0XHRwdWI6IFwiaW5zdGFuY2VfdGFidWxhclwiLFxuXHRcdG9uVW5sb2FkOiAoKS0+XG5cdFx0XHRNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MClcblxuXHRcdGRyYXdDYWxsYmFjazogKHNldHRpbmdzKS0+XG5cdFx0XHRlbXB0eVRkID0gJChcIi5kYXRhVGFibGVzX2VtcHR5XCIpXG5cdFx0XHRpZiBlbXB0eVRkLmxlbmd0aFxuXHRcdFx0XHRlbXB0eVRkWzBdLmNvbFNwYW4gPSBcIjZcIlxuXHRcdFx0aWYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpXG5cdFx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApLnJlYWR5IC0+XG5cdFx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIilcblx0XHRcdGVsc2Vcblx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKVxuXG5cdFx0XHR0aXRsZSA9IHQgXCJwYWdlcl9pbnB1dF9oaW50XCJcblx0XHRcdGVsbGlwc2lzTGluayA9IHNldHRpbmdzLm9JbnN0YW5jZS5wYXJlbnQoKS5maW5kKCcucGFnaW5nX251bWJlcnMgLnBhZ2luYXRpb24gLmRpc2FibGVkIGEnKVxuXHRcdFx0ZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayAtPlxuXHRcdFx0XHRpZiAhJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aFxuXHRcdFx0XHRcdGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jylcblx0XHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0XHRcdGlucHV0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOlwiNTJweFwiXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCIyMHB4XCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjE2cHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRpbnB1dC5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCB0aXRsZSlcblx0XHRcdFx0XHQkKHRoaXMpLmVtcHR5KCkuYXBwZW5kIGlucHV0XG5cdFx0XHRcdFx0Z29QYWdlID0gKGluZGV4KS0+XG5cdFx0XHRcdFx0XHRpZiBpbmRleCA+IDBcblx0XHRcdFx0XHRcdFx0cGFnZXMgPSBNYXRoLmNlaWwoc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpIC8gc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRpZiBpbmRleCA+IHBhZ2VzXG5cdFx0XHRcdFx0XHRcdFx0IyDpobXnoIHotoXlh7rntKLlvJXml7bot7PovazliLDmnIDlkI7kuIDpobVcblx0XHRcdFx0XHRcdFx0XHRpbmRleCA9IHBhZ2VzXG5cdFx0XHRcdFx0XHRcdGluZGV4LS1cblx0XHRcdFx0XHRcdFx0c2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKVxuXHRcdFx0XHRcdGlucHV0LmJsdXIgKGUpLT5cblx0XHRcdFx0XHRcdGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKVxuXHRcdFx0XHRcdFx0Z29QYWdlIGN1cnJlbnRQYWdlXG5cdFx0XHRcdFx0XHQkKHRoaXMpLnBhcmVudCgpLmh0bWwgJy4uLidcblx0XHRcdFx0XHRpbnB1dC5rZXlkb3duIChlKS0+XG5cdFx0XHRcdFx0XHRpZihlLmtleUNvZGUudG9TdHJpbmcoKSA9PSBcIjEzXCIpXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKVxuXHRcdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2VcblxuXHRcdGNyZWF0ZWRSb3c6IChyb3csIGRhdGEsIGRhdGFJbmRleCkgLT5cblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRpZiBkYXRhLl9pZCA9PSBGbG93Um91dGVyLmN1cnJlbnQoKS5wYXJhbXMuaW5zdGFuY2VJZFxuXHRcdFx0XHRcdHJvdy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInNlbGVjdGVkXCIpXG5cdFx0Y29sdW1uczogW1xuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIl9pZFwiLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdG1vZGlmaWVkU3RyaW5nID0gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cblx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5tb2RpZmllZFxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLnN0YXRlICE9ICdkcmFmdCdcblx0XHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLnN0YXJ0X2RhdGUgfHwgZG9jLm1vZGlmaWVkXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnb3V0Ym94JyB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcidcblx0XHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLnN1Ym1pdF9kYXRlIHx8IGRvYy5zdWJtaXRfZGF0ZVxuXG5cdFx0XHRcdFx0bW9kaWZpZWRGcm9tTm93ID0gU3RlZWRvcy5tb21lbnRSZWFjdGl2ZUZyb21Ob3cobW9kaWZpZWQpO1xuXHRcdFx0XHRcdGZsb3dfbmFtZSA9IGRvYy5mbG93X25hbWVcblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLmlzX2NjICYmICFkb2MuaW5ib3hfdXNlcnM/LmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0Y2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCJcblx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLmN1cnJlbnRfc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSAhPSAnZHJhZnQnICYmIGRvYy5jdXJyZW50X3N0ZXBfbmFtZVxuXHRcdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTxzcGFuPigje2RvYy5jdXJyZW50X3N0ZXBfbmFtZX0pPC9zcGFuPjwvZGl2PlwiXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PC9kaXY+XCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWUgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lfSkgKyBcIik8L2xhYmVsPlwiXG5cblx0XHRcdFx0XHR1bnJlYWQgPSAnJ1xuXG5cdFx0XHRcdFx0IyBpc0Zhdm9yaXRlU2VsZWN0ZWQgPSBGYXZvcml0ZXMuaXNSZWNvcmRTZWxlY3RlZChcImluc3RhbmNlc1wiLCBkb2MuX2lkKVxuXHRcdFx0XHRcdCMgaWYgRmF2b3JpdGVzLmlzUmVjb3JkU2VsZWN0ZWQoXCJpbnN0YW5jZXNcIiwgZG9jLl9pZClcblx0XHRcdFx0XHQjIFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1pb3Mtc3Rhci1vdXRsaW5lIGluc3RhbmNlLWZhdm9yaXRlLXNlbGVjdGVkXCI+PC9pPidcblx0XHRcdFx0XHQjIGVsc2UgXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPidcblx0XHRcdFx0XHRlbHNlIGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09IHRydWVcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+J1xuXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj4je2RvYy5hcHBsaWNhbnRfbmFtZX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtZGV0YWlsJz4je3N0ZXBfY3VycmVudF9uYW1lX3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPScje21vZGlmaWVkU3RyaW5nfSc+I3ttb2RpZmllZEZyb21Ob3d9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm5hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0Y2NfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0IyDlvZPliY3nlKjmiLflnKhjYyB1c2Vy5Lit77yM5L2G5piv5LiN5ZyoaW5ib3ggdXNlcnPml7bmiY3mmL7npLon5Lyg6ZiFJ+aWh+Wtl1xuXHRcdFx0XHRcdGlmIGRvYy5pc19jYyAmJiAhZG9jLmluYm94X3VzZXJzPy5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiXG5cblx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRpZiBkb2MuYWdlbnRfdXNlcl9uYW1lXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eVZhbHVlID0gZG9jLnZhbHVlcz8ucHJpb3JpdHlcblx0XHRcdFx0XHRzd2l0Y2ggcHJpb3JpdHlWYWx1ZVxuXHRcdFx0XHRcdFx0d2hlbiBcIueJueaApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIue0p+aApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLlip7mlodcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIlxuXHRcdFx0XHRcdGlmIHByaW9yaXR5SWNvbkNsYXNzXG5cdFx0XHRcdFx0XHRpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS0je3ByaW9yaXR5SWNvbkNsYXNzfVwiXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgI3tpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzfSc+I3tkb2MubmFtZX0je2NjX3ZpZXd9I3thZ2VudF92aWV3fTwvZGl2PlxuXHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN1Ym1pdF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJmbG93X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiXG5cdFx0XHRcdFx0XHRqdWRnZSA9IGRvYy5maW5hbF9kZWNpc2lvbiB8fCBcImFwcHJvdmVkXCJcblxuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLmN1cnJlbnRfc3RlcF9uYW1lIHx8ICcnXG5cblx0XHRcdFx0XHRjY190YWcgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgZG9jLmNjX2NvdW50ID4gMFxuXHRcdFx0XHRcdFx0Y2NfdGFnID0gVEFQaTE4bi5fXygnY2NfdGFnJylcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwLWN1cnJlbnQtc3RhdGUgI3tqdWRnZX1cIj4je3N0ZXBfY3VycmVudF9uYW1lfSN7Y2NfdGFnfTwvZGl2PlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJtb2RpZmllZFwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19tb2RpZmllZFwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3RhcnRfZGF0ZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdGFydF9kYXRlXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3RhcnRfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2Muc3RhcnRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJteV9maW5pc2hfZGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2MubXlfZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLm15X2ZpbmlzaF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImtleXdvcmRzXCIsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImlzX2FyY2hpdmVkXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYz8udmFsdWVzPy5yZWNvcmRfbmVlZCAmJiBkb2MudmFsdWVzLnJlY29yZF9uZWVkID09IFwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRpZiBkb2M/LmlzX2FyY2hpdmVkXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0KFwiWUVTXCIpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdChcIk5PXCIpXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH1cblx0XHRdLFxuXHRcdGRvbTogZG8gLT5cblx0XHRcdCMg5omL5py65LiK5LiN5pi+56S65LiA6aG15pi+56S65aSa5bCR5p2h6K6w5b2V6YCJ6aG5XG5cdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0J3RwJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQndHBsJ1xuXHRcdG9yZGVyOiBbWzQsIFwiZGVzY1wiXV0sXG5cdFx0ZXh0cmFGaWVsZHM6IFtcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJzdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsXG5cdFx0XHRcImZsb3dfdmVyc2lvblwiLCBcImlzX2NjXCIsIFwiY2NfY291bnRcIiwgXCJpc19yZWFkXCIsIFwiY3VycmVudF9zdGVwX25hbWVcIiwgXCJ2YWx1ZXNcIiwgXCJrZXl3b3Jkc1wiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwiZmxvd19uYW1lXCIsIFwiaXNfaGlkZGVuXCIsIFwiYWdlbnRfdXNlcl9uYW1lXCJdLFxuXHRcdGxlbmd0aENoYW5nZTogdHJ1ZSxcblx0XHRsZW5ndGhNZW51OiBbMTAsMTUsMjAsMjUsNTAsMTAwXSxcblx0XHRwYWdlTGVuZ3RoOiAxMCxcblx0XHRpbmZvOiBmYWxzZSxcblx0XHRzZWFyY2hpbmc6IHRydWUsXG5cdFx0cmVzcG9uc2l2ZTpcblx0XHRcdGRldGFpbHM6IGZhbHNlXG5cdFx0YXV0b1dpZHRoOiBmYWxzZSxcblx0XHRjaGFuZ2VTZWxlY3RvcjogKHNlbGVjdG9yLCB1c2VySWQpIC0+XG5cdFx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHNwYWNlID0gc2VsZWN0b3Iuc3BhY2Vcblx0XHRcdHVubGVzcyBzcGFjZVxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNwYWNlID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHt1c2VyOiB1c2VySWQsIHNwYWNlOiBzcGFjZX0sIHtmaWVsZHM6IHtfaWQ6IDF9fSlcblx0XHRcdHVubGVzcyBzcGFjZV91c2VyXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHJldHVybiBzZWxlY3RvclxuXHRcdHBhZ2luZ1R5cGU6IFwibnVtYmVyc1wiXG5cdFx0XG5cdFx0IyBnZXRTb3J0OiAoc2VsZWN0b3IsIHNvcnQpIC0+IFxuXHRcdCMgXHRjb25zb2xlLmxvZygnc2VsZWN0b3I6JyxzZWxlY3Rvcilcblx0XHQjIFx0Y29uc29sZS5sb2coJ3NvcnQ6Jyxzb3J0KVxuXHRcdCMgXHRuZXdTb3J0ID0gW11cblx0XHQjIFx0Xy5lYWNoIHNlbGVjdG9yLCAodiwgaykgLT5cblx0XHQjIFx0XHRuZXdTb3J0LnB1c2goW2ssIDFdKVxuXHRcdCMgXHRuZXdTb3J0ID0gbmV3U29ydC5jb25jYXQoc29ydClcblx0XHQjIFx0Y29uc29sZS5sb2coJ25ld1NvcnQ6JyxuZXdTb3J0KVxuXHRcdCMgXHRyZXR1cm4gbmV3U29ydFxuXHR9XG5cblx0aWYgZmxvd0lkXG5cdFx0a2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZFxuXG5cdFx0b3B0aW9ucy5uYW1lID0ga2V5XG5cblx0XHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlcy5maWVsZHMgPSBmaWVsZHNcblxuXHRcdGluc19maWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyBUYWJ1bGFyVGFibGVzLmluc3RhbmNlcy5maWVsZHNcblxuXHRcdGluc19maWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdFx0aWYgZi50eXBlICE9ICd0YWJsZScgJiYgZi5pc19saXN0X2Rpc3BsYXlcblx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLnB1c2hcblx0XHRcdFx0XHRkYXRhOiAoZi5uYW1lIHx8IGYuY29kZSksXG5cdFx0XHRcdFx0dGl0bGU6IHQoZi5uYW1lIHx8IGYuY29kZSksXG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXG5cdFx0XHRcdFx0XHR2YWx1ZXMgPSBkb2MudmFsdWVzIHx8IHt9XG5cblx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVzW2YuY29kZV1cblxuXHRcdFx0XHRcdFx0c3dpdGNoIGYudHlwZVxuXHRcdFx0XHRcdFx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWU/Lm5hbWVcblx0XHRcdFx0XHRcdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHRcdFx0XHRcdFx0d2hlbiAnZGF0ZSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2RhdGVUaW1lJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJylcblx0XHRcdFx0XHRcdFx0d2hlbiAnY2hlY2tib3gnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWUgPT0gdHJ1ZSB8fCB2YWx1ZSA9PSAndHJ1ZSdcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIik7XG5cdFx0XHRcdFx0XHRcdHdoZW4gJ29kYXRhJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBfLmlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gXy5wbHVjayh2YWx1ZSwgJ0BsYWJlbCcpLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ11cblxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cblxuXHRyZXR1cm4gb3B0aW9ucztcblxuXG4jIOWmguaenGNvbHVtbnPmnInliqDlh4/vvIzor7fkv67mlLlUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMg5Ye95pWwXG5pbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhciA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0ge1xuXHRcdG5hbWU6IFwiaW5zdGFuY2VfdGFza3NcIixcblx0XHRjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZV90YXNrcyxcblx0XHRwdWI6IFwiaW5zdGFuY2VfdGFza3NfdGFidWxhclwiLFxuXHRcdG9uVW5sb2FkOiAoKS0+XG5cdFx0XHRNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MClcblxuXHRcdGRyYXdDYWxsYmFjazogKHNldHRpbmdzKS0+XG5cdFx0XHRlbXB0eVRkID0gJChcIi5kYXRhVGFibGVzX2VtcHR5XCIpXG5cdFx0XHRpZiBlbXB0eVRkLmxlbmd0aFxuXHRcdFx0XHRlbXB0eVRkWzBdLmNvbFNwYW4gPSBcIjZcIlxuXHRcdFx0aWYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpXG5cdFx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApLnJlYWR5IC0+XG5cdFx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIilcblx0XHRcdGVsc2Vcblx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKVxuXG5cdFx0XHR0aXRsZSA9IHQgXCJwYWdlcl9pbnB1dF9oaW50XCJcblx0XHRcdGVsbGlwc2lzTGluayA9IHNldHRpbmdzLm9JbnN0YW5jZS5wYXJlbnQoKS5maW5kKCcucGFnaW5nX251bWJlcnMgLnBhZ2luYXRpb24gLmRpc2FibGVkIGEnKVxuXHRcdFx0ZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayAtPlxuXHRcdFx0XHRpZiAhJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aFxuXHRcdFx0XHRcdGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jylcblx0XHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0XHRcdGlucHV0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOlwiNTJweFwiXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCIyMHB4XCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjE2cHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRpbnB1dC5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCB0aXRsZSlcblx0XHRcdFx0XHQkKHRoaXMpLmVtcHR5KCkuYXBwZW5kIGlucHV0XG5cdFx0XHRcdFx0Z29QYWdlID0gKGluZGV4KS0+XG5cdFx0XHRcdFx0XHRpZiBpbmRleCA+IDBcblx0XHRcdFx0XHRcdFx0cGFnZXMgPSBNYXRoLmNlaWwoc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpIC8gc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRpZiBpbmRleCA+IHBhZ2VzXG5cdFx0XHRcdFx0XHRcdFx0IyDpobXnoIHotoXlh7rntKLlvJXml7bot7PovazliLDmnIDlkI7kuIDpobVcblx0XHRcdFx0XHRcdFx0XHRpbmRleCA9IHBhZ2VzXG5cdFx0XHRcdFx0XHRcdGluZGV4LS1cblx0XHRcdFx0XHRcdFx0c2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKVxuXHRcdFx0XHRcdGlucHV0LmJsdXIgKGUpLT5cblx0XHRcdFx0XHRcdGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKVxuXHRcdFx0XHRcdFx0Z29QYWdlIGN1cnJlbnRQYWdlXG5cdFx0XHRcdFx0XHQkKHRoaXMpLnBhcmVudCgpLmh0bWwgJy4uLidcblx0XHRcdFx0XHRpbnB1dC5rZXlkb3duIChlKS0+XG5cdFx0XHRcdFx0XHRpZihlLmtleUNvZGUudG9TdHJpbmcoKSA9PSBcIjEzXCIpXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKVxuXHRcdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2VcblxuXHRcdGNyZWF0ZWRSb3c6IChyb3csIGRhdGEsIGRhdGFJbmRleCkgLT5cblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRpZiBkYXRhLmluc3RhbmNlID09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkXG5cdFx0XHRcdFx0cm93LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic2VsZWN0ZWRcIilcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiX2lkXCIsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0bW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuXHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLm1vZGlmaWVkXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaW5zdGFuY2Vfc3RhdGUgIT0gJ2RyYWZ0J1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWRcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdvdXRib3gnXG5cdFx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5zdWJtaXRfZGF0ZSB8fCBkb2MubW9kaWZpZWRcblxuXHRcdFx0XHRcdG1vZGlmaWVkRnJvbU5vdyA9IFN0ZWVkb3MubW9tZW50UmVhY3RpdmVGcm9tTm93KG1vZGlmaWVkKTtcblx0XHRcdFx0XHRmbG93X25hbWUgPSBkb2MuZmxvd19uYW1lXG5cdFx0XHRcdFx0Y2NfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0IyDlvZPliY3nlKjmiLflnKhjYyB1c2Vy5Lit77yM5L2G5piv5LiN5ZyoaW5ib3ggdXNlcnPml7bmiY3mmL7npLon5Lyg6ZiFJ+aWh+Wtl1xuXHRcdFx0XHRcdGlmIGRvYy50eXBlID09ICdjYycgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0Y2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCJcblx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLnN0ZXBfbmFtZX0pPC9zcGFuPjwvZGl2PlwiXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aWYgZG9jLnN0ZXBfbmFtZVxuXHRcdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTxzcGFuPigje2RvYy5zdGVwX25hbWV9KTwvc3Bhbj48L2Rpdj5cIlxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTwvZGl2PlwiXG5cblx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRpZiBkb2MuYWdlbnRfdXNlcl9uYW1lICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZX0pICsgXCIpPC9sYWJlbD5cIlxuXG5cdFx0XHRcdFx0dW5yZWFkID0gJydcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nXG5cdFx0XHRcdFx0ZWxzZSBpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PSB0cnVlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPidcblxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbiA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eVZhbHVlID0gZG9jLnZhbHVlcz8ucHJpb3JpdHlcblx0XHRcdFx0XHRzd2l0Y2ggcHJpb3JpdHlWYWx1ZVxuXHRcdFx0XHRcdFx0d2hlbiBcIueJueaApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIue0p+aApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLlip7mlodcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIlxuXHRcdFx0XHRcdGlmIHByaW9yaXR5SWNvbkNsYXNzXG5cdFx0XHRcdFx0XHRpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS0je3ByaW9yaXR5SWNvbkNsYXNzfVwiXG5cblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPiN7dW5yZWFkfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgI3tpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzfSc+I3tkb2MuaW5zdGFuY2VfbmFtZX0je2NjX3ZpZXd9I3thZ2VudF92aWV3fVxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+I3tkb2MuYXBwbGljYW50X25hbWV9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLWRldGFpbCc+I3tzdGVwX2N1cnJlbnRfbmFtZV92aWV3fVxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9J2luc3RhbmNlLW1vZGlmaWVkJyB0aXRsZT0nI3ttb2RpZmllZFN0cmluZ30nPiN7bW9kaWZpZWRGcm9tTm93fTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJpbnN0YW5jZV9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX25hbWVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGNjX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdCMg5b2T5YmN55So5oi35ZyoY2MgdXNlcuS4re+8jOS9huaYr+S4jeWcqGluYm94IHVzZXJz5pe25omN5pi+56S6J+S8oOmYhSfmloflrZdcblx0XHRcdFx0XHRpZiBkb2MuaXNfY2MgJiYgIWRvYy5pbmJveF91c2Vycz8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXG5cdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgZG9jLmFnZW50X3VzZXJfbmFtZVxuXHRcdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lfSkgKyBcIik8L2xhYmVsPlwiXG5cblx0XHRcdFx0XHR1bnJlYWQgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPidcblx0XHRcdFx0XHRlbHNlIGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09IHRydWVcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+J1xuXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlWYWx1ZSA9IGRvYy52YWx1ZXM/LnByaW9yaXR5XG5cdFx0XHRcdFx0c3dpdGNoIHByaW9yaXR5VmFsdWVcblx0XHRcdFx0XHRcdHdoZW4gXCLnibnmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLntKfmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHR3aGVuIFwi5Yqe5paHXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCJcblx0XHRcdFx0XHRpZiBwcmlvcml0eUljb25DbGFzc1xuXHRcdFx0XHRcdFx0aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktI3twcmlvcml0eUljb25DbGFzc31cIlxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPiN7dW5yZWFkfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lICN7aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzc30nPiN7ZG9jLmluc3RhbmNlX25hbWV9I3tjY192aWV3fSN7YWdlbnRfdmlld308L2Rpdj5cblx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3VibWl0X2RhdGVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3VibWl0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdWJtaXRfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2Muc3VibWl0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiZmxvd19uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN0ZXBfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdGVwX2N1cnJlbnRfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLmluc3RhbmNlX3N0YXRlID09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdGp1ZGdlID0gZG9jLmp1ZGdlIHx8IFwiYXBwcm92ZWRcIlxuXG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWUgPSBkb2Muc3RlcF9uYW1lIHx8ICcnXG5cblx0XHRcdFx0XHRjY190YWcgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgZG9jLmNjX2NvdW50ID4gMFxuXHRcdFx0XHRcdFx0Y2NfdGFnID0gVEFQaTE4bi5fXygnY2NfdGFnJylcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwLWN1cnJlbnQtc3RhdGUgI3tqdWRnZX1cIj4je3N0ZXBfY3VycmVudF9uYW1lfSN7Y2NfdGFnfTwvZGl2PlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJtb2RpZmllZFwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19tb2RpZmllZFwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3RhcnRfZGF0ZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdGFydF9kYXRlXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3RhcnRfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2Muc3RhcnRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJmaW5pc2hfZGF0ZVwiLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2MuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLmZpbmlzaF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImtleXdvcmRzXCIsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImlzX2FyY2hpdmVkXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYz8udmFsdWVzPy5yZWNvcmRfbmVlZCAmJiBkb2MudmFsdWVzLnJlY29yZF9uZWVkID09IFwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRpZiBkb2M/LmlzX2FyY2hpdmVkXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0KFwiWUVTXCIpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdChcIk5PXCIpXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH1cblx0XHRdLFxuXHRcdGRvbTogZG8gLT5cblx0XHRcdCMg5omL5py65LiK5LiN5pi+56S65LiA6aG15pi+56S65aSa5bCR5p2h6K6w5b2V6YCJ6aG5XG5cdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0J3RwJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQndHBsJ1xuXHRcdG9yZGVyOiBbWzQsIFwiZGVzY1wiXV0sXG5cdFx0ZXh0cmFGaWVsZHM6IFtcImluc3RhbmNlXCIsIFwiZm9ybVwiLCBcImZsb3dcIiwgXCJpbmJveF91c2Vyc1wiLCBcImluc3RhbmNlX3N0YXRlXCIsIFwic3BhY2VcIiwgXCJhcHBsaWNhbnRcIiwgXCJmb3JtX3ZlcnNpb25cIixcblx0XHRcdFwiZmxvd192ZXJzaW9uXCIsIFwidHlwZVwiLCBcImlzX3JlYWRcIiwgXCJzdGVwX25hbWVcIiwgXCJ2YWx1ZXNcIiwgXCJrZXl3b3Jkc1wiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwiZmxvd19uYW1lXCIsIFwiaXNfaGlkZGVuXCIsIFwiYWdlbnRfdXNlcl9uYW1lXCJdLFxuXHRcdGxlbmd0aENoYW5nZTogdHJ1ZSxcblx0XHRsZW5ndGhNZW51OiBbMTAsMTUsMjAsMjUsNTAsMTAwXSxcblx0XHRwYWdlTGVuZ3RoOiAxMCxcblx0XHRpbmZvOiBmYWxzZSxcblx0XHRzZWFyY2hpbmc6IHRydWUsXG5cdFx0cmVzcG9uc2l2ZTpcblx0XHRcdGRldGFpbHM6IGZhbHNlXG5cdFx0YXV0b1dpZHRoOiBmYWxzZSxcblx0XHRjaGFuZ2VTZWxlY3RvcjogKHNlbGVjdG9yLCB1c2VySWQpIC0+XG5cdFx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHNwYWNlID0gc2VsZWN0b3Iuc3BhY2Vcblx0XHRcdHVubGVzcyBzcGFjZVxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNwYWNlID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHt1c2VyOiB1c2VySWQsIHNwYWNlOiBzcGFjZX0sIHtmaWVsZHM6IHtfaWQ6IDF9fSlcblx0XHRcdHVubGVzcyBzcGFjZV91c2VyXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHJldHVybiBzZWxlY3RvclxuXHRcdHBhZ2luZ1R5cGU6IFwibnVtYmVyc1wiXG5cblx0fVxuXG5cdGlmIGZsb3dJZFxuXHRcdGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBmbG93SWRcblxuXHRcdG9wdGlvbnMubmFtZSA9IGtleVxuXG5cdFx0VGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcy5maWVsZHMgPSBmaWVsZHNcblxuXHRcdGluc19maWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyBUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzLmZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcy5mb3JFYWNoIChmKS0+XG5cdFx0XHRpZiBmLnR5cGUgIT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheVxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMucHVzaFxuXHRcdFx0XHRcdGRhdGE6IChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR0aXRsZTogdChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cblx0XHRcdFx0XHRcdHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge31cblxuXHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZXNbZi5jb2RlXVxuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggZi50eXBlXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ3VzZXInXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdncm91cCdcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5mdWxsbmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcblx0XHRcdFx0XHRcdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdjaGVja2JveCdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZSA9PSB0cnVlIHx8IHZhbHVlID09ICd0cnVlJ1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcblx0XHRcdFx0XHRcdFx0d2hlbiAnb2RhdGEnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdGlmIF8uaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlWydAbGFiZWwnXVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblxuXG5cdHJldHVybiBvcHRpb25zO1xuXG5cbk1ldGVvci5zdGFydHVwICgpLT5cblx0VGFidWxhclRhYmxlcy5pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZSBpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKClcblx0VGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKClcblx0VGFidWxhclRhYmxlcy5pbmJveF9pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZSBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhcImluYm94XCIpXG5cdFRhYnVsYXJUYWJsZXMub3V0Ym94X2luc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKFwib3V0Ym94XCIpXG5cblxuR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMgPSAoYm94LCBmbG93SWQsIGZpZWxkcyktPlxuXHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgYm94ICsgZmxvd0lkXG5cdGlmIGJveCA9PSBcImluYm94XCJcblx0XHRvcHRpb25zID0gX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zKGZsb3dJZCwgZmllbGRzKVxuXHRlbHNlIGlmIGJveCA9PSBcIm91dGJveFwiXG5cdFx0b3B0aW9ucyA9IF9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpXG5cdGVsc2Vcblx0XHRvcHRpb25zID0gaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcylcblx0XHRpZiAhZmxvd0lkXG5cdFx0XHRvcHRpb25zLm5hbWUgPSBcImluYm94X2luc3RhbmNlc1wiXG5cdGlmIGZsb3dJZFxuXHRcdG9wdGlvbnMubmFtZSA9IGtleVxuXHRyZXR1cm4gb3B0aW9uc1xuXG5fZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSAoZmxvd0lkLCBmaWVsZHMpLT5cblx0b3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKVxuXG5cdGlmICFmbG93SWRcblx0XHRvcHRpb25zLm5hbWUgPSBcImluYm94X2luc3RhbmNlc1wiXG5cblx0b3B0aW9ucy5vcmRlciA9IFtbOCwgXCJkZXNjXCJdXVxuXG5cdG9wdGlvbnMuZ2V0U29ydCA9IChzZWxlY3Rvciwgc29ydCkgLT4gXG5cdFx0Y29uc29sZS5sb2coJ2luYm94X2luc3RhbmNlczonLHNvcnQpXG5cdFx0cmV0dXJuIHNvcnRcblxuXHRyZXR1cm4gb3B0aW9uc1xuXG5fZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zID0gKGZsb3dJZCwgZmllbGRzKS0+XG5cdG9wdGlvbnMgPSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcylcblxuXHRpZiAhZmxvd0lkXG5cdFx0b3B0aW9ucy5uYW1lID0gXCJvdXRib3hfaW5zdGFuY2VzXCJcblxuXHRvcHRpb25zLm9yZGVyID0gW1s5LCAtMV1dXG5cblx0b3B0aW9ucy5nZXRTb3J0ID0gKHNlbGVjdG9yLCBzb3J0KSAtPiBcblx0XHRjb25zb2xlLmxvZygnb3V0Ym94X2luc3RhbmNlczonLHNvcnQpXG5cdFx0IyBuZXdTb3J0ID0gWyBcblx0XHQjIFx0WydzcGFjZScsIDFdLFxuXHRcdCMgXHRbJ2hhbmRsZXInLCAxXSxcblx0XHQjIFx0Wydpc19maW5pc2hlZCcsIDFdLFxuXHRcdCMgXVxuXHRcdCMgbmV3U29ydCA9IG5ld1NvcnQuY29uY2F0KHNvcnQpXG5cdFx0IyByZXR1cm4gbmV3U29ydFxuXHRcdHJldHVybiBzb3J0XG5cblx0cmV0dXJuIG9wdGlvbnNcblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFRhYnVsYXJUYWJsZXMuZmxvd0luc3RhbmNlcyA9IG5ldyBSZWFjdGl2ZVZhcigpXG5cbk1ldGVvci5zdGFydHVwICgpLT5cblx0VHJhY2tlci5hdXRvcnVuIChjKSAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAhU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImZsb3dJZFwiKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSAhPSAnZHJhZnQnXG5cdFx0XHRcdE1ldGVvci5jYWxsIFwibmV3SW5zdGFuY2VzTGlzdFRhYnVsYXJcIiwgU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCAoZXJyb3IsIHJlc3VsdCkgLT5cblx0XHRcdFx0XHRuZXdJbnN0YW5jZXNMaXN0VGFidWxhciBTZXNzaW9uLmdldChcImJveFwiKSwgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIiksIHJlc3VsdFxuXHRcdFx0XHRcdFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX2NoYW5nZU9yZGVyKClcblxuXG5uZXdJbnN0YW5jZXNMaXN0VGFidWxhciA9IChib3gsIGZsb3dJZCwgZmllbGRzKS0+XG5cdGlmICFmaWVsZHNcblx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkOiBmbG93SWR9LCB7ZmllbGRzOiB7Zm9ybTogMX19KVxuXHRcdGZpZWxkcyA9IGRiLmZvcm1zLmZpbmRPbmUoeyBfaWQ6IGZsb3c/LmZvcm0gfSwgeyBmaWVsZHM6IHsgJ2N1cnJlbnQuZmllbGRzJzogMSB9IH0pPy5jdXJyZW50Py5maWVsZHNcblxuXHRmaWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyBmaWVsZHNcblxuXHRpZiBmaWVsZHM/LmZpbHRlclByb3BlcnR5KFwiaXNfbGlzdF9kaXNwbGF5XCIsIHRydWUpPy5sZW5ndGggPiAwXG5cdFx0a2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGJveCArIGZsb3dJZFxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0VGFidWxhclRhYmxlcy5mbG93SW5zdGFuY2VzLnNldChuZXcgVGFidWxhci5UYWJsZSBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhib3gsIGZsb3dJZCwgZmllbGRzKSlcblx0XHRlbHNlXG5cdFx0XHRuZXcgVGFidWxhci5UYWJsZSBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhib3gsIGZsb3dJZCwgZmllbGRzKVxuXHRcdGNvbnNvbGUubG9nIFwibmV3IFRhYnVsYXJUYWJsZXMgXCIsIGtleVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0TWV0ZW9yLm1ldGhvZHNcblx0XHRuZXdJbnN0YW5jZXNMaXN0VGFidWxhcjogKGJveCwgZmxvd0lkKS0+XG5cdFx0XHRuZXdJbnN0YW5jZXNMaXN0VGFidWxhcihib3gsIGZsb3dJZClcblxuXHRcdFx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe19pZDogZmxvd0lkfSwge2ZpZWxkczoge2Zvcm06IDF9fSlcblx0XHRcdGZpZWxkcyA9IGRiLmZvcm1zLmZpbmRPbmUoeyBfaWQ6IGZsb3c/LmZvcm0gfSwgeyBmaWVsZHM6IHsgJ2N1cnJlbnQuZmllbGRzJzogMSB9IH0pPy5jdXJyZW50Py5maWVsZHNcblx0XHRcdHJldHVybiBmaWVsZHNcblxuXG4iLCJ2YXIgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMsIF9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucywgX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucywgX2hhbmRsZUxpc3RGaWVsZHMsIGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyLCBpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyLCBuZXdJbnN0YW5jZXNMaXN0VGFidWxhciwgdXBkYXRlVGFidWxhclRpdGxlO1xuXG5TdGVlZG9zLnN1YnNbXCJJbnN0YW5jZVRhYnVsYXJcIl0gPSBuZXcgU3Vic01hbmFnZXIoKTtcblxuX2hhbmRsZUxpc3RGaWVsZHMgPSBmdW5jdGlvbihmaWVsZHMpIHtcbiAgdmFyIGluc19maWVsZHM7XG4gIGluc19maWVsZHMgPSBuZXcgQXJyYXkoKTtcbiAgaWYgKGZpZWxkcyAhPSBudWxsKSB7XG4gICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIGlmIChmLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdpZ25vcmUgb3BpbmlvbiBmaWVsZCBpbiB0YWJsZScpO1xuICAgICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgICByZXR1cm4gZiAhPSBudWxsID8gKHJlZiA9IGYuZmllbGRzKSAhPSBudWxsID8gcmVmLmZvckVhY2goZnVuY3Rpb24oZjEpIHtcbiAgICAgICAgICByZXR1cm4gaW5zX2ZpZWxkcy5wdXNoKGYxKTtcbiAgICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5zX2ZpZWxkcy5wdXNoKGYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBpbnNfZmllbGRzO1xufTtcblxudXBkYXRlVGFidWxhclRpdGxlID0gZnVuY3Rpb24oKSB7fTtcblxuaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciA9IGZ1bmN0aW9uKGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBpbnNfZmllbGRzLCBrZXksIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSB7XG4gICAgbmFtZTogXCJpbnN0YW5jZXNcIixcbiAgICBjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZXMsXG4gICAgcHViOiBcImluc3RhbmNlX3RhYnVsYXJcIixcbiAgICBvblVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApO1xuICAgIH0sXG4gICAgZHJhd0NhbGxiYWNrOiBmdW5jdGlvbihzZXR0aW5ncykge1xuICAgICAgdmFyIGVsbGlwc2lzTGluaywgZW1wdHlUZCwgdGl0bGU7XG4gICAgICBlbXB0eVRkID0gJChcIi5kYXRhVGFibGVzX2VtcHR5XCIpO1xuICAgICAgaWYgKGVtcHR5VGQubGVuZ3RoKSB7XG4gICAgICAgIGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiO1xuICAgICAgfVxuICAgICAgaWYgKCFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNQYWQoKSkge1xuICAgICAgICBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgICAgICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5wZXJmZWN0U2Nyb2xsYmFyKFwidXBkYXRlXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCk7XG4gICAgICB9XG4gICAgICB0aXRsZSA9IHQoXCJwYWdlcl9pbnB1dF9oaW50XCIpO1xuICAgICAgZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpO1xuICAgICAgcmV0dXJuIGVsbGlwc2lzTGluay5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmNzcyhcImN1cnNvclwiLCBcInBvaW50ZXJcIikuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnb1BhZ2UsIGlucHV0O1xuICAgICAgICBpZiAoISQodGhpcykuZmluZCgnaW5wdXQnKS5sZW5ndGgpIHtcbiAgICAgICAgICBpbnB1dCA9ICQoJzxpbnB1dCBjbGFzcz1cInBhZ2luYXRlX2lucHV0IGZvcm0tY29udHJvbCBpbnB1dC1zbVwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJib3JkZXI6IG5vbmU7IHBhZGRpbmc6MCAycHg7XCIvPicpO1xuICAgICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgIGlucHV0LmNzcyh7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjUycHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0LmNzcyh7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjUycHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKTtcbiAgICAgICAgICAkKHRoaXMpLmVtcHR5KCkuYXBwZW5kKGlucHV0KTtcbiAgICAgICAgICBnb1BhZ2UgPSBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgdmFyIHBhZ2VzO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPiBwYWdlcykge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gcGFnZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzLm9JbnN0YW5jZS5EYXRhVGFibGUoKS5wYWdlKGluZGV4KS5kcmF3KCdwYWdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbnB1dC5ibHVyKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzKS5wYXJlbnQoKS5odG1sKCcuLi4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaW5wdXQua2V5ZG93bihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZ2U7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlLnRvU3RyaW5nKCkgPT09IFwiMTNcIikge1xuICAgICAgICAgICAgICBjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgIHJldHVybiBnb1BhZ2UoY3VycmVudFBhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZWRSb3c6IGZ1bmN0aW9uKHJvdywgZGF0YSwgZGF0YUluZGV4KSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGlmIChkYXRhLl9pZCA9PT0gRmxvd1JvdXRlci5jdXJyZW50KCkucGFyYW1zLmluc3RhbmNlSWQpIHtcbiAgICAgICAgICByZXR1cm4gcm93LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHtcbiAgICAgICAgZGF0YTogXCJfaWRcIixcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhZ2VudF92aWV3LCBjY192aWV3LCBmbG93X25hbWUsIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MsIG1vZGlmaWVkLCBtb2RpZmllZEZyb21Ob3csIG1vZGlmaWVkU3RyaW5nLCBwcmlvcml0eUljb24sIHByaW9yaXR5SWNvbkNsYXNzLCBwcmlvcml0eVZhbHVlLCByZWYsIHJlZjEsIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcsIHVucmVhZDtcbiAgICAgICAgICBtb2RpZmllZFN0cmluZyA9IG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgIG1vZGlmaWVkID0gZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2Muc3RhdGUgIT09ICdkcmFmdCcpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkID0gZG9jLnN0YXJ0X2RhdGUgfHwgZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdvdXRib3gnIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkID0gZG9jLnN1Ym1pdF9kYXRlIHx8IGRvYy5zdWJtaXRfZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW9kaWZpZWRGcm9tTm93ID0gU3RlZWRvcy5tb21lbnRSZWFjdGl2ZUZyb21Ob3cobW9kaWZpZWQpO1xuICAgICAgICAgIGZsb3dfbmFtZSA9IGRvYy5mbG93X25hbWU7XG4gICAgICAgICAgY2NfdmlldyA9IFwiXCI7XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5pc19jYyAmJiAhKChyZWYgPSBkb2MuaW5ib3hfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSA6IHZvaWQgMCkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLmN1cnJlbnRfc3RlcF9uYW1lICsgXCIpPC9zcGFuPjwvZGl2PlwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgIT09ICdkcmFmdCcgJiYgZG9jLmN1cnJlbnRfc3RlcF9uYW1lKSB7XG4gICAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjxzcGFuPihcIiArIGRvYy5jdXJyZW50X3N0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjwvZGl2PlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb24gPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZjEgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmMS5wcmlvcml0eSA6IHZvaWQgMDtcbiAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCLnibnmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLntKfmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi5Yqe5paHXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpb3JpdHlJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LVwiICsgcHJpb3JpdHlJY29uQ2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz5cIiArIHVucmVhZCArIFwiPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSBcIiArIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgKyBcIic+XCIgKyBkb2MubmFtZSArIGNjX3ZpZXcgKyBhZ2VudF92aWV3ICsgXCJcXG5cdDxzcGFuPlwiICsgZG9jLmFwcGxpY2FudF9uYW1lICsgXCI8L3NwYW4+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtZGV0YWlsJz5cIiArIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgKyBcIlxcblx0PHNwYW4gY2xhc3M9J2luc3RhbmNlLW1vZGlmaWVkJyB0aXRsZT0nXCIgKyBtb2RpZmllZFN0cmluZyArIFwiJz5cIiArIG1vZGlmaWVkRnJvbU5vdyArIFwiPC9zcGFuPlxcbjwvZGl2PlwiO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJuYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWdlbnRfdmlldywgY2NfdmlldywgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcywgcHJpb3JpdHlJY29uQ2xhc3MsIHByaW9yaXR5VmFsdWUsIHJlZiwgcmVmMSwgc3RlcF9jdXJyZW50X25hbWVfdmlldywgdW5yZWFkO1xuICAgICAgICAgIGNjX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuaXNfY2MgJiYgISgocmVmID0gZG9jLmluYm94X3VzZXJzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgOiB2b2lkIDApICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbnRfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5hZ2VudF91c2VyX25hbWUpIHtcbiAgICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWVcbiAgICAgICAgICAgIH0pICsgXCIpPC9sYWJlbD5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5yZWFkID0gJyc7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPic7XG4gICAgICAgICAgfSBlbHNlIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5VmFsdWUgPSAocmVmMSA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYxLnByaW9yaXR5IDogdm9pZCAwO1xuICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcIueJueaApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIue0p+aApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLlip7mlodcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmlvcml0eUljb25DbGFzcykge1xuICAgICAgICAgICAgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktXCIgKyBwcmlvcml0eUljb25DbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPlwiICsgdW5yZWFkICsgXCI8L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lIFwiICsgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyArIFwiJz5cIiArIGRvYy5uYW1lICsgY2NfdmlldyArIGFnZW50X3ZpZXcgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN1Ym1pdF9kYXRlXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N1Ym1pdF9kYXRlXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5zdWJtaXRfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2Muc3VibWl0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImZsb3dfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImN1cnJlbnRfc3RlcF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0ZXBfY3VycmVudF9uYW1lXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGNjX3RhZywganVkZ2UsIHN0ZXBfY3VycmVudF9uYW1lO1xuICAgICAgICAgIGlmIChkb2Muc3RhdGUgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICAgIGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJyc7XG4gICAgICAgICAgY2NfdGFnID0gJyc7XG4gICAgICAgICAgaWYgKGRvYy5jY19jb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNjX3RhZyA9IFRBUGkxOG4uX18oJ2NjX3RhZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJzdGVwLWN1cnJlbnQtc3RhdGUgXCIgKyBqdWRnZSArIFwiXFxcIj5cIiArIHN0ZXBfY3VycmVudF9uYW1lICsgY2NfdGFnICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19tb2RpZmllZFwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN0YXJ0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RhcnRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3RhcnRfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2Muc3RhcnRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibXlfZmluaXNoX2RhdGVcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MubXlfZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLm15X2ZpbmlzaF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImtleXdvcmRzXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgaWYgKChkb2MgIT0gbnVsbCA/IChyZWYgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmLnJlY29yZF9uZWVkIDogdm9pZCAwIDogdm9pZCAwKSAmJiBkb2MudmFsdWVzLnJlY29yZF9uZWVkID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsID8gZG9jLmlzX2FyY2hpdmVkIDogdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0KFwiWUVTXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHQoXCJOT1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICd0cCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ3RwbCc7XG4gICAgICB9XG4gICAgfSkoKSxcbiAgICBvcmRlcjogW1s0LCBcImRlc2NcIl1dLFxuICAgIGV4dHJhRmllbGRzOiBbXCJmb3JtXCIsIFwiZmxvd1wiLCBcImluYm94X3VzZXJzXCIsIFwic3RhdGVcIiwgXCJzcGFjZVwiLCBcImFwcGxpY2FudFwiLCBcImZvcm1fdmVyc2lvblwiLCBcImZsb3dfdmVyc2lvblwiLCBcImlzX2NjXCIsIFwiY2NfY291bnRcIiwgXCJpc19yZWFkXCIsIFwiY3VycmVudF9zdGVwX25hbWVcIiwgXCJ2YWx1ZXNcIiwgXCJrZXl3b3Jkc1wiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwiZmxvd19uYW1lXCIsIFwiaXNfaGlkZGVuXCIsIFwiYWdlbnRfdXNlcl9uYW1lXCJdLFxuICAgIGxlbmd0aENoYW5nZTogdHJ1ZSxcbiAgICBsZW5ndGhNZW51OiBbMTAsIDE1LCAyMCwgMjUsIDUwLCAxMDBdLFxuICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgIGluZm86IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiB7XG4gICAgICBkZXRhaWxzOiBmYWxzZVxuICAgIH0sXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBjaGFuZ2VTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IsIHVzZXJJZCkge1xuICAgICAgdmFyIHJlZiwgc3BhY2UsIHNwYWNlX3VzZXI7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gc2VsZWN0b3Iuc3BhY2U7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHNwYWNlOiBzcGFjZVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXNwYWNlX3VzZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfSxcbiAgICBwYWdpbmdUeXBlOiBcIm51bWJlcnNcIlxuICB9O1xuICBpZiAoZmxvd0lkKSB7XG4gICAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZDtcbiAgICBvcHRpb25zLm5hbWUgPSBrZXk7XG4gICAgVGFidWxhclRhYmxlcy5pbnN0YW5jZXMuZmllbGRzID0gZmllbGRzO1xuICAgIGluc19maWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyhUYWJ1bGFyVGFibGVzLmluc3RhbmNlcy5maWVsZHMpO1xuICAgIGluc19maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICBpZiAoZi50eXBlICE9PSAndGFibGUnICYmIGYuaXNfbGlzdF9kaXNwbGF5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgZGF0YTogZi5uYW1lIHx8IGYuY29kZSxcbiAgICAgICAgICB0aXRsZTogdChmLm5hbWUgfHwgZi5jb2RlKSxcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSwgdmFsdWVzO1xuICAgICAgICAgICAgdmFsdWVzID0gZG9jLnZhbHVlcyB8fCB7fTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2YuY29kZV07XG4gICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5uYW1lIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdncm91cCc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZnVsbG5hbWUgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ29kYXRhJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXy5wbHVjayh2YWx1ZSwgJ0BsYWJlbCcpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWydAbGFiZWwnXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbmluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIGluc19maWVsZHMsIGtleSwgb3B0aW9ucztcbiAgb3B0aW9ucyA9IHtcbiAgICBuYW1lOiBcImluc3RhbmNlX3Rhc2tzXCIsXG4gICAgY29sbGVjdGlvbjogZGIuaW5zdGFuY2VfdGFza3MsXG4gICAgcHViOiBcImluc3RhbmNlX3Rhc2tzX3RhYnVsYXJcIixcbiAgICBvblVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApO1xuICAgIH0sXG4gICAgZHJhd0NhbGxiYWNrOiBmdW5jdGlvbihzZXR0aW5ncykge1xuICAgICAgdmFyIGVsbGlwc2lzTGluaywgZW1wdHlUZCwgdGl0bGU7XG4gICAgICBlbXB0eVRkID0gJChcIi5kYXRhVGFibGVzX2VtcHR5XCIpO1xuICAgICAgaWYgKGVtcHR5VGQubGVuZ3RoKSB7XG4gICAgICAgIGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiO1xuICAgICAgfVxuICAgICAgaWYgKCFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNQYWQoKSkge1xuICAgICAgICBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgICAgICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5wZXJmZWN0U2Nyb2xsYmFyKFwidXBkYXRlXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCk7XG4gICAgICB9XG4gICAgICB0aXRsZSA9IHQoXCJwYWdlcl9pbnB1dF9oaW50XCIpO1xuICAgICAgZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpO1xuICAgICAgcmV0dXJuIGVsbGlwc2lzTGluay5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmNzcyhcImN1cnNvclwiLCBcInBvaW50ZXJcIikuY2xpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnb1BhZ2UsIGlucHV0O1xuICAgICAgICBpZiAoISQodGhpcykuZmluZCgnaW5wdXQnKS5sZW5ndGgpIHtcbiAgICAgICAgICBpbnB1dCA9ICQoJzxpbnB1dCBjbGFzcz1cInBhZ2luYXRlX2lucHV0IGZvcm0tY29udHJvbCBpbnB1dC1zbVwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJib3JkZXI6IG5vbmU7IHBhZGRpbmc6MCAycHg7XCIvPicpO1xuICAgICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgIGlucHV0LmNzcyh7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjUycHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0LmNzcyh7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjUycHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKTtcbiAgICAgICAgICAkKHRoaXMpLmVtcHR5KCkuYXBwZW5kKGlucHV0KTtcbiAgICAgICAgICBnb1BhZ2UgPSBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgdmFyIHBhZ2VzO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICBwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPiBwYWdlcykge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gcGFnZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzLm9JbnN0YW5jZS5EYXRhVGFibGUoKS5wYWdlKGluZGV4KS5kcmF3KCdwYWdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbnB1dC5ibHVyKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzKS5wYXJlbnQoKS5odG1sKCcuLi4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaW5wdXQua2V5ZG93bihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZ2U7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlLnRvU3RyaW5nKCkgPT09IFwiMTNcIikge1xuICAgICAgICAgICAgICBjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgIHJldHVybiBnb1BhZ2UoY3VycmVudFBhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZWRSb3c6IGZ1bmN0aW9uKHJvdywgZGF0YSwgZGF0YUluZGV4KSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGlmIChkYXRhLmluc3RhbmNlID09PSBGbG93Um91dGVyLmN1cnJlbnQoKS5wYXJhbXMuaW5zdGFuY2VJZCkge1xuICAgICAgICAgIHJldHVybiByb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBkYXRhOiBcIl9pZFwiLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGZsb3dfbmFtZSwgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcywgbW9kaWZpZWQsIG1vZGlmaWVkRnJvbU5vdywgbW9kaWZpZWRTdHJpbmcsIHByaW9yaXR5SWNvbiwgcHJpb3JpdHlJY29uQ2xhc3MsIHByaW9yaXR5VmFsdWUsIHJlZiwgc3RlcF9jdXJyZW50X25hbWVfdmlldywgdW5yZWFkO1xuICAgICAgICAgIG1vZGlmaWVkU3RyaW5nID0gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgbW9kaWZpZWQgPSBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5pbnN0YW5jZV9zdGF0ZSAhPT0gJ2RyYWZ0Jykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ291dGJveCcpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkID0gZG9jLnN1Ym1pdF9kYXRlIHx8IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW9kaWZpZWRGcm9tTm93ID0gU3RlZWRvcy5tb21lbnRSZWFjdGl2ZUZyb21Ob3cobW9kaWZpZWQpO1xuICAgICAgICAgIGZsb3dfbmFtZSA9IGRvYy5mbG93X25hbWU7XG4gICAgICAgICAgY2NfdmlldyA9IFwiXCI7XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy50eXBlID09PSAnY2MnICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIjtcbiAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjxzcGFuPihcIiArIGRvYy5zdGVwX25hbWUgKyBcIik8L3NwYW4+PC9kaXY+XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb2Muc3RlcF9uYW1lKSB7XG4gICAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjxzcGFuPihcIiArIGRvYy5zdGVwX25hbWUgKyBcIik8L3NwYW4+PC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbnRfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5hZ2VudF91c2VyX25hbWUgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWVcbiAgICAgICAgICAgIH0pICsgXCIpPC9sYWJlbD5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5yZWFkID0gJyc7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPic7XG4gICAgICAgICAgfSBlbHNlIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpb3JpdHlJY29uID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlWYWx1ZSA9IChyZWYgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmLnByaW9yaXR5IDogdm9pZCAwO1xuICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcIueJueaApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIue0p+aApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLlip7mlodcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmlvcml0eUljb25DbGFzcykge1xuICAgICAgICAgICAgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktXCIgKyBwcmlvcml0eUljb25DbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPlwiICsgdW5yZWFkICsgXCI8L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lIFwiICsgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyArIFwiJz5cIiArIGRvYy5pbnN0YW5jZV9uYW1lICsgY2NfdmlldyArIGFnZW50X3ZpZXcgKyBcIlxcblx0PHNwYW4+XCIgKyBkb2MuYXBwbGljYW50X25hbWUgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPlwiICsgc3RlcF9jdXJyZW50X25hbWVfdmlldyArIFwiXFxuXHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPSdcIiArIG1vZGlmaWVkU3RyaW5nICsgXCInPlwiICsgbW9kaWZpZWRGcm9tTm93ICsgXCI8L3NwYW4+XFxuPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImluc3RhbmNlX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhZ2VudF92aWV3LCBjY192aWV3LCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCByZWYxLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgY2NfdmlldyA9IFwiXCI7XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5pc19jYyAmJiAhKChyZWYgPSBkb2MuaW5ib3hfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSA6IHZvaWQgMCkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSkge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlWYWx1ZSA9IChyZWYxID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZjEucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLmluc3RhbmNlX25hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiPC9kaXY+XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3VibWl0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3VibWl0X2RhdGVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLnN1Ym1pdF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmxvd19uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3RlcF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0ZXBfY3VycmVudF9uYW1lXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGNjX3RhZywganVkZ2UsIHN0ZXBfY3VycmVudF9uYW1lO1xuICAgICAgICAgIGlmIChkb2MuaW5zdGFuY2Vfc3RhdGUgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICAgIGp1ZGdlID0gZG9jLmp1ZGdlIHx8IFwiYXBwcm92ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWUgPSBkb2Muc3RlcF9uYW1lIHx8ICcnO1xuICAgICAgICAgIGNjX3RhZyA9ICcnO1xuICAgICAgICAgIGlmIChkb2MuY2NfY291bnQgPiAwKSB7XG4gICAgICAgICAgICBjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwic3RlcC1jdXJyZW50LXN0YXRlIFwiICsganVkZ2UgKyBcIlxcXCI+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZSArIGNjX3RhZyArIFwiPC9kaXY+XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibW9kaWZpZWRcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfbW9kaWZpZWRcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdGFydF9kYXRlXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLnN0YXJ0X2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLnN0YXJ0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImZpbmlzaF9kYXRlXCIsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5maW5pc2hfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibW9kaWZpZWRcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJrZXl3b3Jkc1wiLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImlzX2FyY2hpdmVkXCIsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgIGlmICgoZG9jICE9IG51bGwgPyAocmVmID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZi5yZWNvcmRfbmVlZCA6IHZvaWQgMCA6IHZvaWQgMCkgJiYgZG9jLnZhbHVlcy5yZWNvcmRfbmVlZCA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCA/IGRvYy5pc19hcmNoaXZlZCA6IHZvaWQgMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdChcIllFU1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0KFwiTk9cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfVxuICAgIF0sXG4gICAgZG9tOiAoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAndHAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICd0cGwnO1xuICAgICAgfVxuICAgIH0pKCksXG4gICAgb3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcbiAgICBleHRyYUZpZWxkczogW1wiaW5zdGFuY2VcIiwgXCJmb3JtXCIsIFwiZmxvd1wiLCBcImluYm94X3VzZXJzXCIsIFwiaW5zdGFuY2Vfc3RhdGVcIiwgXCJzcGFjZVwiLCBcImFwcGxpY2FudFwiLCBcImZvcm1fdmVyc2lvblwiLCBcImZsb3dfdmVyc2lvblwiLCBcInR5cGVcIiwgXCJpc19yZWFkXCIsIFwic3RlcF9uYW1lXCIsIFwidmFsdWVzXCIsIFwia2V5d29yZHNcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcImZsb3dfbmFtZVwiLCBcImlzX2hpZGRlblwiLCBcImFnZW50X3VzZXJfbmFtZVwiXSxcbiAgICBsZW5ndGhDaGFuZ2U6IHRydWUsXG4gICAgbGVuZ3RoTWVudTogWzEwLCAxNSwgMjAsIDI1LCA1MCwgMTAwXSxcbiAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICBpbmZvOiBmYWxzZSxcbiAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgcmVzcG9uc2l2ZToge1xuICAgICAgZGV0YWlsczogZmFsc2VcbiAgICB9LFxuICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgY2hhbmdlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1c2VySWQpIHtcbiAgICAgIHZhciByZWYsIHNwYWNlLCBzcGFjZV91c2VyO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZSA9IHNlbGVjdG9yLnNwYWNlO1xuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICBpZiAoKHNlbGVjdG9yICE9IG51bGwgPyAocmVmID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZi5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgIHNwYWNlID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgICBzcGFjZTogc3BhY2VcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFzcGFjZV91c2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH0sXG4gICAgcGFnaW5nVHlwZTogXCJudW1iZXJzXCJcbiAgfTtcbiAgaWYgKGZsb3dJZCkge1xuICAgIGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBmbG93SWQ7XG4gICAgb3B0aW9ucy5uYW1lID0ga2V5O1xuICAgIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzID0gZmllbGRzO1xuICAgIGluc19maWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyhUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzLmZpZWxkcyk7XG4gICAgaW5zX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgIGlmIChmLnR5cGUgIT09ICd0YWJsZScgJiYgZi5pc19saXN0X2Rpc3BsYXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBmLm5hbWUgfHwgZi5jb2RlLFxuICAgICAgICAgIHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgICAgdmFyIHZhbHVlLCB2YWx1ZXM7XG4gICAgICAgICAgICB2YWx1ZXMgPSBkb2MudmFsdWVzIHx8IHt9O1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZi5jb2RlXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLm5hbWUgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5mdWxsbmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnb2RhdGEnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUoaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhcigpKTtcbiAgVGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcyA9IG5ldyBUYWJ1bGFyLlRhYmxlKGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKCkpO1xuICBUYWJ1bGFyVGFibGVzLmluYm94X2luc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKFwiaW5ib3hcIikpO1xuICByZXR1cm4gVGFidWxhclRhYmxlcy5vdXRib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUoR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJvdXRib3hcIikpO1xufSk7XG5cbkdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zID0gZnVuY3Rpb24oYm94LCBmbG93SWQsIGZpZWxkcykge1xuICB2YXIga2V5LCBvcHRpb25zO1xuICBrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgYm94ICsgZmxvd0lkO1xuICBpZiAoYm94ID09PSBcImluYm94XCIpIHtcbiAgICBvcHRpb25zID0gX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zKGZsb3dJZCwgZmllbGRzKTtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwib3V0Ym94XCIpIHtcbiAgICBvcHRpb25zID0gX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyhmbG93SWQsIGZpZWxkcyk7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpO1xuICAgIGlmICghZmxvd0lkKSB7XG4gICAgICBvcHRpb25zLm5hbWUgPSBcImluYm94X2luc3RhbmNlc1wiO1xuICAgIH1cbiAgfVxuICBpZiAoZmxvd0lkKSB7XG4gICAgb3B0aW9ucy5uYW1lID0ga2V5O1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcyk7XG4gIGlmICghZmxvd0lkKSB7XG4gICAgb3B0aW9ucy5uYW1lID0gXCJpbmJveF9pbnN0YW5jZXNcIjtcbiAgfVxuICBvcHRpb25zLm9yZGVyID0gW1s4LCBcImRlc2NcIl1dO1xuICBvcHRpb25zLmdldFNvcnQgPSBmdW5jdGlvbihzZWxlY3Rvciwgc29ydCkge1xuICAgIGNvbnNvbGUubG9nKCdpbmJveF9pbnN0YW5jZXM6Jywgc29ydCk7XG4gICAgcmV0dXJuIHNvcnQ7XG4gIH07XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyA9IGZ1bmN0aW9uKGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBvcHRpb25zO1xuICBvcHRpb25zID0gaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpO1xuICBpZiAoIWZsb3dJZCkge1xuICAgIG9wdGlvbnMubmFtZSA9IFwib3V0Ym94X2luc3RhbmNlc1wiO1xuICB9XG4gIG9wdGlvbnMub3JkZXIgPSBbWzksIC0xXV07XG4gIG9wdGlvbnMuZ2V0U29ydCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBzb3J0KSB7XG4gICAgY29uc29sZS5sb2coJ291dGJveF9pbnN0YW5jZXM6Jywgc29ydCk7XG4gICAgcmV0dXJuIHNvcnQ7XG4gIH07XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMgPSBuZXcgUmVhY3RpdmVWYXIoKTtcbn1cblxuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBUcmFja2VyLmF1dG9ydW4oZnVuY3Rpb24oYykge1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9PSAnZHJhZnQnKSB7XG4gICAgICAgIHJldHVybiBNZXRlb3IuY2FsbChcIm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyXCIsIFNlc3Npb24uZ2V0KFwiYm94XCIpLCBTZXNzaW9uLmdldChcImZsb3dJZFwiKSwgZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICAgIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyKFNlc3Npb24uZ2V0KFwiYm94XCIpLCBTZXNzaW9uLmdldChcImZsb3dJZFwiKSwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fY2hhbmdlT3JkZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuXG5uZXdJbnN0YW5jZXNMaXN0VGFidWxhciA9IGZ1bmN0aW9uKGJveCwgZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIGZsb3csIGtleSwgcmVmLCByZWYxLCByZWYyO1xuICBpZiAoIWZpZWxkcykge1xuICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgIF9pZDogZmxvd0lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGZvcm06IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmaWVsZHMgPSAocmVmID0gZGIuZm9ybXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZsb3cgIT0gbnVsbCA/IGZsb3cuZm9ybSA6IHZvaWQgMFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICAnY3VycmVudC5maWVsZHMnOiAxXG4gICAgICB9XG4gICAgfSkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5jdXJyZW50KSAhPSBudWxsID8gcmVmMS5maWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gIH1cbiAgZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMoZmllbGRzKTtcbiAgaWYgKChmaWVsZHMgIT0gbnVsbCA/IChyZWYyID0gZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfbGlzdF9kaXNwbGF5XCIsIHRydWUpKSAhPSBudWxsID8gcmVmMi5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgIGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWQ7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgVGFidWxhclRhYmxlcy5mbG93SW5zdGFuY2VzLnNldChuZXcgVGFidWxhci5UYWJsZShHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhib3gsIGZsb3dJZCwgZmllbGRzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXcgVGFidWxhci5UYWJsZShHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhib3gsIGZsb3dJZCwgZmllbGRzKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25zb2xlLmxvZyhcIm5ldyBUYWJ1bGFyVGFibGVzIFwiLCBrZXkpO1xuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5tZXRob2RzKHtcbiAgICBuZXdJbnN0YW5jZXNMaXN0VGFidWxhcjogZnVuY3Rpb24oYm94LCBmbG93SWQpIHtcbiAgICAgIHZhciBmaWVsZHMsIGZsb3csIHJlZiwgcmVmMTtcbiAgICAgIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyKGJveCwgZmxvd0lkKTtcbiAgICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBmbG93SWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgZm9ybTogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZpZWxkcyA9IChyZWYgPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBmbG93ICE9IG51bGwgPyBmbG93LmZvcm0gOiB2b2lkIDBcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgJ2N1cnJlbnQuZmllbGRzJzogMVxuICAgICAgICB9XG4gICAgICB9KSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmN1cnJlbnQpICE9IG51bGwgPyByZWYxLmZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== diff --git a/server/bundle/programs/server/packages/steedos_workflow.js.map b/server/bundle/programs/server/packages/steedos_workflow.js.map index ba2f4480e0..ad2ae87737 100644 --- a/server/bundle/programs/server/packages/steedos_workflow.js.map +++ b/server/bundle/programs/server/packages/steedos_workflow.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/steedos:workflow/checkNpm.js","meteor://💻app/packages/steedos:workflow/lib/URI.js","meteor://💻app/packages/steedos_workflow/lib/core.coffee","meteor://💻app/lib/core.coffee","meteor://💻app/packages/steedos_workflow/lib/models/instance_tasks.coffee","meteor://💻app/packages/steedos_workflow/lib/models/auth_tokens.coffee","meteor://💻app/packages/steedos_workflow/client/lib/instance_readonly_template.coffee","meteor://💻app/client/lib/instance_readonly_template.coffee","meteor://💻app/packages/steedos_workflow/client/lib/template_manager.coffee","meteor://💻app/client/lib/template_manager.coffee","meteor://💻app/packages/steedos:workflow/client/coreform/inputTypes/coreform-table/steedos-table.js","meteor://💻app/packages/steedos_workflow/client/views/instance/_image_sign.coffee","meteor://💻app/client/views/instance/_image_sign.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_traces_handler.coffee","meteor://💻app/client/views/instance/_traces_handler.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_instance_form.coffee","meteor://💻app/client/views/instance/_instance_form.coffee","meteor://💻app/packages/steedos:workflow/client/views/instance/_instance_attachments.js","meteor://💻app/packages/steedos_workflow/client/views/instance/_instance_sign_text.coffee","meteor://💻app/client/views/instance/_instance_sign_text.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_traces_help.coffee","meteor://💻app/client/views/instance/_traces_help.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_related_instances.coffee","meteor://💻app/client/views/instance/_related_instances.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_related_records.coffee","meteor://💻app/client/views/instance/_related_records.coffee","meteor://💻app/packages/steedos:workflow/routes/getSpaceUsers.js","meteor://💻app/packages/steedos:workflow/routes/getFormulaUserObjects.js","meteor://💻app/packages/steedos:workflow/routes/init_formula_values.js","meteor://💻app/packages/steedos:workflow/routes/api_workflow_forward.js","meteor://💻app/packages/steedos_workflow/routes/test_webhook.coffee","meteor://💻app/routes/test_webhook.coffee","meteor://💻app/packages/steedos_workflow/server/methods/set_instance_step_approve.coffee","meteor://💻app/packages/steedos:workflow/server/methods/get_instance_data.js","meteor://💻app/packages/steedos:workflow/server/methods/save_instance.js","meteor://💻app/packages/steedos:workflow/server/methods/trace_approve_cc.js","meteor://💻app/packages/steedos:workflow/server/methods/forward_instance.js","meteor://💻app/packages/steedos:workflow/server/methods/cfs_instances.js","meteor://💻app/packages/steedos_workflow/server/methods/instance_approve.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_return.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_remind.coffee","meteor://💻app/packages/steedos_workflow/server/methods/next_step_users_not_found.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_number_rules.coffee","meteor://💻app/packages/steedos_workflow/server/methods/check_main_attach.coffee","meteor://💻app/packages/steedos_workflow/server/methods/related_instances.coffee","meteor://💻app/packages/steedos_workflow/server/methods/edit_flow_positions.coffee","meteor://💻app/packages/steedos_workflow/server/methods/start_flow.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_traces.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_batch.coffee","meteor://💻app/packages/steedos_workflow/server/methods/flow.coffee","meteor://💻app/packages/steedos_workflow/server/methods/hide_instance.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_value.coffee","meteor://💻app/packages/steedos_workflow/server/routes/instance.coffee","meteor://💻app/server/routes/instance.coffee","meteor://💻app/packages/steedos_workflow/server/routes/steedos_css.coffee","meteor://💻app/server/routes/steedos_css.coffee","meteor://💻app/packages/steedos_workflow/server/routes/instance_draft_view.coffee","meteor://💻app/server/routes/instance_draft_view.coffee","meteor://💻app/packages/steedos:workflow/server/lib/1_form_formula.js","meteor://💻app/packages/steedos_workflow/server/publications/categories.coffee","meteor://💻app/server/publications/categories.coffee","meteor://💻app/packages/steedos_workflow/server/publications/cfs_instances.coffee","meteor://💻app/server/publications/cfs_instances.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_positions.coffee","meteor://💻app/server/publications/flow_positions.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_positions_tabular.coffee","meteor://💻app/server/publications/flow_positions_tabular.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_roles.coffee","meteor://💻app/server/publications/flow_roles.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flows.coffee","meteor://💻app/server/publications/flows.coffee","meteor://💻app/packages/steedos_workflow/server/publications/forms.coffee","meteor://💻app/server/publications/forms.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_data.coffee","meteor://💻app/server/publications/instance_data.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_list.coffee","meteor://💻app/server/publications/instance_list.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_tabular.coffee","meteor://💻app/server/publications/instance_tabular.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_draft.coffee","meteor://💻app/server/publications/instance_draft.coffee","meteor://💻app/packages/steedos_workflow/server/publications/distributed_instances_state_by_ids.coffee","meteor://💻app/server/publications/distributed_instances_state_by_ids.coffee","meteor://💻app/packages/steedos_workflow/server/publications/related_instaces.coffee","meteor://💻app/server/publications/related_instaces.coffee","meteor://💻app/packages/steedos_workflow/server/publications/space_user_signs.coffee","meteor://💻app/server/publications/space_user_signs.coffee","meteor://💻app/packages/steedos_workflow/server/publications/user_inbox_instance.coffee","meteor://💻app/server/publications/user_inbox_instance.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_main_attach_template.coffee","meteor://💻app/server/publications/flow_main_attach_template.coffee","meteor://💻app/packages/steedos_workflow/server/flow-template/workflow_template.coffee","meteor://💻app/server/flow-template/workflow_template.coffee","meteor://💻app/packages/steedos_workflow/server/schedule/auto_finish_process_delegation.coffee","meteor://💻app/server/schedule/auto_finish_process_delegation.coffee","meteor://💻app/packages/steedos_workflow/server/schedule/timeout_auto_submit.coffee","meteor://💻app/server/schedule/timeout_auto_submit.coffee","meteor://💻app/packages/steedos_workflow/related_instances_tabular.coffee","meteor://💻app/related_instances_tabular.coffee","meteor://💻app/packages/steedos_workflow/tabular.coffee","meteor://💻app/tabular.coffee"],"names":["checkNpmVersions","module","link","v","root","factory","define","amd","URI","punycode","IPv6","SecondLevelDomains","SLD","_URI","url","base","_urlSupplied","arguments","length","_baseSupplied","undefined","TypeError","location","href","absoluteTo","version","p","prototype","hasOwn","Object","hasOwnProperty","escapeRegEx","string","replace","getType","value","String","toString","call","slice","isArray","obj","filterArrayValues","data","lookup","i","_match","test","splice","arrayContains","list","_type","match","arraysEqual","one","two","sort","l","trimSlashes","text","trim_expression","_parts","protocol","username","password","hostname","urn","port","path","query","fragment","duplicateQueryParameters","escapeQuerySpace","protocol_expression","idn_expression","punycode_expression","ip4_expression","ip6_expression","find_uri_expression","findUri","start","end","trim","defaultPorts","http","https","ftp","gopher","ws","wss","invalid_hostname_characters","domAttributes","getDomAttribute","node","nodeName","toLowerCase","type","escapeForDumbFirefox36","escape","strictEncodeURIComponent","encodeURIComponent","encode","decode","decodeURIComponent","iso8859","unescape","unicode","characters","pathname","expression","map","reserved","urnpath","encodeQuery","escaped","decodeQuery","e","_part","generateAccessor","_group","c","generateSegmentedPathFunction","_sep","_codingFuncName","_innerCodingFuncName","actualCodingFunc","segments","split","join","decodePath","decodeUrnPath","recodePath","recodeUrnPath","encodeReserved","parse","parts","pos","indexOf","substring","parseAuthority","parseHost","bracketPos","t","charAt","firstColon","firstSlash","nextColon","parseUserinfo","lastIndexOf","shift","parseQuery","items","splits","name","push","build","buildAuthority","buildHost","buildUserinfo","buildQuery","unique","key","buildQueryParameter","addQuery","concat","removeQuery","hasQuery","withinArray","_booly","Boolean","op","commonPath","Math","min","withinString","callback","options","_start","_end","_trim","_attributeOpen","lastIndex","exec","index","ignoreHtml","attributeOpen","max","search","ignore","result","ensureValidHostname","toASCII","noConflict","removeAll","unconflicted","URITemplate","deferBuild","_deferred_build","_string","clone","valueOf","generateSimpleAccessor","generatePrefixAccessor","_key","hash","res","_object","attribute","src","is","what","ip","ip4","ip6","sld","idn","relative","has","_protocol","_port","_hostname","scheme","x","origin","authority","host","userinfo","resource","subdomain","domain","sub","RegExp","tld","get","ReferenceError","directory","filename","decodePathSegment","mutatedDirectory","normalizePath","suffix","s","segment","separator","absolute","Error","pop","unshift","segmentCoded","q","setQuery","setSearch","addSearch","removeSearch","hasSearch","normalize","normalizeProtocol","normalizeQuery","normalizeFragment","normalizeHostname","normalizePort","best","_path","_was_relative","_leadingParents","_parent","_pos","normalizePathname","normalizeSearch","normalizeHash","d","readable","uri","toUnicode","qp","kv","resolved","properties","basedir","relativeTo","relativeParts","baseParts","common","relativePath","basePath","parents","equals","one_map","two_map","checked","one_query","two_query","Workflow","ImageSign","TracesHandler","TracesTemplate","InstanceformTemplate","InstanceAttachmentTemplate","InstanceSignText","RelatedInstances","RelatedRecords","InstanceMacro","context","TracesManager","isOpinionField_from_string","field_formula","includesOpinionField","form","form_version","_form_version","field_formulas","fields","Array","Meteor","isServer","uuflowManager","getFormVersion","db","forms","findOne","_id","form_versions","forEach","f","ref","console","log","f1","formula","_","some","helpers","instance_tasks","Collection","_simpleSchema","SimpleSchema","instance","trace","is_finished","user","user_name","handler","handler_name","handler_organization","handler_organization_name","handler_organization_fullname","start_date","Date","due_date","is_read","is_error","values","deadline","remind_date","reminded_count","Number","read_date","description","modified","modified_by","sign_show","judge","next_steps","finish_date","cost_time","space","instance_name","submitter","submitter_name","applicant","applicant_name","applicant_organization_name","submit_date","flow","flow_name","step","step_name","category_name","instance_state","distribute_from_instance","forward_from_instance","keywords","is_archived","category","auth_tokens","_getLocale","_getRequiredFields","_getStartStepEditableFields","_getStartStepRequiredFields","_getTemplateData","_getViewHtml","getLinkText","marked","require","InstanceReadOnlyTemplate","instance_attachment","afSelectUserRead","afFormGroupRead","afFormGroup","create","tempalteName","steedosData","template","templateCompiled","templateRenderFunction","SpacebarsCompiler","compile","isBody","eval","Template","Blaze","createInstanceSignText","instanceSignTextCompiled","instanceSignTextHtml","instanceSignTextRenderFunction","instanceSignText","createImageSign","imageSignCompiled","imageSignHtml","imageSignRenderFunction","imageSign","createTracesHanlder","tracesHanlderCompiled","tracesHanlderHtml","tracesHanlderRenderFunction","instance_traces_handler","init","item","label","detail_url","Steedos","absoluteUrl","getValue","field","locale","utcOffset","date","fieldOptions","hours","month","nameField","records","seconds","selectedOption","selectedOptions","splitedValues","t0","t1","uiSchema","year","n","itemSplits","encodeURI","error","is_multiselect","getProperty","fullname","TAPi18n","__","formatDate","formatTime","is_textarea","find","filter","is_percent","numberToPercentString","digits","numberToString","isClient","authRequest","JSON","stringify","async","objectFind","filters","fileName","filePreviewHtml","fileUrl","original","Creator","getObject","reference_to","NAME_FIELD_KEY","reference_to_field","getObjectNameFieldKey","getLabel","code","findPropertyByPK","getInstanceFormVersion","form_fields","current","where","historys","getFlowVersion","flow_version","flows","viewHtml","Assets","getText","ref1","toLocaleLowerCase","rev","is_required","steps","editableCode","startStep","keys","permissions","requiredFields","intersection","WorkflowManager","WorkflowManager_format","getAutoformSchemaValues","insname","ins_state","state","ins_final_decision","ins_code","ins_is_archived","ins_is_deleted","applicantContext","sessionUserId","editable","startStepEditableFields","passing","moment","format","getInstanceView","body","instanceCompiled","instanceRenderFunction","instanceTemplate","TemplateManager","getTemplate","templateName","instance_readonly_view","toHTMLWithData","getTracesView","traceCompiled","traceRenderFunction","tracesHtml","instance_style","trace_readonly_view","traces","getAttachmentView","attachmentCompiled","attachmentHtml","attachmentRenderFunction","attachments_readonly_view","getRelatedInstancesView","relatedInstancesCompiled","relatedInstancesHtml","relatedInstancesRenderFunction","related_instances_view","getRelatedRecordsView","relatedRecordsCompiled","relatedRecordsHtml","relatedRecordsRenderFunction","related_records_view","getOnLoadScript","form_script","getInstanceHtml","allCssLink","attachment","creatorService","cssHref","formDescription","formDescriptionHtml","html","ins_record_ids","instanceBoxStyle","jqHref","onLoadScript","openFileScript","related_instances","related_records","showTracesBtn","showTracesScript","traceCheck","width","settings","webservices","creator","record_ids","isMobile","showTrace","final_decision","showAttachments","isEmpty","tagger","styles","plugins","add_styles","formId","instance_title","pageTitle","pageTitleTrClass","val","CoreForm","pageTitleFieldName","handleTableTemplate","_export","table_fields","table_field","field_permission","pureCode","required","title_permission","removeSpecialCharacter","isOpinionField","tr_start","td_colspan","tr_end","includes","permission","_template","table","_templateHelps","steedos_instance","getInstance","atts","id","style","disabled","instanceId","form_types","ApproveManager","isReadOnly","steedos_form","innersubformContext","doc_values","Session","a","b","getAutoformSchema","instance_box_style","box","ins","print_template","instance_template","SteedosTable","checkItem","item_index","fieldObj","getField","fieldVal","getItemModalValue","sf_name","sfields","sf","InstanceManager","checkFormFieldValue","$","setTableItemValue","item_value","tableValue","getTableValue","getTableItemValue","removeTableItem","removed","setTableValue","getValidValue","validValue","handleData","instanceFields","getInstanceFields","getModalData","Form_formula","getFormulaFieldVariable","AutoForm","getFormValues","insertDoc","addItem","_item_value","getKeys","append","getTr","updateItem","tds","getRemoveTd","sfield","getTd","empty","runFormula","removeItem","hide","showModal","method","modalData","setTimeout","Modal","show","getCurrentDataForForm","ss","getFormSchema","schema","objectKeys","_makeGeneric","getThead","isObject","thead","trs","sf_length","wide_fields","filterProperty","is_wide","getTbody","sfieldsEditable","tbody","tr","td","td_value","getTDValue","view","CFDataManager","getFormulaSpaceUsers","u","getFormulaOrganizations","o","getFormulaOrganization","pluck","addInputType","valueOut","valueConverters","stringToStringArray","stringToNumber","stringToNumberArray","stringToBoolean","stringToBooleanArray","stringToDate","stringToDateArray","contextAdjust","maxlength","afTable","events","event","new_item_index","currentTarget","dataset","set","rendered","str","addItemTr","getCurrentStep","step_type","ccHasEditPermission","autorun","currentData","spaceUserSign","userId","space_user_signs","imageURL","sign","showSignImage","traceShowSignImage","objectUrl","object_name","record_id","app_id","getObjectUrl","unempty","unequals","include","ref2","ref3","getInstanceFlowVersion","approves","ref4","approve","judge_name","opinion_fields_code","sign_field_code","after_field","before_field","pre_fields","pre_wide_fields","sort_approve","order","p1","p2","_p1","_p2","getTime","_t","isTextarea","getCfClass","getTableThead","getTableBody","showLabel","templateData","getOpinionFieldStepsName","top_keywords","foo1","opinionFields","foo","json_formula","s1","error1","yijianlan","stepName","image_sign","only_cc_opinion","only_cc","default_description","only_handler","showCCOpinion","markDownToHtml","markDownString","Npm","Spacebars","SafeString","f_label","that","isSection","registerHelper","ins_attach_download_url","getPermissions","instanceformChangeEvent","preventDefault","openWindow","target","onCreated","compiled","instanceCustomTemplate","instanceView","renderFunction","View","instance_custom_template","onRendered","currentApprove","currentStep","formula_fields","instanceNumberFields","setInstanceFormApplicant","nextSteps","nextStepUsers","InstanceEvent","initEvents","getCurrentApprove","each","element","schemaKey","toastr","reason","getFieldValue","InstanceNumberRules","instanceNumberBuilder","trigger","run","showMainTitle","workflowMainAttachTitle","enabled_add_main_attachment","current_step","currentTrace","getCurrentTrace","main_attach_count","cfs","instances","count","distribute_main_attach_count","start_step","getStartStep","can_edit_main_attach","enabled_edit_normal_attachment","getFlow","upload_after_being_distributed","isCC","getCCStep","can_edit_normal_attach","main_attachment","main_attach","normal_attachments","selector","$ne","dfis","distribute_from_instances","$in","distribute_main","firstVersionMain","metadata","parent","attachmentUploadedAt","uploadedAt","firstVersion","sortBy","instanceIds","attachments_count","flow_files","files","isDraftAndFlowfilesExist","compact","attachments","$or","fetch","myApprove","myTrace","isInbox","defaultDescription","approve_sort","approvesGroup","approves_sorted","completed_date","hasNext","haveDescriptionApprove","is_completed","last","top_approves","union","top_approve","groupBy","handlerApproves","descriptionApproves","workflow","showBlankApproveDescription","_display","isMyApprove","myApproveDescription","approveId","now","isOpinionOfField","imageSignData","getLastSignApprove","getHandlerSignShowApproves","lastMyApproveDescription","showApprove","judge_description","is_approved","is_rejected","is_readed","addClass","dateFormat","getFullYear","getStepName","stepId","getInstanceStep","showDeleteButton","approved","from_user","isShowModificationButton","approve_admins","isShow","contains","isEditing","is_editing","isShowDescription","getApproveStatusIcon","approveJudge","autoSubmitted","approveStatusIcon","getApproveStatusText","approveStatusText","getApproveJudgeClass","isForward","showForwardDeleteButton","forward_instance","isDistribute","showDistributeDeleteButton","hasFlowAdminPermission","finishDateSchema","isAndroidOrIOS","autoform","optional","readonly","dateTimePickerOptions","ignoreReadonly","widgetPositioning","horizontal","finishDateValues","showTracesView","show_modal_traces_list","space_settings","getInstanceStateText","instance_id","getInstanceStateColor","cla","firstTrace","last_distribute_from","dis_info","$exists","created","created_by","UUflow_api","getNameForUser","users","from_user_name","isCCOrDistributeOrForwardTerminated","judgeTerminated","instanceExists","agentDescription","userName","traceName","traceId","handlerDoc","handlerId","users_can_read_cc_handler_detail_info","getContactInfoForUser","stopPropagation","calling","err","removeClass","success","allowMultiple","closest","target_user_id","openSafeObjectUrl","forward_space","forwardspace","forwardinstance","Tracker","afterFlush","on","scrollTop","finish_input","opinion_input","showRelatedInstaces","related_instaces","related_instace_url","isCordova","show_delete","showRelatedRecords","relatedRecordUrl","objcetName","ids","process","env","CREATOR_NODE_ENV","JsonRoutes","add","req","next","hashData","action","to_users","sendResult","stack","errors","errorMessage","message","workflowMethods","methods","set_instance_step_approve","ins_id","step_approve","stepsApprovesOptions","apply","set_instance_skip_steps","get_instance_data","formCached","flowCached","draft_save_instance","inbox_save_instance","cc_do","cc_user_ids","cc_read","cc_submit","cc_remove","batch_cancel_cc","approve_ids","cc_save","space_id","flow_id","hasSaveInstanceToAttachment","isForwardAttachments","selectedUsers","action_type","related","from_approve_id","forward_remove","trace_id","approve_id","cancelDistribute","cfs_instances_remove","file_id","cfs_instances_set_current","cfs_instances_lock","user_id","cfs_instances_unlock","download_space_instance_attachments_to_disk","spaceId","cfsRecordIds","set_approve_have_read","change_approve_info","update_approve_sign","sign_type","lastSignApprove","update_sign_show","objs","myApprove_id","instance_return","instance_remind","remind_users","remind_count","remind_deadline","action_types","next_step_users_not_found","deal_type","params","_eval","check_main_attach","remove_related","re_ins_id","update_instance_related","updateFlowPosition","updateFlowRole","start_flow","flowId","get_instance_traces","categoryId","flowIds","get_batch_instances","get_batch_instances_count","get_my_approves","change_flow_state","hide_instance","insId","is_hidden","getInstanceValues","Cookies","getInstanceReadOnly","_hasPermission","_locale","_parent_instances","dataBuf","hide_traces","spaceUserCount","getAPILoginUser","access_token","getUserIdFromAccessToken","spaces","space_users","hasInstancePermissions","_parent_id","_parent_ins","charset","Buffer","setHeader","statusCode","ret_sync_token","spaceUser","spaceUserOrganizations","sync_token","APIAuthenticationCheck","headers","isSpaceAdmin","organizations","canMonitor","canAdmin","$gt","$nin","inbox_uers","cc_users","outbox_users","skip","limit","copies","allCss","WebApp","getRefreshableAssets","css","rootUrl","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","ROOT_URL","endsWith","h","g","m","k","getEach","uniq","mixin","dest","handerUserObject","organization","hr","sort_no","mobile","work_phone","position","userRoles","roles","handerOrgObject","org","init_formula_values","autoFormDoc","approver","__values","tableFields","tableValues","formulaTableValues","__tableValues","tablefield","getFormulaUserObjects","getFormulaOrgObjects","getFormulaUserObject","publish","check","ready","categories","app","flow_positions","role","publishComposite","tableName","Match","Optional","unblock","children","flow_roles","createTemplateFormAndFlow","perms","company_id","distribute_optional_users","distribute_to_self","enable_amisform","versionId","handle","self","latest","observeChanges","changed","added","onStop","stop","flow_ids","distribute_end_notification","allow_select_step","amis_schema","getMiniInstance","getMyapproveModified","instance_fields_0","miniApproveFields","needChange","triggerChangeFields","triggerChangeFieldsValues","myApproveModifieds","_instanceId","_trace","changeFields","_change","_rev","_my_approve_modifieds","isEqual","getInstanceTraces","_insId","inbox_users","asyncLastFinishedApprove","lastFinishedApproveAggregate","instanceid","dataMap","operation","rawCollection","aggregate","toArray","doc","isFunction","wrapAsync","getMyApprove","getMyLastFinishedApprove","getStepCurrentName","notFinishedTraces","agent","stepCurrentName","$slice","myLastFinishedApprove","agent_user_name","my_finish_date","is_cc","cc_count","tabularName","instance_ids","related_instance_ids","_async_get_flow_instances_aggregate","_get_flow_instances_aggregate","_items","$match","$group","$sum","_changeData","_flowsData","_init","dataItem","flow_instance","observe","getCollection","workflowTemplate","startup","absolute_path_cn","absolute_path_us","filesList_cn","filesList_us","fs","mime","path_cn","path_us","readFileList","pathDir","filesList","readdirSync","stat","statSync","isDirectory","workflowTemplates","resolve","existsSync","file","readFileSync","go_next","rule","schedule","cron","auto_finish_process_delegation","scheduleJob","bindEnvironment","time","process_delegation_rules","update","enabled","end_time","$lte","$set","multi","timeEnd","timeout_auto_submit","timeoutAutoSubmit","TabularTables","related_instances_tabular","Tabular","Table","collection","columns","title","orderable","render","input","step_current_name","current_step_name","dom","lengthChange","extraFields","pageLength","info","searching","responsive","details","autoWidth","changeSelector","curSpaceUser","$and","admins","fl","extend","GetBoxInstancesTabularOptions","_get_inbox_instances_tabular_options","_get_outbox_instances_tabular_options","_handleListFields","instanceTasksListTableTabular","instancesListTableTabular","newInstancesListTabular","updateTabularTitle","subs","SubsManager","ins_fields","pub","onUnload","instance_list","_tableColumns","drawCallback","ellipsisLink","emptyTd","colSpan","isPad","perfectScrollbar","oInstance","attr","click","goPage","height","pages","ceil","fnRecordsDisplay","_iDisplayLength","DataTable","page","draw","blur","currentPage","keydown","keyCode","createdRow","row","dataIndex","FlowRouter","setAttribute","agent_view","cc_view","instanceNamePriorityClass","modifiedFromNow","modifiedString","priorityIcon","priorityIconClass","priorityValue","step_current_name_view","unread","momentReactiveFromNow","priority","visible","cc_tag","record_need","lengthMenu","space_user","pagingType","is_list_display","inbox_instances","outbox_instances","getSort","flowInstances","ReactiveVar","_changeOrder"],"mappings":"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,CAAL;;AAEA,QAAG1wB,QAAH;AACC,aAAOqE,OAAOsH,WAAP,CAAmB,WAAS8kB,UAAT,GAAoB,QAApB,GAA4BhZ,EAA/C,CAAP;AADD;AAGC,aAAO/L,QAAQC,WAAR,CAAoB,WAAS8kB,UAAT,GAAoB,QAApB,GAA4BhZ,EAAhD,CAAP;ACIE;AD9BJ;AAAA,CADD,C;;;;;;;;;;;;;;;;;;;;;;;AEAA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,K;;;;;;;;;;;AC/BA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,K;;;;;;;;;;;AC/BA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","file":"/packages/steedos_workflow.js","sourcesContent":["import { checkNpmVersions } from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\t\"node-schedule\": \"^1.3.1\",\n\t\"xml2js\": \"^0.4.19\",\n}, 'steedos:workflow');","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.17.0\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n * GPL v3 http://opensource.org/licenses/GPL-3.0\n *\n */\n(function (root, factory) {\n\t'use strict';\n\t// https://github.com/umdjs/umd/blob/master/returnExports.js\n\t// if (typeof exports === 'object') {\n\t// // Node\n\t// module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n\t// } else\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n\t}\n}(this, function (punycode, IPv6, SLD, root) {\n\t'use strict';\n\t/*global location, escape, unescape */\n\t// FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n\t/*jshint camelcase: false */\n\n\t// save current URI variable, if any\n\tvar _URI = root && root.URI;\n\n\tfunction URI(url, base) {\n\t\tvar _urlSupplied = arguments.length >= 1;\n\t\tvar _baseSupplied = arguments.length >= 2;\n\n\t\t// Allow instantiation without the 'new' keyword\n\t\tif (!(this instanceof URI)) {\n\t\t\tif (_urlSupplied) {\n\t\t\t\tif (_baseSupplied) {\n\t\t\t\t\treturn new URI(url, base);\n\t\t\t\t}\n\n\t\t\t\treturn new URI(url);\n\t\t\t}\n\n\t\t\treturn new URI();\n\t\t}\n\n\t\tif (url === undefined) {\n\t\t\tif (_urlSupplied) {\n\t\t\t\tthrow new TypeError('undefined is not a valid argument for URI');\n\t\t\t}\n\n\t\t\tif (typeof location !== 'undefined') {\n\t\t\t\turl = location.href + '';\n\t\t\t} else {\n\t\t\t\turl = '';\n\t\t\t}\n\t\t}\n\n\t\tthis.href(url);\n\n\t\t// resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n\t\tif (base !== undefined) {\n\t\t\treturn this.absoluteTo(base);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tURI.version = '1.17.0';\n\n\tvar p = URI.prototype;\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\n\tfunction escapeRegEx(string) {\n\t\t// https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n\t\treturn string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n\t}\n\n\tfunction getType(value) {\n\t\t// IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n\t\tif (value === undefined) {\n\t\t\treturn 'Undefined';\n\t\t}\n\n\t\treturn String(Object.prototype.toString.call(value)).slice(8, -1);\n\t}\n\n\tfunction isArray(obj) {\n\t\treturn getType(obj) === 'Array';\n\t}\n\n\tfunction filterArrayValues(data, value) {\n\t\tvar lookup = {};\n\t\tvar i, length;\n\n\t\tif (getType(value) === 'RegExp') {\n\t\t\tlookup = null;\n\t\t} else if (isArray(value)) {\n\t\t\tfor (i = 0, length = value.length; i < length; i++) {\n\t\t\t\tlookup[value[i]] = true;\n\t\t\t}\n\t\t} else {\n\t\t\tlookup[value] = true;\n\t\t}\n\n\t\tfor (i = 0, length = data.length; i < length; i++) {\n\t\t\t/*jshint laxbreak: true */\n\t\t\tvar _match = lookup && lookup[data[i]] !== undefined\n\t\t\t\t|| !lookup && value.test(data[i]);\n\t\t\t/*jshint laxbreak: false */\n\t\t\tif (_match) {\n\t\t\t\tdata.splice(i, 1);\n\t\t\t\tlength--;\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tfunction arrayContains(list, value) {\n\t\tvar i, length;\n\n\t\t// value may be string, number, array, regexp\n\t\tif (isArray(value)) {\n\t\t\t// Note: this can be optimized to O(n) (instead of current O(m * n))\n\t\t\tfor (i = 0, length = value.length; i < length; i++) {\n\t\t\t\tif (!arrayContains(list, value[i])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar _type = getType(value);\n\t\tfor (i = 0, length = list.length; i < length; i++) {\n\t\t\tif (_type === 'RegExp') {\n\t\t\t\tif (typeof list[i] === 'string' && list[i].match(value)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (list[i] === value) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction arraysEqual(one, two) {\n\t\tif (!isArray(one) || !isArray(two)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// arrays can't be equal if they have different amount of content\n\t\tif (one.length !== two.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tone.sort();\n\t\ttwo.sort();\n\n\t\tfor (var i = 0, l = one.length; i < l; i++) {\n\t\t\tif (one[i] !== two[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction trimSlashes(text) {\n\t\tvar trim_expression = /^\\/+|\\/+$/g;\n\t\treturn text.replace(trim_expression, '');\n\t}\n\n\tURI._parts = function() {\n\t\treturn {\n\t\t\tprotocol: null,\n\t\t\tusername: null,\n\t\t\tpassword: null,\n\t\t\thostname: null,\n\t\t\turn: null,\n\t\t\tport: null,\n\t\t\tpath: null,\n\t\t\tquery: null,\n\t\t\tfragment: null,\n\t\t\t// state\n\t\t\tduplicateQueryParameters: URI.duplicateQueryParameters,\n\t\t\tescapeQuerySpace: URI.escapeQuerySpace\n\t\t};\n\t};\n\t// state: allow duplicate query parameters (a=1&a=1)\n\tURI.duplicateQueryParameters = false;\n\t// state: replaces + with %20 (space in query strings)\n\tURI.escapeQuerySpace = true;\n\t// static properties\n\tURI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n\tURI.idn_expression = /[^a-z0-9\\.-]/i;\n\tURI.punycode_expression = /(xn--)/i;\n\t// well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n\tURI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n\t// credits to Rich Brown\n\t// source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n\t// specification: http://www.ietf.org/rfc/rfc4291.txt\n\tURI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n\t// expression used is \"gruber revised\" (@gruber v2) determined to be the\n\t// best solution in a regex-golf we did a couple of ages ago at\n\t// * http://mathiasbynens.be/demo/url-regex\n\t// * http://rodneyrehm.de/t/url-regex.html\n\tURI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n\tURI.findUri = {\n\t\t// valid \"scheme://\" or \"www.\"\n\t\tstart: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n\t\t// everything up to the next whitespace\n\t\tend: /[\\s\\r\\n]|$/,\n\t\t// trim trailing punctuation captured by end RegExp\n\t\ttrim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/\n\t};\n\t// http://www.iana.org/assignments/uri-schemes.html\n\t// http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n\tURI.defaultPorts = {\n\t\thttp: '80',\n\t\thttps: '443',\n\t\tftp: '21',\n\t\tgopher: '70',\n\t\tws: '80',\n\t\twss: '443'\n\t};\n\t// allowed hostname characters according to RFC 3986\n\t// ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n\t// I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -\n\tURI.invalid_hostname_characters = /[^a-zA-Z0-9\\.-]/;\n\t// map DOM Elements to their URI attribute\n\tURI.domAttributes = {\n\t\t'a': 'href',\n\t\t'blockquote': 'cite',\n\t\t'link': 'href',\n\t\t'base': 'href',\n\t\t'script': 'src',\n\t\t'form': 'action',\n\t\t'img': 'src',\n\t\t'area': 'href',\n\t\t'iframe': 'src',\n\t\t'embed': 'src',\n\t\t'source': 'src',\n\t\t'track': 'src',\n\t\t'input': 'src', // but only if type=\"image\"\n\t\t'audio': 'src',\n\t\t'video': 'src'\n\t};\n\tURI.getDomAttribute = function(node) {\n\t\tif (!node || !node.nodeName) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar nodeName = node.nodeName.toLowerCase();\n\t\t// should only expose src for type=\"image\"\n\t\tif (nodeName === 'input' && node.type !== 'image') {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn URI.domAttributes[nodeName];\n\t};\n\n\tfunction escapeForDumbFirefox36(value) {\n\t\t// https://github.com/medialize/URI.js/issues/91\n\t\treturn escape(value);\n\t}\n\n\t// encoding / decoding according to RFC3986\n\tfunction strictEncodeURIComponent(string) {\n\t\t// see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n\t\treturn encodeURIComponent(string)\n\t\t\t.replace(/[!'()*]/g, escapeForDumbFirefox36)\n\t\t\t.replace(/\\*/g, '%2A');\n\t}\n\tURI.encode = strictEncodeURIComponent;\n\tURI.decode = decodeURIComponent;\n\tURI.iso8859 = function() {\n\t\tURI.encode = escape;\n\t\tURI.decode = unescape;\n\t};\n\tURI.unicode = function() {\n\t\tURI.encode = strictEncodeURIComponent;\n\t\tURI.decode = decodeURIComponent;\n\t};\n\tURI.characters = {\n\t\tpathname: {\n\t\t\tencode: {\n\t\t\t\t// RFC3986 2.1: For consistency, URI producers and normalizers should\n\t\t\t\t// use uppercase hexadecimal digits for all percent-encodings.\n\t\t\t\texpression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t// -._~!'()*\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%26': '&',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '=',\n\t\t\t\t\t'%3A': ':',\n\t\t\t\t\t'%40': '@'\n\t\t\t\t}\n\t\t\t},\n\t\t\tdecode: {\n\t\t\t\texpression: /[\\/\\?#]/g,\n\t\t\t\tmap: {\n\t\t\t\t\t'/': '%2F',\n\t\t\t\t\t'?': '%3F',\n\t\t\t\t\t'#': '%23'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\treserved: {\n\t\t\tencode: {\n\t\t\t\t// RFC3986 2.1: For consistency, URI producers and normalizers should\n\t\t\t\t// use uppercase hexadecimal digits for all percent-encodings.\n\t\t\t\texpression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t// gen-delims\n\t\t\t\t\t'%3A': ':',\n\t\t\t\t\t'%2F': '/',\n\t\t\t\t\t'%3F': '?',\n\t\t\t\t\t'%23': '#',\n\t\t\t\t\t'%5B': '[',\n\t\t\t\t\t'%5D': ']',\n\t\t\t\t\t'%40': '@',\n\t\t\t\t\t// sub-delims\n\t\t\t\t\t'%21': '!',\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%26': '&',\n\t\t\t\t\t'%27': '\\'',\n\t\t\t\t\t'%28': '(',\n\t\t\t\t\t'%29': ')',\n\t\t\t\t\t'%2A': '*',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '='\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\turnpath: {\n\t\t\t// The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n\t\t\t// for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n\t\t\t// these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n\t\t\t// note that the colon character is not featured in the encoding map; this is because URI.js\n\t\t\t// gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n\t\t\t// should not appear unencoded in a segment itself.\n\t\t\t// See also the note above about RFC3986 and capitalalized hex digits.\n\t\t\tencode: {\n\t\t\t\texpression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t'%21': '!',\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%27': '\\'',\n\t\t\t\t\t'%28': '(',\n\t\t\t\t\t'%29': ')',\n\t\t\t\t\t'%2A': '*',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '=',\n\t\t\t\t\t'%40': '@'\n\t\t\t\t}\n\t\t\t},\n\t\t\t// These characters are the characters called out by RFC2141 as \"reserved\" characters that\n\t\t\t// should never appear in a URN, plus the colon character (see note above).\n\t\t\tdecode: {\n\t\t\t\texpression: /[\\/\\?#:]/g,\n\t\t\t\tmap: {\n\t\t\t\t\t'/': '%2F',\n\t\t\t\t\t'?': '%3F',\n\t\t\t\t\t'#': '%23',\n\t\t\t\t\t':': '%3A'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tURI.encodeQuery = function(string, escapeQuerySpace) {\n\t\tvar escaped = URI.encode(string + '');\n\t\tif (escapeQuerySpace === undefined) {\n\t\t\tescapeQuerySpace = URI.escapeQuerySpace;\n\t\t}\n\n\t\treturn escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n\t};\n\tURI.decodeQuery = function(string, escapeQuerySpace) {\n\t\tstring += '';\n\t\tif (escapeQuerySpace === undefined) {\n\t\t\tescapeQuerySpace = URI.escapeQuerySpace;\n\t\t}\n\n\t\ttry {\n\t\t\treturn URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n\t\t} catch(e) {\n\t\t\t// we're not going to mess with weird encodings,\n\t\t\t// give up and return the undecoded original string\n\t\t\t// see https://github.com/medialize/URI.js/issues/87\n\t\t\t// see https://github.com/medialize/URI.js/issues/92\n\t\t\treturn string;\n\t\t}\n\t};\n\t// generate encode/decode path functions\n\tvar _parts = {'encode':'encode', 'decode':'decode'};\n\tvar _part;\n\tvar generateAccessor = function(_group, _part) {\n\t\treturn function(string) {\n\t\t\ttry {\n\t\t\t\treturn URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n\t\t\t\t\treturn URI.characters[_group][_part].map[c];\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\t// we're not going to mess with weird encodings,\n\t\t\t\t// give up and return the undecoded original string\n\t\t\t\t// see https://github.com/medialize/URI.js/issues/87\n\t\t\t\t// see https://github.com/medialize/URI.js/issues/92\n\t\t\t\treturn string;\n\t\t\t}\n\t\t};\n\t};\n\n\tfor (_part in _parts) {\n\t\tURI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n\t\tURI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n\t}\n\n\tvar generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n\t\treturn function(string) {\n\t\t\t// Why pass in names of functions, rather than the function objects themselves? The\n\t\t\t// definitions of some functions (but in particular, URI.decode) will occasionally change due\n\t\t\t// to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n\t\t\t// that the functions we use here are \"fresh\".\n\t\t\tvar actualCodingFunc;\n\t\t\tif (!_innerCodingFuncName) {\n\t\t\t\tactualCodingFunc = URI[_codingFuncName];\n\t\t\t} else {\n\t\t\t\tactualCodingFunc = function(string) {\n\t\t\t\t\treturn URI[_codingFuncName](URI[_innerCodingFuncName](string));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar segments = (string + '').split(_sep);\n\n\t\t\tfor (var i = 0, length = segments.length; i < length; i++) {\n\t\t\t\tsegments[i] = actualCodingFunc(segments[i]);\n\t\t\t}\n\n\t\t\treturn segments.join(_sep);\n\t\t};\n\t};\n\n\t// This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n\tURI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n\tURI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n\tURI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n\tURI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n\tURI.encodeReserved = generateAccessor('reserved', 'encode');\n\n\tURI.parse = function(string, parts) {\n\t\tvar pos;\n\t\tif (!parts) {\n\t\t\tparts = {};\n\t\t}\n\t\t// [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n\t\t// extract fragment\n\t\tpos = string.indexOf('#');\n\t\tif (pos > -1) {\n\t\t\t// escaping?\n\t\t\tparts.fragment = string.substring(pos + 1) || null;\n\t\t\tstring = string.substring(0, pos);\n\t\t}\n\n\t\t// extract query\n\t\tpos = string.indexOf('?');\n\t\tif (pos > -1) {\n\t\t\t// escaping?\n\t\t\tparts.query = string.substring(pos + 1) || null;\n\t\t\tstring = string.substring(0, pos);\n\t\t}\n\n\t\t// extract protocol\n\t\tif (string.substring(0, 2) === '//') {\n\t\t\t// relative-scheme\n\t\t\tparts.protocol = null;\n\t\t\tstring = string.substring(2);\n\t\t\t// extract \"user:pass@host:port\"\n\t\t\tstring = URI.parseAuthority(string, parts);\n\t\t} else {\n\t\t\tpos = string.indexOf(':');\n\t\t\tif (pos > -1) {\n\t\t\t\tparts.protocol = string.substring(0, pos) || null;\n\t\t\t\tif (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n\t\t\t\t\t// : may be within the path\n\t\t\t\t\tparts.protocol = undefined;\n\t\t\t\t} else if (string.substring(pos + 1, pos + 3) === '//') {\n\t\t\t\t\tstring = string.substring(pos + 3);\n\n\t\t\t\t\t// extract \"user:pass@host:port\"\n\t\t\t\t\tstring = URI.parseAuthority(string, parts);\n\t\t\t\t} else {\n\t\t\t\t\tstring = string.substring(pos + 1);\n\t\t\t\t\tparts.urn = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// what's left must be the path\n\t\tparts.path = string;\n\n\t\t// and we're done\n\t\treturn parts;\n\t};\n\tURI.parseHost = function(string, parts) {\n\t\t// Copy chrome, IE, opera backslash-handling behavior.\n\t\t// Back slashes before the query string get converted to forward slashes\n\t\t// See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n\t\t// See: https://code.google.com/p/chromium/issues/detail?id=25916\n\t\t// https://github.com/medialize/URI.js/pull/233\n\t\tstring = string.replace(/\\\\/g, '/');\n\n\t\t// extract host:port\n\t\tvar pos = string.indexOf('/');\n\t\tvar bracketPos;\n\t\tvar t;\n\n\t\tif (pos === -1) {\n\t\t\tpos = string.length;\n\t\t}\n\n\t\tif (string.charAt(0) === '[') {\n\t\t\t// IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n\t\t\t// I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n\t\t\t// IPv6+port in the format [2001:db8::1]:80 (for the time being)\n\t\t\tbracketPos = string.indexOf(']');\n\t\t\tparts.hostname = string.substring(1, bracketPos) || null;\n\t\t\tparts.port = string.substring(bracketPos + 2, pos) || null;\n\t\t\tif (parts.port === '/') {\n\t\t\t\tparts.port = null;\n\t\t\t}\n\t\t} else {\n\t\t\tvar firstColon = string.indexOf(':');\n\t\t\tvar firstSlash = string.indexOf('/');\n\t\t\tvar nextColon = string.indexOf(':', firstColon + 1);\n\t\t\tif (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n\t\t\t\t// IPv6 host contains multiple colons - but no port\n\t\t\t\t// this notation is actually not allowed by RFC 3986, but we're a liberal parser\n\t\t\t\tparts.hostname = string.substring(0, pos) || null;\n\t\t\t\tparts.port = null;\n\t\t\t} else {\n\t\t\t\tt = string.substring(0, pos).split(':');\n\t\t\t\tparts.hostname = t[0] || null;\n\t\t\t\tparts.port = t[1] || null;\n\t\t\t}\n\t\t}\n\n\t\tif (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n\t\t\tpos++;\n\t\t\tstring = '/' + string;\n\t\t}\n\n\t\treturn string.substring(pos) || '/';\n\t};\n\tURI.parseAuthority = function(string, parts) {\n\t\tstring = URI.parseUserinfo(string, parts);\n\t\treturn URI.parseHost(string, parts);\n\t};\n\tURI.parseUserinfo = function(string, parts) {\n\t\t// extract username:password\n\t\tvar firstSlash = string.indexOf('/');\n\t\tvar pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n\t\tvar t;\n\n\t\t// authority@ must come before /path\n\t\tif (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n\t\t\tt = string.substring(0, pos).split(':');\n\t\t\tparts.username = t[0] ? URI.decode(t[0]) : null;\n\t\t\tt.shift();\n\t\t\tparts.password = t[0] ? URI.decode(t.join(':')) : null;\n\t\t\tstring = string.substring(pos + 1);\n\t\t} else {\n\t\t\tparts.username = null;\n\t\t\tparts.password = null;\n\t\t}\n\n\t\treturn string;\n\t};\n\tURI.parseQuery = function(string, escapeQuerySpace) {\n\t\tif (!string) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n\t\tstring = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n\t\tif (!string) {\n\t\t\treturn {};\n\t\t}\n\n\t\tvar items = {};\n\t\tvar splits = string.split('&');\n\t\tvar length = splits.length;\n\t\tvar v, name, value;\n\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tv = splits[i].split('=');\n\t\t\tname = URI.decodeQuery(v.shift(), escapeQuerySpace);\n\t\t\t// no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n\t\t\tvalue = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n\t\t\tif (hasOwn.call(items, name)) {\n\t\t\t\tif (typeof items[name] === 'string' || items[name] === null) {\n\t\t\t\t\titems[name] = [items[name]];\n\t\t\t\t}\n\n\t\t\t\titems[name].push(value);\n\t\t\t} else {\n\t\t\t\titems[name] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t};\n\n\tURI.build = function(parts) {\n\t\tvar t = '';\n\n\t\tif (parts.protocol) {\n\t\t\tt += parts.protocol + ':';\n\t\t}\n\n\t\tif (!parts.urn && (t || parts.hostname)) {\n\t\t\tt += '//';\n\t\t}\n\n\t\tt += (URI.buildAuthority(parts) || '');\n\n\t\tif (typeof parts.path === 'string') {\n\t\t\tif (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n\t\t\t\tt += '/';\n\t\t\t}\n\n\t\t\tt += parts.path;\n\t\t}\n\n\t\tif (typeof parts.query === 'string' && parts.query) {\n\t\t\tt += '?' + parts.query;\n\t\t}\n\n\t\tif (typeof parts.fragment === 'string' && parts.fragment) {\n\t\t\tt += '#' + parts.fragment;\n\t\t}\n\t\treturn t;\n\t};\n\tURI.buildHost = function(parts) {\n\t\tvar t = '';\n\n\t\tif (!parts.hostname) {\n\t\t\treturn '';\n\t\t} else if (URI.ip6_expression.test(parts.hostname)) {\n\t\t\tt += '[' + parts.hostname + ']';\n\t\t} else {\n\t\t\tt += parts.hostname;\n\t\t}\n\n\t\tif (parts.port) {\n\t\t\tt += ':' + parts.port;\n\t\t}\n\n\t\treturn t;\n\t};\n\tURI.buildAuthority = function(parts) {\n\t\treturn URI.buildUserinfo(parts) + URI.buildHost(parts);\n\t};\n\tURI.buildUserinfo = function(parts) {\n\t\tvar t = '';\n\n\t\tif (parts.username) {\n\t\t\tt += URI.encode(parts.username);\n\n\t\t\tif (parts.password) {\n\t\t\t\tt += ':' + URI.encode(parts.password);\n\t\t\t}\n\n\t\t\tt += '@';\n\t\t}\n\n\t\treturn t;\n\t};\n\tURI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n\t\t// according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n\t\t// being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n\t\t// the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n\t\t// URI.js treats the query string as being application/x-www-form-urlencoded\n\t\t// see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n\t\tvar t = '';\n\t\tvar unique, key, i, length;\n\t\tfor (key in data) {\n\t\t\tif (hasOwn.call(data, key) && key) {\n\t\t\t\tif (isArray(data[key])) {\n\t\t\t\t\tunique = {};\n\t\t\t\t\tfor (i = 0, length = data[key].length; i < length; i++) {\n\t\t\t\t\t\tif (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n\t\t\t\t\t\t\tt += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n\t\t\t\t\t\t\tif (duplicateQueryParameters !== true) {\n\t\t\t\t\t\t\t\tunique[data[key][i] + ''] = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (data[key] !== undefined) {\n\t\t\t\t\tt += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn t.substring(1);\n\t};\n\tURI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n\t\t// http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n\t\t// don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n\t\treturn URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n\t};\n\n\tURI.addQuery = function(data, name, value) {\n\t\tif (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tURI.addQuery(data, key, name[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'string') {\n\t\t\tif (data[name] === undefined) {\n\t\t\t\tdata[name] = value;\n\t\t\t\treturn;\n\t\t\t} else if (typeof data[name] === 'string') {\n\t\t\t\tdata[name] = [data[name]];\n\t\t\t}\n\n\t\t\tif (!isArray(value)) {\n\t\t\t\tvalue = [value];\n\t\t\t}\n\n\t\t\tdata[name] = (data[name] || []).concat(value);\n\t\t} else {\n\t\t\tthrow new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n\t\t}\n\t};\n\tURI.removeQuery = function(data, name, value) {\n\t\tvar i, length, key;\n\n\t\tif (isArray(name)) {\n\t\t\tfor (i = 0, length = name.length; i < length; i++) {\n\t\t\t\tdata[name[i]] = undefined;\n\t\t\t}\n\t\t} else if (getType(name) === 'RegExp') {\n\t\t\tfor (key in data) {\n\t\t\t\tif (name.test(key)) {\n\t\t\t\t\tdata[key] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'object') {\n\t\t\tfor (key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tURI.removeQuery(data, key, name[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'string') {\n\t\t\tif (value !== undefined) {\n\t\t\t\tif (getType(value) === 'RegExp') {\n\t\t\t\t\tif (!isArray(data[name]) && value.test(data[name])) {\n\t\t\t\t\t\tdata[name] = undefined;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata[name] = filterArrayValues(data[name], value);\n\t\t\t\t\t}\n\t\t\t\t} else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n\t\t\t\t\tdata[name] = undefined;\n\t\t\t\t} else if (isArray(data[name])) {\n\t\t\t\t\tdata[name] = filterArrayValues(data[name], value);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdata[name] = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n\t\t}\n\t};\n\tURI.hasQuery = function(data, name, value, withinArray) {\n\t\tif (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tif (!URI.hasQuery(data, key, name[key])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} else if (typeof name !== 'string') {\n\t\t\tthrow new TypeError('URI.hasQuery() accepts an object, string as the name parameter');\n\t\t}\n\n\t\tswitch (getType(value)) {\n\t\t\tcase 'Undefined':\n\t\t\t\t// true if exists (but may be empty)\n\t\t\t\treturn name in data; // data[name] !== undefined;\n\n\t\t\tcase 'Boolean':\n\t\t\t\t// true if exists and non-empty\n\t\t\t\tvar _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n\t\t\t\treturn value === _booly;\n\n\t\t\tcase 'Function':\n\t\t\t\t// allow complex comparison\n\t\t\t\treturn !!value(data[name], name, data);\n\n\t\t\tcase 'Array':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar op = withinArray ? arrayContains : arraysEqual;\n\t\t\t\treturn op(data[name], value);\n\n\t\t\tcase 'RegExp':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn Boolean(data[name] && data[name].match(value));\n\t\t\t\t}\n\n\t\t\t\tif (!withinArray) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn arrayContains(data[name], value);\n\n\t\t\tcase 'Number':\n\t\t\t\tvalue = String(value);\n\t\t\t/* falls through */\n\t\t\tcase 'String':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn data[name] === value;\n\t\t\t\t}\n\n\t\t\t\tif (!withinArray) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn arrayContains(data[name], value);\n\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n\t\t}\n\t};\n\n\n\tURI.commonPath = function(one, two) {\n\t\tvar length = Math.min(one.length, two.length);\n\t\tvar pos;\n\n\t\t// find first non-matching character\n\t\tfor (pos = 0; pos < length; pos++) {\n\t\t\tif (one.charAt(pos) !== two.charAt(pos)) {\n\t\t\t\tpos--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (pos < 1) {\n\t\t\treturn one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n\t\t}\n\n\t\t// revert to last /\n\t\tif (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n\t\t\tpos = one.substring(0, pos).lastIndexOf('/');\n\t\t}\n\n\t\treturn one.substring(0, pos + 1);\n\t};\n\n\tURI.withinString = function(string, callback, options) {\n\t\toptions || (options = {});\n\t\tvar _start = options.start || URI.findUri.start;\n\t\tvar _end = options.end || URI.findUri.end;\n\t\tvar _trim = options.trim || URI.findUri.trim;\n\t\tvar _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n\t\t_start.lastIndex = 0;\n\t\twhile (true) {\n\t\t\tvar match = _start.exec(string);\n\t\t\tif (!match) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar start = match.index;\n\t\t\tif (options.ignoreHtml) {\n\t\t\t\t// attribut(e=[\"']?$)\n\t\t\t\tvar attributeOpen = string.slice(Math.max(start - 3, 0), start);\n\t\t\t\tif (attributeOpen && _attributeOpen.test(attributeOpen)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar end = start + string.slice(start).search(_end);\n\t\t\tvar slice = string.slice(start, end).replace(_trim, '');\n\t\t\tif (options.ignore && options.ignore.test(slice)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tend = start + slice.length;\n\t\t\tvar result = callback(slice, start, end, string);\n\t\t\tstring = string.slice(0, start) + result + string.slice(end);\n\t\t\t_start.lastIndex = start + result.length;\n\t\t}\n\n\t\t_start.lastIndex = 0;\n\t\treturn string;\n\t};\n\n\tURI.ensureValidHostname = function(v) {\n\t\t// Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n\t\t// they are not part of DNS and therefore ignored by URI.js\n\n\t\tif (v.match(URI.invalid_hostname_characters)) {\n\t\t\t// test punycode\n\t\t\tif (!punycode) {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');\n\t\t\t}\n\n\t\t\tif (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\t\t}\n\t};\n\n\t// noConflict\n\tURI.noConflict = function(removeAll) {\n\t\tif (removeAll) {\n\t\t\tvar unconflicted = {\n\t\t\t\tURI: this.noConflict()\n\t\t\t};\n\n\t\t\tif (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n\t\t\t\tunconflicted.URITemplate = root.URITemplate.noConflict();\n\t\t\t}\n\n\t\t\tif (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n\t\t\t\tunconflicted.IPv6 = root.IPv6.noConflict();\n\t\t\t}\n\n\t\t\tif (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n\t\t\t\tunconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n\t\t\t}\n\n\t\t\treturn unconflicted;\n\t\t} else if (root.URI === this) {\n\t\t\troot.URI = _URI;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tp.build = function(deferBuild) {\n\t\tif (deferBuild === true) {\n\t\t\tthis._deferred_build = true;\n\t\t} else if (deferBuild === undefined || this._deferred_build) {\n\t\t\tthis._string = URI.build(this._parts);\n\t\t\tthis._deferred_build = false;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tp.clone = function() {\n\t\treturn new URI(this);\n\t};\n\n\tp.valueOf = p.toString = function() {\n\t\treturn this.build(false)._string;\n\t};\n\n\n\tfunction generateSimpleAccessor(_part){\n\t\treturn function(v, build) {\n\t\t\tif (v === undefined) {\n\t\t\t\treturn this._parts[_part] || '';\n\t\t\t} else {\n\t\t\t\tthis._parts[_part] = v || null;\n\t\t\t\tthis.build(!build);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction generatePrefixAccessor(_part, _key){\n\t\treturn function(v, build) {\n\t\t\tif (v === undefined) {\n\t\t\t\treturn this._parts[_part] || '';\n\t\t\t} else {\n\t\t\t\tif (v !== null) {\n\t\t\t\t\tv = v + '';\n\t\t\t\t\tif (v.charAt(0) === _key) {\n\t\t\t\t\t\tv = v.substring(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._parts[_part] = v;\n\t\t\t\tthis.build(!build);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t};\n\t}\n\n\tp.protocol = generateSimpleAccessor('protocol');\n\tp.username = generateSimpleAccessor('username');\n\tp.password = generateSimpleAccessor('password');\n\tp.hostname = generateSimpleAccessor('hostname');\n\tp.port = generateSimpleAccessor('port');\n\tp.query = generatePrefixAccessor('query', '?');\n\tp.fragment = generatePrefixAccessor('fragment', '#');\n\n\tp.search = function(v, build) {\n\t\tvar t = this.query(v, build);\n\t\treturn typeof t === 'string' && t.length ? ('?' + t) : t;\n\t};\n\tp.hash = function(v, build) {\n\t\tvar t = this.fragment(v, build);\n\t\treturn typeof t === 'string' && t.length ? ('#' + t) : t;\n\t};\n\n\tp.pathname = function(v, build) {\n\t\tif (v === undefined || v === true) {\n\t\t\tvar res = this._parts.path || (this._parts.hostname ? '/' : '');\n\t\t\treturn v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n\t\t} else {\n\t\t\tif (this._parts.urn) {\n\t\t\t\tthis._parts.path = v ? URI.recodeUrnPath(v) : '';\n\t\t\t} else {\n\t\t\t\tthis._parts.path = v ? URI.recodePath(v) : '/';\n\t\t\t}\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.path = p.pathname;\n\tp.href = function(href, build) {\n\t\tvar key;\n\n\t\tif (href === undefined) {\n\t\t\treturn this.toString();\n\t\t}\n\n\t\tthis._string = '';\n\t\tthis._parts = URI._parts();\n\n\t\tvar _URI = href instanceof URI;\n\t\tvar _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n\t\tif (href.nodeName) {\n\t\t\tvar attribute = URI.getDomAttribute(href);\n\t\t\thref = href[attribute] || '';\n\t\t\t_object = false;\n\t\t}\n\n\t\t// window.location is reported to be an object, but it's not the sort\n\t\t// of object we're looking for:\n\t\t// * location.protocol ends with a colon\n\t\t// * location.query != object.search\n\t\t// * location.hash != object.fragment\n\t\t// simply serializing the unknown object should do the trick\n\t\t// (for location, not for everything...)\n\t\tif (!_URI && _object && href.pathname !== undefined) {\n\t\t\thref = href.toString();\n\t\t}\n\n\t\tif (typeof href === 'string' || href instanceof String) {\n\t\t\tthis._parts = URI.parse(String(href), this._parts);\n\t\t} else if (_URI || _object) {\n\t\t\tvar src = _URI ? href._parts : href;\n\t\t\tfor (key in src) {\n\t\t\t\tif (hasOwn.call(this._parts, key)) {\n\t\t\t\t\tthis._parts[key] = src[key];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('invalid input');\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\n\t// identification accessors\n\tp.is = function(what) {\n\t\tvar ip = false;\n\t\tvar ip4 = false;\n\t\tvar ip6 = false;\n\t\tvar name = false;\n\t\tvar sld = false;\n\t\tvar idn = false;\n\t\tvar punycode = false;\n\t\tvar relative = !this._parts.urn;\n\n\t\tif (this._parts.hostname) {\n\t\t\trelative = false;\n\t\t\tip4 = URI.ip4_expression.test(this._parts.hostname);\n\t\t\tip6 = URI.ip6_expression.test(this._parts.hostname);\n\t\t\tip = ip4 || ip6;\n\t\t\tname = !ip;\n\t\t\tsld = name && SLD && SLD.has(this._parts.hostname);\n\t\t\tidn = name && URI.idn_expression.test(this._parts.hostname);\n\t\t\tpunycode = name && URI.punycode_expression.test(this._parts.hostname);\n\t\t}\n\n\t\tswitch (what.toLowerCase()) {\n\t\t\tcase 'relative':\n\t\t\t\treturn relative;\n\n\t\t\tcase 'absolute':\n\t\t\t\treturn !relative;\n\n\t\t\t// hostname identification\n\t\t\tcase 'domain':\n\t\t\tcase 'name':\n\t\t\t\treturn name;\n\n\t\t\tcase 'sld':\n\t\t\t\treturn sld;\n\n\t\t\tcase 'ip':\n\t\t\t\treturn ip;\n\n\t\t\tcase 'ip4':\n\t\t\tcase 'ipv4':\n\t\t\tcase 'inet4':\n\t\t\t\treturn ip4;\n\n\t\t\tcase 'ip6':\n\t\t\tcase 'ipv6':\n\t\t\tcase 'inet6':\n\t\t\t\treturn ip6;\n\n\t\t\tcase 'idn':\n\t\t\t\treturn idn;\n\n\t\t\tcase 'url':\n\t\t\t\treturn !this._parts.urn;\n\n\t\t\tcase 'urn':\n\t\t\t\treturn !!this._parts.urn;\n\n\t\t\tcase 'punycode':\n\t\t\t\treturn punycode;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\t// component specific input validation\n\tvar _protocol = p.protocol;\n\tvar _port = p.port;\n\tvar _hostname = p.hostname;\n\n\tp.protocol = function(v, build) {\n\t\tif (v !== undefined) {\n\t\t\tif (v) {\n\t\t\t\t// accept trailing ://\n\t\t\t\tv = v.replace(/:(\\/\\/)?$/, '');\n\n\t\t\t\tif (!v.match(URI.protocol_expression)) {\n\t\t\t\t\tthrow new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _protocol.call(this, v, build);\n\t};\n\tp.scheme = p.protocol;\n\tp.port = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v !== undefined) {\n\t\t\tif (v === 0) {\n\t\t\t\tv = null;\n\t\t\t}\n\n\t\t\tif (v) {\n\t\t\t\tv += '';\n\t\t\t\tif (v.charAt(0) === ':') {\n\t\t\t\t\tv = v.substring(1);\n\t\t\t\t}\n\n\t\t\t\tif (v.match(/[^0-9]/)) {\n\t\t\t\t\tthrow new TypeError('Port \"' + v + '\" contains characters other than [0-9]');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _port.call(this, v, build);\n\t};\n\tp.hostname = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v !== undefined) {\n\t\t\tvar x = {};\n\t\t\tvar res = URI.parseHost(v, x);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tv = x.hostname;\n\t\t}\n\t\treturn _hostname.call(this, v, build);\n\t};\n\n\t// compound accessors\n\tp.origin = function(v, build) {\n\t\tvar parts;\n\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tvar protocol = this.protocol();\n\t\t\tvar authority = this.authority();\n\t\t\tif (!authority) return '';\n\t\t\treturn (protocol ? protocol + '://' : '') + this.authority();\n\t\t} else {\n\t\t\tvar origin = URI(v);\n\t\t\tthis\n\t\t\t\t.protocol(origin.protocol())\n\t\t\t\t.authority(origin.authority())\n\t\t\t\t.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.host = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\treturn this._parts.hostname ? URI.buildHost(this._parts) : '';\n\t\t} else {\n\t\t\tvar res = URI.parseHost(v, this._parts);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.authority = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\treturn this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n\t\t} else {\n\t\t\tvar res = URI.parseAuthority(v, this._parts);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.userinfo = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.username) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar t = URI.buildUserinfo(this._parts);\n\t\t\treturn t.substring(0, t.length -1);\n\t\t} else {\n\t\t\tif (v[v.length-1] !== '@') {\n\t\t\t\tv += '@';\n\t\t\t}\n\n\t\t\tURI.parseUserinfo(v, this._parts);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.resource = function(v, build) {\n\t\tvar parts;\n\n\t\tif (v === undefined) {\n\t\t\treturn this.path() + this.search() + this.hash();\n\t\t}\n\n\t\tparts = URI.parse(v);\n\t\tthis._parts.path = parts.path;\n\t\tthis._parts.query = parts.query;\n\t\tthis._parts.fragment = parts.fragment;\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\n\t// fraction accessors\n\tp.subdomain = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\t// convenience, return \"www\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// grab domain and add another segment\n\t\t\tvar end = this._parts.hostname.length - this.domain().length - 1;\n\t\t\treturn this._parts.hostname.substring(0, end) || '';\n\t\t} else {\n\t\t\tvar e = this._parts.hostname.length - this.domain().length;\n\t\t\tvar sub = this._parts.hostname.substring(0, e);\n\t\t\tvar replace = new RegExp('^' + escapeRegEx(sub));\n\n\t\t\tif (v && v.charAt(v.length - 1) !== '.') {\n\t\t\t\tv += '.';\n\t\t\t}\n\n\t\t\tif (v) {\n\t\t\t\tURI.ensureValidHostname(v);\n\t\t\t}\n\n\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.domain = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (typeof v === 'boolean') {\n\t\t\tbuild = v;\n\t\t\tv = undefined;\n\t\t}\n\n\t\t// convenience, return \"example.org\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// if hostname consists of 1 or 2 segments, it must be the domain\n\t\t\tvar t = this._parts.hostname.match(/\\./g);\n\t\t\tif (t && t.length < 2) {\n\t\t\t\treturn this._parts.hostname;\n\t\t\t}\n\n\t\t\t// grab tld and add another segment\n\t\t\tvar end = this._parts.hostname.length - this.tld(build).length - 1;\n\t\t\tend = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n\t\t\treturn this._parts.hostname.substring(end) || '';\n\t\t} else {\n\t\t\tif (!v) {\n\t\t\t\tthrow new TypeError('cannot set domain empty');\n\t\t\t}\n\n\t\t\tURI.ensureValidHostname(v);\n\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\tthis._parts.hostname = v;\n\t\t\t} else {\n\t\t\t\tvar replace = new RegExp(escapeRegEx(this.domain()) + '$');\n\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.tld = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (typeof v === 'boolean') {\n\t\t\tbuild = v;\n\t\t\tv = undefined;\n\t\t}\n\n\t\t// return \"org\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar pos = this._parts.hostname.lastIndexOf('.');\n\t\t\tvar tld = this._parts.hostname.substring(pos + 1);\n\n\t\t\tif (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n\t\t\t\treturn SLD.get(this._parts.hostname) || tld;\n\t\t\t}\n\n\t\t\treturn tld;\n\t\t} else {\n\t\t\tvar replace;\n\n\t\t\tif (!v) {\n\t\t\t\tthrow new TypeError('cannot set TLD empty');\n\t\t\t} else if (v.match(/[^a-zA-Z0-9-]/)) {\n\t\t\t\tif (SLD && SLD.is(v)) {\n\t\t\t\t\treplace = new RegExp(escapeRegEx(this.tld()) + '$');\n\t\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n\t\t\t\t}\n\t\t\t} else if (!this._parts.hostname || this.is('IP')) {\n\t\t\t\tthrow new ReferenceError('cannot set TLD on non-domain host');\n\t\t\t} else {\n\t\t\t\treplace = new RegExp(escapeRegEx(this.tld()) + '$');\n\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.directory = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path && !this._parts.hostname) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this._parts.path === '/') {\n\t\t\t\treturn '/';\n\t\t\t}\n\n\t\t\tvar end = this._parts.path.length - this.filename().length - 1;\n\t\t\tvar res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n\t\t\treturn v ? URI.decodePath(res) : res;\n\n\t\t} else {\n\t\t\tvar e = this._parts.path.length - this.filename().length;\n\t\t\tvar directory = this._parts.path.substring(0, e);\n\t\t\tvar replace = new RegExp('^' + escapeRegEx(directory));\n\n\t\t\t// fully qualifier directories begin with a slash\n\t\t\tif (!this.is('relative')) {\n\t\t\t\tif (!v) {\n\t\t\t\t\tv = '/';\n\t\t\t\t}\n\n\t\t\t\tif (v.charAt(0) !== '/') {\n\t\t\t\t\tv = '/' + v;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// directories always end with a slash\n\t\t\tif (v && v.charAt(v.length - 1) !== '/') {\n\t\t\t\tv += '/';\n\t\t\t}\n\n\t\t\tv = URI.recodePath(v);\n\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.filename = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path || this._parts.path === '/') {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar pos = this._parts.path.lastIndexOf('/');\n\t\t\tvar res = this._parts.path.substring(pos+1);\n\n\t\t\treturn v ? URI.decodePathSegment(res) : res;\n\t\t} else {\n\t\t\tvar mutatedDirectory = false;\n\n\t\t\tif (v.charAt(0) === '/') {\n\t\t\t\tv = v.substring(1);\n\t\t\t}\n\n\t\t\tif (v.match(/\\.?\\//)) {\n\t\t\t\tmutatedDirectory = true;\n\t\t\t}\n\n\t\t\tvar replace = new RegExp(escapeRegEx(this.filename()) + '$');\n\t\t\tv = URI.recodePath(v);\n\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\n\t\t\tif (mutatedDirectory) {\n\t\t\t\tthis.normalizePath(build);\n\t\t\t} else {\n\t\t\t\tthis.build(!build);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.suffix = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path || this._parts.path === '/') {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar filename = this.filename();\n\t\t\tvar pos = filename.lastIndexOf('.');\n\t\t\tvar s, res;\n\n\t\t\tif (pos === -1) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// suffix may only contain alnum characters (yup, I made this up.)\n\t\t\ts = filename.substring(pos+1);\n\t\t\tres = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n\t\t\treturn v ? URI.decodePathSegment(res) : res;\n\t\t} else {\n\t\t\tif (v.charAt(0) === '.') {\n\t\t\t\tv = v.substring(1);\n\t\t\t}\n\n\t\t\tvar suffix = this.suffix();\n\t\t\tvar replace;\n\n\t\t\tif (!suffix) {\n\t\t\t\tif (!v) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\tthis._parts.path += '.' + URI.recodePath(v);\n\t\t\t} else if (!v) {\n\t\t\t\treplace = new RegExp(escapeRegEx('.' + suffix) + '$');\n\t\t\t} else {\n\t\t\t\treplace = new RegExp(escapeRegEx(suffix) + '$');\n\t\t\t}\n\n\t\t\tif (replace) {\n\t\t\t\tv = URI.recodePath(v);\n\t\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.segment = function(segment, v, build) {\n\t\tvar separator = this._parts.urn ? ':' : '/';\n\t\tvar path = this.path();\n\t\tvar absolute = path.substring(0, 1) === '/';\n\t\tvar segments = path.split(separator);\n\n\t\tif (segment !== undefined && typeof segment !== 'number') {\n\t\t\tbuild = v;\n\t\t\tv = segment;\n\t\t\tsegment = undefined;\n\t\t}\n\n\t\tif (segment !== undefined && typeof segment !== 'number') {\n\t\t\tthrow new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n\t\t}\n\n\t\tif (absolute) {\n\t\t\tsegments.shift();\n\t\t}\n\n\t\tif (segment < 0) {\n\t\t\t// allow negative indexes to address from the end\n\t\t\tsegment = Math.max(segments.length + segment, 0);\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\t/*jshint laxbreak: true */\n\t\t\treturn segment === undefined\n\t\t\t\t? segments\n\t\t\t\t: segments[segment];\n\t\t\t/*jshint laxbreak: false */\n\t\t} else if (segment === null || segments[segment] === undefined) {\n\t\t\tif (isArray(v)) {\n\t\t\t\tsegments = [];\n\t\t\t\t// collapse empty elements within array\n\t\t\t\tfor (var i=0, l=v.length; i < l; i++) {\n\t\t\t\t\tif (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (segments.length && !segments[segments.length -1].length) {\n\t\t\t\t\t\tsegments.pop();\n\t\t\t\t\t}\n\n\t\t\t\t\tsegments.push(trimSlashes(v[i]));\n\t\t\t\t}\n\t\t\t} else if (v || typeof v === 'string') {\n\t\t\t\tv = trimSlashes(v);\n\t\t\t\tif (segments[segments.length -1] === '') {\n\t\t\t\t\t// empty trailing elements have to be overwritten\n\t\t\t\t\t// to prevent results such as /foo//bar\n\t\t\t\t\tsegments[segments.length -1] = v;\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(v);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (v) {\n\t\t\t\tsegments[segment] = trimSlashes(v);\n\t\t\t} else {\n\t\t\t\tsegments.splice(segment, 1);\n\t\t\t}\n\t\t}\n\n\t\tif (absolute) {\n\t\t\tsegments.unshift('');\n\t\t}\n\n\t\treturn this.path(segments.join(separator), build);\n\t};\n\tp.segmentCoded = function(segment, v, build) {\n\t\tvar segments, i, l;\n\n\t\tif (typeof segment !== 'number') {\n\t\t\tbuild = v;\n\t\t\tv = segment;\n\t\t\tsegment = undefined;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tsegments = this.segment(segment, v, build);\n\t\t\tif (!isArray(segments)) {\n\t\t\t\tsegments = segments !== undefined ? URI.decode(segments) : undefined;\n\t\t\t} else {\n\t\t\t\tfor (i = 0, l = segments.length; i < l; i++) {\n\t\t\t\t\tsegments[i] = URI.decode(segments[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn segments;\n\t\t}\n\n\t\tif (!isArray(v)) {\n\t\t\tv = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n\t\t} else {\n\t\t\tfor (i = 0, l = v.length; i < l; i++) {\n\t\t\t\tv[i] = URI.encode(v[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn this.segment(segment, v, build);\n\t};\n\n\t// mutating query string\n\tvar q = p.query;\n\tp.query = function(v, build) {\n\t\tif (v === true) {\n\t\t\treturn URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\t} else if (typeof v === 'function') {\n\t\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\t\tvar result = v.call(this, data);\n\t\t\tthis._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t} else if (v !== undefined && typeof v !== 'string') {\n\t\t\tthis._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t} else {\n\t\t\treturn q.call(this, v, build);\n\t\t}\n\t};\n\tp.setQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n\t\tif (typeof name === 'string' || name instanceof String) {\n\t\t\tdata[name] = value !== undefined ? value : null;\n\t\t} else if (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tdata[key] = name[key];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n\t\t}\n\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.addQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\tURI.addQuery(data, name, value === undefined ? null : value);\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.removeQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\tURI.removeQuery(data, name, value);\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.hasQuery = function(name, value, withinArray) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\treturn URI.hasQuery(data, name, value, withinArray);\n\t};\n\tp.setSearch = p.setQuery;\n\tp.addSearch = p.addQuery;\n\tp.removeSearch = p.removeQuery;\n\tp.hasSearch = p.hasQuery;\n\n\t// sanitizing URLs\n\tp.normalize = function() {\n\t\tif (this._parts.urn) {\n\t\t\treturn this\n\t\t\t\t.normalizeProtocol(false)\n\t\t\t\t.normalizePath(false)\n\t\t\t\t.normalizeQuery(false)\n\t\t\t\t.normalizeFragment(false)\n\t\t\t\t.build();\n\t\t}\n\n\t\treturn this\n\t\t\t.normalizeProtocol(false)\n\t\t\t.normalizeHostname(false)\n\t\t\t.normalizePort(false)\n\t\t\t.normalizePath(false)\n\t\t\t.normalizeQuery(false)\n\t\t\t.normalizeFragment(false)\n\t\t\t.build();\n\t};\n\tp.normalizeProtocol = function(build) {\n\t\tif (typeof this._parts.protocol === 'string') {\n\t\t\tthis._parts.protocol = this._parts.protocol.toLowerCase();\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeHostname = function(build) {\n\t\tif (this._parts.hostname) {\n\t\t\tif (this.is('IDN') && punycode) {\n\t\t\t\tthis._parts.hostname = punycode.toASCII(this._parts.hostname);\n\t\t\t} else if (this.is('IPv6') && IPv6) {\n\t\t\t\tthis._parts.hostname = IPv6.best(this._parts.hostname);\n\t\t\t}\n\n\t\t\tthis._parts.hostname = this._parts.hostname.toLowerCase();\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizePort = function(build) {\n\t\t// remove port of it's the protocol's default\n\t\tif (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n\t\t\tthis._parts.port = null;\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizePath = function(build) {\n\t\tvar _path = this._parts.path;\n\t\tif (!_path) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._parts.urn) {\n\t\t\tthis._parts.path = URI.recodeUrnPath(this._parts.path);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._parts.path === '/') {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar _was_relative;\n\t\tvar _leadingParents = '';\n\t\tvar _parent, _pos;\n\n\t\t// handle relative paths\n\t\tif (_path.charAt(0) !== '/') {\n\t\t\t_was_relative = true;\n\t\t\t_path = '/' + _path;\n\t\t}\n\n\t\t// handle relative files (as opposed to directories)\n\t\tif (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n\t\t\t_path += '/';\n\t\t}\n\n\t\t// resolve simples\n\t\t_path = _path\n\t\t\t.replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n\t\t\t.replace(/\\/{2,}/g, '/');\n\n\t\t// remember leading parents\n\t\tif (_was_relative) {\n\t\t\t_leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n\t\t\tif (_leadingParents) {\n\t\t\t\t_leadingParents = _leadingParents[0];\n\t\t\t}\n\t\t}\n\n\t\t// resolve parents\n\t\twhile (true) {\n\t\t\t_parent = _path.indexOf('/..');\n\t\t\tif (_parent === -1) {\n\t\t\t\t// no more ../ to resolve\n\t\t\t\tbreak;\n\t\t\t} else if (_parent === 0) {\n\t\t\t\t// top level cannot be relative, skip it\n\t\t\t\t_path = _path.substring(3);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t_pos = _path.substring(0, _parent).lastIndexOf('/');\n\t\t\tif (_pos === -1) {\n\t\t\t\t_pos = _parent;\n\t\t\t}\n\t\t\t_path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n\t\t}\n\n\t\t// revert to relative\n\t\tif (_was_relative && this.is('relative')) {\n\t\t\t_path = _leadingParents + _path.substring(1);\n\t\t}\n\n\t\t_path = URI.recodePath(_path);\n\t\tthis._parts.path = _path;\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.normalizePathname = p.normalizePath;\n\tp.normalizeQuery = function(build) {\n\t\tif (typeof this._parts.query === 'string') {\n\t\t\tif (!this._parts.query.length) {\n\t\t\t\tthis._parts.query = null;\n\t\t\t} else {\n\t\t\t\tthis.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeFragment = function(build) {\n\t\tif (!this._parts.fragment) {\n\t\t\tthis._parts.fragment = null;\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeSearch = p.normalizeQuery;\n\tp.normalizeHash = p.normalizeFragment;\n\n\tp.iso8859 = function() {\n\t\t// expect unicode input, iso8859 output\n\t\tvar e = URI.encode;\n\t\tvar d = URI.decode;\n\n\t\tURI.encode = escape;\n\t\tURI.decode = decodeURIComponent;\n\t\ttry {\n\t\t\tthis.normalize();\n\t\t} finally {\n\t\t\tURI.encode = e;\n\t\t\tURI.decode = d;\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.unicode = function() {\n\t\t// expect iso8859 input, unicode output\n\t\tvar e = URI.encode;\n\t\tvar d = URI.decode;\n\n\t\tURI.encode = strictEncodeURIComponent;\n\t\tURI.decode = unescape;\n\t\ttry {\n\t\t\tthis.normalize();\n\t\t} finally {\n\t\t\tURI.encode = e;\n\t\t\tURI.decode = d;\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.readable = function() {\n\t\tvar uri = this.clone();\n\t\t// removing username, password, because they shouldn't be displayed according to RFC 3986\n\t\turi.username('').password('').normalize();\n\t\tvar t = '';\n\t\tif (uri._parts.protocol) {\n\t\t\tt += uri._parts.protocol + '://';\n\t\t}\n\n\t\tif (uri._parts.hostname) {\n\t\t\tif (uri.is('punycode') && punycode) {\n\t\t\t\tt += punycode.toUnicode(uri._parts.hostname);\n\t\t\t\tif (uri._parts.port) {\n\t\t\t\t\tt += ':' + uri._parts.port;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tt += uri.host();\n\t\t\t}\n\t\t}\n\n\t\tif (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n\t\t\tt += '/';\n\t\t}\n\n\t\tt += uri.path(true);\n\t\tif (uri._parts.query) {\n\t\t\tvar q = '';\n\t\t\tfor (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n\t\t\t\tvar kv = (qp[i] || '').split('=');\n\t\t\t\tq += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n\t\t\t\t\t.replace(/&/g, '%26');\n\n\t\t\t\tif (kv[1] !== undefined) {\n\t\t\t\t\tq += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n\t\t\t\t\t\t.replace(/&/g, '%26');\n\t\t\t\t}\n\t\t\t}\n\t\t\tt += '?' + q.substring(1);\n\t\t}\n\n\t\tt += URI.decodeQuery(uri.hash(), true);\n\t\treturn t;\n\t};\n\n\t// resolving relative and absolute URLs\n\tp.absoluteTo = function(base) {\n\t\tvar resolved = this.clone();\n\t\tvar properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n\t\tvar basedir, i, p;\n\n\t\tif (this._parts.urn) {\n\t\t\tthrow new Error('URNs do not have any generally defined hierarchical components');\n\t\t}\n\n\t\tif (!(base instanceof URI)) {\n\t\t\tbase = new URI(base);\n\t\t}\n\n\t\tif (!resolved._parts.protocol) {\n\t\t\tresolved._parts.protocol = base._parts.protocol;\n\t\t}\n\n\t\tif (this._parts.hostname) {\n\t\t\treturn resolved;\n\t\t}\n\n\t\tfor (i = 0; (p = properties[i]); i++) {\n\t\t\tresolved._parts[p] = base._parts[p];\n\t\t}\n\n\t\tif (!resolved._parts.path) {\n\t\t\tresolved._parts.path = base._parts.path;\n\t\t\tif (!resolved._parts.query) {\n\t\t\t\tresolved._parts.query = base._parts.query;\n\t\t\t}\n\t\t} else if (resolved._parts.path.substring(-2) === '..') {\n\t\t\tresolved._parts.path += '/';\n\t\t}\n\n\t\tif (resolved.path().charAt(0) !== '/') {\n\t\t\tbasedir = base.directory();\n\t\t\tbasedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n\t\t\tresolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n\t\t\tresolved.normalizePath();\n\t\t}\n\n\t\tresolved.build();\n\t\treturn resolved;\n\t};\n\tp.relativeTo = function(base) {\n\t\tvar relative = this.clone().normalize();\n\t\tvar relativeParts, baseParts, common, relativePath, basePath;\n\n\t\tif (relative._parts.urn) {\n\t\t\tthrow new Error('URNs do not have any generally defined hierarchical components');\n\t\t}\n\n\t\tbase = new URI(base).normalize();\n\t\trelativeParts = relative._parts;\n\t\tbaseParts = base._parts;\n\t\trelativePath = relative.path();\n\t\tbasePath = base.path();\n\n\t\tif (relativePath.charAt(0) !== '/') {\n\t\t\tthrow new Error('URI is already relative');\n\t\t}\n\n\t\tif (basePath.charAt(0) !== '/') {\n\t\t\tthrow new Error('Cannot calculate a URI relative to another relative URI');\n\t\t}\n\n\t\tif (relativeParts.protocol === baseParts.protocol) {\n\t\t\trelativeParts.protocol = null;\n\t\t}\n\n\t\tif (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n\t\t\trelativeParts.hostname = null;\n\t\t\trelativeParts.port = null;\n\t\t} else {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativePath === basePath) {\n\t\t\trelativeParts.path = '';\n\t\t\treturn relative.build();\n\t\t}\n\n\t\t// determine common sub path\n\t\tcommon = URI.commonPath(relativePath, basePath);\n\n\t\t// If the paths have nothing in common, return a relative URL with the absolute path.\n\t\tif (!common) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tvar parents = baseParts.path\n\t\t\t.substring(common.length)\n\t\t\t.replace(/[^\\/]*$/, '')\n\t\t\t.replace(/.*?\\//g, '../');\n\n\t\trelativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n\t\treturn relative.build();\n\t};\n\n\t// comparing URIs\n\tp.equals = function(uri) {\n\t\tvar one = this.clone();\n\t\tvar two = new URI(uri);\n\t\tvar one_map = {};\n\t\tvar two_map = {};\n\t\tvar checked = {};\n\t\tvar one_query, two_query, key;\n\n\t\tone.normalize();\n\t\ttwo.normalize();\n\n\t\t// exact match\n\t\tif (one.toString() === two.toString()) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// extract query string\n\t\tone_query = one.query();\n\t\ttwo_query = two.query();\n\t\tone.query('');\n\t\ttwo.query('');\n\n\t\t// definitely not equal if not even non-query parts match\n\t\tif (one.toString() !== two.toString()) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// query parameters have the same length, even if they're permuted\n\t\tif (one_query.length !== two_query.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tone_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n\t\ttwo_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n\t\tfor (key in one_map) {\n\t\t\tif (hasOwn.call(one_map, key)) {\n\t\t\t\tif (!isArray(one_map[key])) {\n\t\t\t\t\tif (one_map[key] !== two_map[key]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (!arraysEqual(one_map[key], two_map[key])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tchecked[key] = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (key in two_map) {\n\t\t\tif (hasOwn.call(two_map, key)) {\n\t\t\t\tif (!checked[key]) {\n\t\t\t\t\t// two contains a parameter not present in one\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\n\t// state\n\tp.duplicateQueryParameters = function(v) {\n\t\tthis._parts.duplicateQueryParameters = !!v;\n\t\treturn this;\n\t};\n\n\tp.escapeQuerySpace = function(v) {\n\t\tthis._parts.escapeQuerySpace = !!v;\n\t\treturn this;\n\t};\n\n\treturn URI;\n}));","Workflow = {}\n\n@ImageSign = {};\n\n@TracesHandler = {};\n\n@TracesTemplate = {};\n\n@InstanceformTemplate = {};\n\n@InstanceAttachmentTemplate = {};\n\n@InstanceSignText = {}\n\n@RelatedInstances = {}\n\n@RelatedRecords = {}\n\n@InstanceMacro = {context: {}}\n\n@TracesManager = {};\n\nInstanceSignText.isOpinionField_from_string = (field_formula)->\n\treturn (field_formula?.indexOf(\"{traces.\") > -1 || field_formula?.indexOf(\"{signature.traces.\") > -1 || field_formula?.indexOf(\"{yijianlan:\") > -1 || field_formula?.indexOf(\"{\\\"yijianlan\\\":\") > -1 || field_formula?.indexOf(\"{'yijianlan':\") > -1)\n\nInstanceSignText.includesOpinionField = (form, form_version)->\n\tfield_formulas = new Array();\n\n\t_form_version = {}\n\n\tif Meteor.isServer\n\t\t_form_version = uuflowManager.getFormVersion(db.forms.findOne({_id: form}), form_version)\n\telse\n\t\t_form_version = db.form_versions.findOne({_id: form_version, form: form})\n\n\tfields = _form_version?.fields || []\n\n\tfields.forEach (f)->\n\t\tif f.type == 'table'\n\t\t\tconsole.log 'ignore opinion field in table'\n\t\telse if f.type == 'section'\n\t\t\tf?.fields?.forEach (f1)->\n\t\t\t\tfield_formulas.push f1.formula\n\t\telse\n\t\t\tfield_formulas.push f.formula\n\n\t_.some field_formulas, (field_formula)->\n\t\treturn InstanceformTemplate.helpers.isOpinionField_from_string(field_formula)\n\n"," \n\nWorkflow = {};\n\nthis.ImageSign = {};\n\nthis.TracesHandler = {};\n\nthis.TracesTemplate = {};\n\nthis.InstanceformTemplate = {};\n\nthis.InstanceAttachmentTemplate = {};\n\nthis.InstanceSignText = {};\n\nthis.RelatedInstances = {};\n\nthis.RelatedRecords = {};\n\nthis.InstanceMacro = {\n context: {}\n};\n\nthis.TracesManager = {};\n\nInstanceSignText.isOpinionField_from_string = function(field_formula) {\n return (field_formula != null ? field_formula.indexOf(\"{traces.\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{signature.traces.\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{yijianlan:\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{\\\"yijianlan\\\":\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{'yijianlan':\") : void 0) > -1;\n};\n\nInstanceSignText.includesOpinionField = function(form, form_version) {\n var _form_version, field_formulas, fields;\n field_formulas = new Array();\n _form_version = {};\n if (Meteor.isServer) {\n _form_version = uuflowManager.getFormVersion(db.forms.findOne({\n _id: form\n }), form_version);\n } else {\n _form_version = db.form_versions.findOne({\n _id: form_version,\n form: form\n });\n }\n fields = (_form_version != null ? _form_version.fields : void 0) || [];\n fields.forEach(function(f) {\n var ref;\n if (f.type === 'table') {\n return console.log('ignore opinion field in table');\n } else if (f.type === 'section') {\n return f != null ? (ref = f.fields) != null ? ref.forEach(function(f1) {\n return field_formulas.push(f1.formula);\n }) : void 0 : void 0;\n } else {\n return field_formulas.push(f.formula);\n }\n });\n return _.some(field_formulas, function(field_formula) {\n return InstanceformTemplate.helpers.isOpinionField_from_string(field_formula);\n });\n};\n","db.instance_tasks = new Meteor.Collection('instance_tasks')\n\ndb.instance_tasks._simpleSchema = new SimpleSchema\n instance:\n type: String\n trace:\n type: String\n is_finished:\n type: String\n user:\n type: String\n user_name:\n type: String\n handler:\n type: String\n handler_name:\n type: String\n handler_organization:\n type: String\n handler_organization_name:\n type: String\n handler_organization_fullname:\n type: String\n start_date:\n type: Date\n due_date:\n type: Date\n is_read:\n type: Boolean\n is_error:\n type: Boolean\n values:\n type: Object\n deadline:\n type: Date\n remind_date:\n type: Date\n reminded_count:\n type: Number\n read_date:\n type: Date\n description:\n type: String\n modified:\n type: Date\n modified_by:\n type: String\n sign_show:\n type: Boolean\n judge:\n type: String\n next_steps:\n type: Array\n \"next_steps.$\":\n type: Object\n \"next_steps.$.step\":\n type: String\n \"next_steps.$.users\":\n type: [String]\n finish_date:\n type: Date\n cost_time:\n type: Number\n space:\n type: String\n instance_name:\n type: String\n submitter:\n type: String\n submitter_name:\n type: String\n applicant:\n type: String\n applicant_name:\n type: String\n applicant_organization_name:\n type: String\n submit_date:\n type: Date\n flow:\n type: String\n flow_name:\n type: String\n form:\n type: String\n step:\n type: String\n step_name:\n type: String\n category_name:\n type: String\n instance_state:\n type: String\n distribute_from_instance:\n type: String\n forward_from_instance:\n type: String\n keywords:\n type: String\n is_archived:\n type: Boolean\n category:\n type: String\n","db.auth_tokens = new Meteor.Collection('auth_tokens')","marked = require(\"marked\")\n\nInstanceReadOnlyTemplate = {};\n\n\nInstanceReadOnlyTemplate.instance_attachment = \"\"\"\n\t\n\t\t\n\t\t\t{{this.name}}\n\t\t\n\t\n\"\"\"\n\nInstanceReadOnlyTemplate.afSelectUserRead = \"\"\"\n\t
{{value}}
\n\"\"\"\n\n\nInstanceReadOnlyTemplate.afFormGroupRead = \"\"\"\n\t
\n\t\t{{#with getField this.name}}\n\t\t\t{{#if equals type 'section'}}\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t

{{{description}}}

\n\t\t\t\t\t
\n\t\t\t{{else}}\n\t\t\t\t{{#if equals type 'table'}}\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{{{description}}}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{{{getTableThead this}}}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{{{getTableBody this}}}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t{{else}}\n\t\t\t\t\t{{#if showLabel}}\n\t\t\t\t\t\t\n\t\t\t\t\t{{/if}}\n\t\t\t\t\t{{#if isTextarea this}}\n\t\t\t\t\t\t

{{{getValue code}}}

\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t
{{{getValue code}}}
\n\t\t\t\t\t{{/if}}\n\t\t\t\t{{/if}}\n\t\t\t{{/if}}\n\t\t{{/with}}\n\t
\n\"\"\"\n\nInstanceReadOnlyTemplate.afFormGroup = \"\"\"\n\n\t{{#with getField this.name}}\n\t\t\t{{#if equals type 'section'}}\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t

{{{description}}}

\n\t\t\t\t\t
\n \t\t\t\t
\n\t\t\t{{else}}\n\t\t\t\t{{#if equals type 'table'}}\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{{{description}}}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{{{getTableThead this}}}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{{{getTableBody this}}}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t{{else}}\n\t\t\t\t\t{{#if equals type 'input'}}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{#if is_textarea}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t{{#unless is_textarea}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{/unless}}\n\t\t\t\t\t\t
\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t{{#if equals type 'number'}}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t{{#if equals type 'date'}}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t{{#if equals type 'dateTime'}}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t{{#if equals type 'password'}}\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t{{#if equals type 'select'}}\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'radio'}}\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#each options this}}\n \t\t\t\t\t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t\t\t\t\t{{/each}}\n \t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'multiSelect'}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#each options this}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{/each}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'url'}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'email'}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'checkbox'}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
{{{getValue code}}}
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t\t{{/if}}\n\t\t\t\t\t{{/if}}\n\t\t\t\t{{/if}}\n\t\t\t{{/if}}\n\t\t{{/with}}\n\"\"\"\n\nInstanceReadOnlyTemplate.create = (tempalteName, steedosData) ->\n\ttemplate = InstanceReadOnlyTemplate[tempalteName]\n\n\ttemplateCompiled = SpacebarsCompiler.compile(template, {isBody: true});\n\n\ttemplateRenderFunction = eval(templateCompiled);\n\n\tTemplate[tempalteName] = new Blaze.Template(tempalteName, templateRenderFunction);\n\tTemplate[tempalteName].steedosData = steedosData\n\tTemplate[tempalteName].helpers InstanceformTemplate.helpers\n\nInstanceReadOnlyTemplate.createInstanceSignText = (steedosData)->\n\tinstanceSignTextHtml = _getViewHtml('client/views/instance/instance_sign_text.html')\n\n\tinstanceSignTextCompiled = SpacebarsCompiler.compile(instanceSignTextHtml, {isBody: true});\n\n\tinstanceSignTextRenderFunction = eval(instanceSignTextCompiled);\n\n\tTemplate.instanceSignText = new Blaze.Template(\"instanceSignText\", instanceSignTextRenderFunction);\n\tTemplate.instanceSignText.steedosData = steedosData\n\tTemplate.instanceSignText.helpers InstanceSignText.helpers\n\nInstanceReadOnlyTemplate.createImageSign = (steedosData) ->\n\timageSignHtml = _getViewHtml('client/views/instance/image_sign.html')\n\timageSignCompiled = SpacebarsCompiler.compile(imageSignHtml, {isBody: true});\n\timageSignRenderFunction = eval(imageSignCompiled);\n\tTemplate.imageSign = new Blaze.Template(\"imageSign\", imageSignRenderFunction);\n\tTemplate.imageSign.steedosData = steedosData\n\tTemplate.imageSign.helpers ImageSign.helpers\n\nInstanceReadOnlyTemplate.createTracesHanlder = (steedosData) ->\n\ttracesHanlderHtml = _getViewHtml('client/views/instance/traces_handler.html')\n\ttracesHanlderCompiled = SpacebarsCompiler.compile(tracesHanlderHtml, {isBody: true});\n\ttracesHanlderRenderFunction = eval(tracesHanlderCompiled);\n\tTemplate.instance_traces_handler = new Blaze.Template(\"instance_traces_handler\", tracesHanlderRenderFunction);\n\tTemplate.instance_traces_handler.steedosData = steedosData\n\tTemplate.instance_traces_handler.helpers TracesHandler.helpers\n\n\nInstanceReadOnlyTemplate.init = (steedosData) ->\n\tInstanceReadOnlyTemplate.create(\"afSelectUserRead\", steedosData);\n\n\tif Meteor.isServer\n\t\tInstanceReadOnlyTemplate.create(\"afFormGroup\", steedosData);\n\n\tInstanceReadOnlyTemplate.create(\"afFormGroupRead\", steedosData);\n\tif Meteor.isServer\n\t\tInstanceReadOnlyTemplate.create(\"instance_attachment\", {absolute: steedosData.absolute});\n\t\tInstanceReadOnlyTemplate.createImageSign(steedosData)\n\t\tInstanceReadOnlyTemplate.createTracesHanlder(steedosData);\n\t\tInstanceReadOnlyTemplate.createInstanceSignText(steedosData)\n\ngetLinkText = (item, label, detail_url)->\n\tif detail_url\n\t\tdetail_url = detail_url.replace(\"{_id}\", item._id)\n\t\tif !/^http(s?):\\/\\//.test(detail_url)\n\t\t\tdetail_url = Steedos.absoluteUrl(detail_url)\n\t\treturn ''+label+'';\n\telse\n\t\treturn label\n\nInstanceReadOnlyTemplate.getValue = (value, field, locale, utcOffset) ->\n\tif !value && value != false\n\t\treturn ''\n\tif [\"select\", \"multiSelect\", \"radio\"].indexOf(field.type) > -1\n\t\tfieldOptions = field.options.split(\"\\n\").map (n)->\n\t\t\titemSplits = n.split(\":\")\n\t\t\treturn {\n\t\t\t\tlabel: itemSplits[0],\n\t\t\t\tvalue: itemSplits[1] || n\n\t\t\t}\n\tswitch field.type\n\t\twhen 'email'\n\t\t\tvalue = if value then '' + value + '' else ''\n\t\twhen 'url'\n\t\t\tif value\n\t\t\t\tif value.indexOf(\"http\") == 0\n\t\t\t\t\ttry\n\t\t\t\t\t\tvalue = \"\" + value + \"\";\n\t\t\t\t\tcatch e\n\t\t\t\t\t\tvalue = \"\" + value + \"\";\n\n\t\t\t\telse\n\t\t\t\t\tvalue = \"\" + value + \"\";\n\t\t\telse\n\t\t\t\tvalue = ''\n\t\twhen 'group'\n\t\t\tif field.is_multiselect\n\t\t\t\tvalue = value?.getProperty(\"fullname\").toString()\n\t\t\telse\n\t\t\t\tvalue = value?.fullname\n\t\twhen 'user'\n\t\t\tif field.is_multiselect\n\t\t\t\tvalue = value?.getProperty(\"name\").toString()\n\t\t\telse\n\t\t\t\tvalue = value?.name\n\t\twhen 'password'\n\t\t\tvalue = '******'\n\t\twhen 'checkbox'\n\t\t\tif value && value != 'false'\n\t\t\t\tvalue = TAPi18n.__(\"form_field_checkbox_yes\", {}, locale)\n\t\t\telse\n\t\t\t\tvalue = TAPi18n.__(\"form_field_checkbox_no\", {}, locale)\n\t\twhen 'dateTime'\n\t\t\tif value && value.length == 16\n\t\t\t\tt = value.split(\"T\")\n\t\t\t\tt0 = t[0].split(\"-\");\n\t\t\t\tt1 = t[1].split(\":\");\n\n\t\t\t\tyear = t0[0];\n\t\t\t\tmonth = t0[1];\n\t\t\t\tdate = t0[2];\n\t\t\t\thours = t1[0];\n\t\t\t\tseconds = t1[1];\n\n\t\t\t\tvalue = new Date(year, month - 1, date, hours, seconds)\n\t\t\telse\n\t\t\t\tvalue = new Date(value)\n\n\t\t\tvalue = InstanceReadOnlyTemplate.formatDate(value, utcOffset);\n\t\twhen 'time'\n\t\t\tif value && value.length == 16\n\t\t\t\tt = value.split(\"T\")\n\t\t\t\tt0 = t[0].split(\"-\");\n\t\t\t\tt1 = t[1].split(\":\");\n\n\t\t\t\tyear = t0[0];\n\t\t\t\tmonth = t0[1];\n\t\t\t\tdate = t0[2];\n\t\t\t\thours = t1[0];\n\t\t\t\tseconds = t1[1];\n\n\t\t\t\tvalue = new Date(year, month - 1, date, hours, seconds)\n\t\t\telse\n\t\t\t\tvalue = new Date(value)\n\n\t\t\tvalue = InstanceReadOnlyTemplate.formatTime(value);\n\t\twhen 'input'\n\t\t\tif field.is_textarea\n\t\t\t\tvalue = value\n\t\twhen 'select'\n\t\t\tselectedOption = fieldOptions.find((item) -> return item.value == value)\n\t\t\tif selectedOption\n\t\t\t\tvalue = selectedOption.label\n\t\twhen 'radio'\n\t\t\tselectedOption = fieldOptions.find((item) -> return item.value == value)\n\t\t\tif selectedOption\n\t\t\t\tvalue = selectedOption.label\n\t\twhen 'multiSelect'\n\t\t\tsplitedValues = value.split(\",\")\n\t\t\tselectedOptions = fieldOptions.filter((item) -> return splitedValues.indexOf(item.value) > -1)\n\t\t\tif selectedOptions.length\n\t\t\t\tvalue = selectedOptions.map((item) -> return item.label).join(\",\")\n\t\twhen 'number'\n\t\t\tif value or value == 0\n\t\t\t\tif field.is_percent\n\t\t\t\t\tvalue = Steedos.numberToPercentString value, field.digits\n\t\t\t\telse\n\t\t\t\t\tvalue = Steedos.numberToString value, field.digits\n\t\twhen 'odata'\n\t\t\tdetail_url = field.detail_url\n\t\t\tif field.is_multiselect\n\t\t\t\tvalue = _.map value, (item)->\n\t\t\t\t\treturn getLinkText(item, item['@label'], detail_url)\n\t\t\telse\n\t\t\t\tvalue = getLinkText(value, value['@label'], detail_url)\n\t\twhen 'image'\n\t\t\tif field.is_multiselect\n\t\t\t\tvalue = _.map value, (item)->\n\t\t\t\t\treturn '
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
'\n\t\t\t\tvalue = value.join(\"\");\n\t\t\telse\n\t\t\t\tvalue = '
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
'\n\t\twhen 'file'\n\t\t\tif value\n\t\t\t\tif !field.is_multiselect\n\t\t\t\t\tvalue = [value]\n\t\t\t\tif Meteor.isClient\n\t\t\t\t\tres = Steedos.authRequest('/api/v1/cfs_files_filerecord?filters=[[\"_id\",\"in\", '+JSON.stringify(value)+']]&fields=[\"_id\",\"original\"]', {async:false})\n\t\t\t\t\trecords = res.data.items\n\t\t\t\telse if Meteor.isServer\n\t\t\t\t\trecords = Steedos.objectFind(\"cfs_files_filerecord\", { filters: [[\"_id\", 'in', value]], fields: [\"_id\", \"original\"] });\n\n\t\t\t\tvalue = _.map records, (item)->\n\t\t\t\t\tfileName = item.original.name;\n\t\t\t\t\tfileUrl = Steedos.absoluteUrl('/api/files/files/'+item._id);\n\t\t\t\t\tfilePreviewHtml = '';\n\t\t\t\t\tif [\".pdf\", \".jpg\", \".jpeg\", \".png\", \".gif\"].indexOf(fileName.slice(-4)) > -1\n\t\t\t\t\t\tfilePreviewHtml = \" 预览\"\n\t\t\t\t\treturn \"
#{fileName} #{filePreviewHtml ? filePreviewHtml : ''}
\"\n\n\t\t\t\tvalue = value.join(\"\");\n\t\twhen 'lookup'\n\t\t\tif value\n\t\t\t\tif !field.is_multiselect\n\t\t\t\t\tvalue = [value]\n\t\t\t\tif Meteor.isClient\n\t\t\t\t\tuiSchema = Creator.getObject(field.reference_to)\n\t\t\t\t\tnameField = uiSchema?.NAME_FIELD_KEY || 'name'\n\t\t\t\t\tres = Steedos.authRequest('/api/v1/'+field.reference_to+'?filters=[[\"'+(field.reference_to_field || '_id')+'\",\"in\", '+JSON.stringify(value)+']]&fields=[\"_id\",\"'+nameField+'\"]', {async:false})\n\t\t\t\t\trecords = res.data.items\n\t\t\t\telse if Meteor.isServer\n\t\t\t\t\tnameField = Steedos.getObjectNameFieldKey(field.reference_to);\n\t\t\t\t\trecords = Steedos.objectFind(field.reference_to, { filters: [[(field.reference_to_field || '_id'), 'in', value]], fields: [\"_id\", nameField] });\n\t\t\t\tvalue = _.map records, (item)->\n\t\t\t\t\treturn \"#{item[nameField]}\"\n\n\t\t\t\tvalue = value.join(\" , \");\t\n\t\twhen 'html'\n\t\t\tvalue = if value then \"
#{value}
\" else ''\n\n\treturn value;\n\nInstanceReadOnlyTemplate.getLabel = (fields, code) ->\n\tfield = fields.findPropertyByPK(\"code\", code)\n\tif field\n\t\tif field.name\n\t\t\treturn field.name\n\t\telse\n\t\t\treturn field.code\n\n\nInstanceReadOnlyTemplate.getInstanceFormVersion = (instance)->\n\tform = db.forms.findOne(instance.form);\n\n\tform_version = {}\n\n\tform_fields = [];\n\n\tif form.current._id == instance.form_version\n\t\tform_version = form.current\n\telse\n\t\tform_version = _.where(form.historys, {_id: instance.form_version})[0]\n\n\tform_version.fields.forEach (field)->\n\t\tif field.type == 'section'\n\t\t\tform_fields.push(field);\n\t\t\tif field.fields\n\t\t\t\tfield.fields.forEach (f) ->\n\t\t\t\t\tform_fields.push(f);\n\t\telse if field.type == 'table'\n\t\t\tfield['sfields'] = field['fields']\n\t\t\tdelete field['fields']\n\t\t\tform_fields.push(field);\n\t\telse\n\t\t\tform_fields.push(field);\n\n\tform_version.fields = form_fields;\n\n\treturn form_version;\n\nInstanceReadOnlyTemplate.getFlowVersion = (instance)->\n\tflow = db.flows.findOne(instance.flow);\n\tflow_version = {}\n\tif flow.current._id == instance.flow_version\n\t\tflow_version = flow.current\n\telse\n\t\tflow_version = _.where(flow.historys, {_id: instance.flow_version})[0]\n\n\treturn flow_version;\n\n\n_getViewHtml = (path) ->\n\tviewHtml = Assets.getText(path)\n\n\tif viewHtml\n\t\tviewHtml = viewHtml.replace(//i,\"\").replace(/<\\/template>/i,\"\")\n\n\treturn viewHtml;\n\n_getLocale = (user)->\n\tif user?.locale?.toLocaleLowerCase() == 'zh-cn'\n\t\tlocale = \"zh-CN\"\n\telse if user?.locale?.toLocaleLowerCase() == 'en-us'\n\t\tlocale = \"en\"\n\telse\n\t\tlocale = \"zh-CN\"\n\treturn locale\n\n\n_getRequiredFields = (fields, rev)->\n\tif !rev\n\t\trev = [];\n\n\tfields.forEach (field)->\n\t\tif field.type == 'section'\n\t\t\t_getRequiredFields(field.fields, rev)\n\t\telse if field.type == 'table'\n\n\t\telse\n\t\t\tif field.is_required\n\t\t\t\trev.push field.code\n\treturn rev;\n\n_getStartStepEditableFields = (fields, steps)->\n\tstartStep = steps.findPropertyByPK(\"step_type\",\"start\")\n\n\teditableCode = []\n\n\t_.keys(startStep.permissions).forEach (key)->\n\t\tif startStep.permissions[key] == 'editable'\n\t\t\teditableCode.push key\n\n\treturn editableCode\n\n_getStartStepRequiredFields = (fields, steps)->\n\trequiredFields = _getRequiredFields(fields)\n\n\teditableCode = _getStartStepEditableFields(fields, steps)\n\n\treturn _.intersection(requiredFields, editableCode)\n\n_getTemplateData = (user, space, instance, options)->\n\tif Meteor.isServer\n\t\tform_version = InstanceReadOnlyTemplate.getInstanceFormVersion(instance)\n\telse\n\t\tform_version = WorkflowManager.getInstanceFormVersion(instance)\n\n\tlocale = _getLocale(user)\n\n\tsteedosData = {}\n\n\tif Meteor.isClient\n\t\tsteedosData = _.clone(WorkflowManager_format.getAutoformSchemaValues())\n\t\tsteedosData.insname = instance.name\n\t\tsteedosData.ins_state = instance.state\n\t\tsteedosData.ins_final_decision = instance.ins_final_decision\n\t\tsteedosData.ins_code = instance.code\n\t\tsteedosData.ins_is_archived = instance.is_archived\n\t\tsteedosData.ins_is_deleted = instance.ins_is_deleted\n\t\tsteedosData.applicant_name = instance.applicant_name\n\t\tsteedosData.applicantContext = instance.applicant_name\n\n\tsteedosData.instance = instance\n\tsteedosData.form_version = form_version\n\tsteedosData.locale = locale\n\tsteedosData.utcOffset = user.utcOffset\n\tsteedosData.space = instance.space\n\tsteedosData.sessionUserId = user._id\n\n\tif Meteor.isServer\n\t\tif options?.editable\n\t\t\tform = db.forms.findOne({_id: instance.form})\n\n\t\t\tflow = db.flows.findOne({_id: instance.flow})\n\n\t\t\tsteedosData.startStepEditableFields = _getStartStepEditableFields(form.current.fields, flow.current.steps);\n\n\treturn steedosData;\n\nInstanceReadOnlyTemplate.formatDate = (date, utcOffset)->\n\tif Meteor.isServer\n\t\tpassing = false;\n\telse\n\t\tpassing = true;\n\n\tif !utcOffset && utcOffset !=0\n\t\tutcOffset = 8\n\n\treturn moment(date).utcOffset(utcOffset, passing).format(\"YYYY-MM-DD HH:mm\");\n\nInstanceReadOnlyTemplate.formatTime = (date)->\n\tutcOffset = 0\n\treturn moment(date).utcOffset(utcOffset).format(\"HH:mm\");\n\nInstanceReadOnlyTemplate.getInstanceView = (user, space, instance, options)->\n\n\tsteedosData = _getTemplateData(user, space, instance, options)\n\n\tsteedosData.absolute = false;\n\n\tif options?.absolute\n\t\tsteedosData.absolute = true;\n\n\tinstanceTemplate = TemplateManager.getTemplate(instance, options?.templateName);\n\n\tinstanceTemplate = instanceTemplate.replace(/afSelectUser/g,\"afSelectUserRead\")\n\n\tif !options?.editable\n\t\tinstanceTemplate = instanceTemplate.replace(/afFormGroup/g,\"afFormGroupRead\")\n\n\tinstanceCompiled = SpacebarsCompiler.compile(instanceTemplate, {isBody: true});\n\n\tinstanceRenderFunction = eval(instanceCompiled);\n\n\tTemplate.instance_readonly_view = new Blaze.Template(\"instance_readonly_view\", instanceRenderFunction);\n\n\tTemplate.instance_readonly_view.steedosData = steedosData\n\n\tTemplate.instance_readonly_view.helpers InstanceformTemplate.helpers\n\n\tInstanceReadOnlyTemplate.init(steedosData);\n\n\tbody = Blaze.toHTMLWithData(Template.instance_readonly_view, steedosData)\n\n\treturn \"\"\"\n\t\t
\n\t\t\t#{body}\n\t\t
\n\t\"\"\"\n\nInstanceReadOnlyTemplate.getTracesView = (user, space, instance, options)->\n\n\tsteedosData = _getTemplateData(user, space, instance)\n\n\tform = db.forms.findOne(instance.form);\n\tif form.instance_style == \"table\" || options?.templateName == \"table\"\n\t\ttracesHtml = _getViewHtml('client/views/instance/traces_table.html')\n\telse\n\t\ttracesHtml = _getViewHtml('client/views/instance/traces.html')\n\n\ttraceCompiled = SpacebarsCompiler.compile(tracesHtml, {isBody: true});\n\n\ttraceRenderFunction = eval(traceCompiled);\n\n\tTemplate.trace_readonly_view = new Blaze.Template(\"trace_readonly_view\", traceRenderFunction);\n\n\tTemplate.trace_readonly_view.steedosData = steedosData\n\n\tTemplate.trace_readonly_view.helpers TracesTemplate.helpers\n\n\tbody = Blaze.toHTMLWithData(Template.trace_readonly_view, instance.traces)\n\n\treturn body;\n\nInstanceReadOnlyTemplate.getAttachmentView = (user, space, instance)->\n\n\tsteedosData = _getTemplateData(user, space, instance)\n\n\tattachmentHtml = _getViewHtml('client/views/instance/instance_attachments.html')\n\n\tattachmentCompiled = SpacebarsCompiler.compile(attachmentHtml, {isBody: true});\n\n\tattachmentRenderFunction = eval(attachmentCompiled);\n\n\tTemplate.attachments_readonly_view = new Blaze.Template(\"attachments_readonly_view\", attachmentRenderFunction);\n\n\tTemplate.attachments_readonly_view.steedosData = steedosData\n\n\tTemplate.attachments_readonly_view.helpers InstanceAttachmentTemplate.helpers\n\n\tbody = Blaze.toHTMLWithData(Template.attachments_readonly_view)\n\n\treturn body;\n\nInstanceReadOnlyTemplate.getRelatedInstancesView = (user, space, instance, options)->\n\tsteedosData = _getTemplateData(user, space, instance)\n\n\tsteedosData.absolute = false;\n\n\tif options?.absolute\n\t\tsteedosData.absolute = true;\n\n\trelatedInstancesHtml = _getViewHtml('client/views/instance/related_instances.html')\n\n\trelatedInstancesCompiled = SpacebarsCompiler.compile(relatedInstancesHtml, {isBody: true});\n\n\trelatedInstancesRenderFunction = eval(relatedInstancesCompiled);\n\n\tTemplate.related_instances_view = new Blaze.Template(\"related_instances_view\", relatedInstancesRenderFunction);\n\n\tTemplate.related_instances_view.steedosData = steedosData\n\n\tTemplate.related_instances_view.helpers RelatedInstances.helpers\n\n\tbody = Blaze.toHTMLWithData(Template.related_instances_view, steedosData)\n\n\treturn body;\n\nInstanceReadOnlyTemplate.getRelatedRecordsView = (user, space, instance, options)->\n\tsteedosData = _getTemplateData(user, space, instance)\n\n\tsteedosData.absolute = false;\n\n\tif options?.absolute\n\t\tsteedosData.absolute = true;\n\n\trelatedRecordsHtml = _getViewHtml('client/views/instance/related_records.html')\n\n\trelatedRecordsCompiled = SpacebarsCompiler.compile(relatedRecordsHtml, {isBody: true});\n\n\trelatedRecordsRenderFunction = eval(relatedRecordsCompiled);\n\n\tTemplate.related_records_view = new Blaze.Template(\"related_records_view\", relatedRecordsRenderFunction);\n\n\tTemplate.related_records_view.steedosData = steedosData\n\n\tTemplate.related_records_view.helpers RelatedRecords.helpers\n\n\tbody = Blaze.toHTMLWithData(Template.related_records_view, steedosData)\n\n\treturn body;\n\nInstanceReadOnlyTemplate.getOnLoadScript = (instance)->\n\tform_version = WorkflowManager.getFormVersion(instance.form, instance.form_version)\n\n\tform_script = form_version.form_script;\n\n\tif form_script && form_script.replace(/\\n/g,\"\").replace(/\\s/g,\"\").length > 0\n\t\tform_script = \"CoreForm = {};CoreForm.instanceform = {};\" + form_script\n\t\tform_script += \";if(CoreForm.form_OnLoad){window.onload = CoreForm.form_OnLoad();}\"\n\telse\n\t\tform_script = \"\"\n\n\n\nInstanceReadOnlyTemplate.getInstanceHtml = (user, space, instance, options)->\n\n\tbody = InstanceReadOnlyTemplate.getInstanceView(user, space, instance, options);\n\n\tonLoadScript = InstanceReadOnlyTemplate.getOnLoadScript(instance);\n\n\tcreatorService = Meteor.settings.public.webservices?.creator?.url\n\tins_record_ids = instance.record_ids\n\tlocale = _getLocale(user);\n\topenFileScript = \"\"\"\n\t\t\tif(window.isNode && isNode()){\n\t\t\t\tattachs = document.getElementsByClassName(\"ins_attach_href\");\n\t\t\t\tfor(var i = 0; i < attachs.length; i++){\n\t\t\t\t\tattach = attachs[i];\n\t\t\t\t\tattach.addEventListener(\"click\", function(e){\n\t\t\t\t\t\tif(isImage(this.dataset.type) || isHtml(this.dataset.type)){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\topenWindow(\"/api/files/instances/\" + this.dataset.id);\n\t\t\t\t\t\t}else if(nw_core.canOpenFile(this.dataset.name)){\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tnw_core.openFile(this.href, this.dataset.name)\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar flow = \"#{instance.flow}\";\n\t\t\tvar space = \"#{instance.space}\";\n\n\t\t\tfunction getCookie(name){\n\t\t\t\tlet pattern = RegExp(name + \"=.[^;]*\")\n\t\t\t\tlet matched = document.cookie.match(pattern)\n\t\t\t\tif(matched){\n\t\t\t\t\tlet cookie = matched[0].split('=')\n\t\t\t\t\treturn cookie[1]\n\t\t\t\t}\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\tvar records = document.getElementsByClassName(\"ins-related-records\");\n\t\t\tfor(var i = 0; i < records.length; i++){\n\t\t\t\t\tvar record = records[i];\n\t\t\t\t\trecord.addEventListener(\"click\", function(e){\n\t\t\t\t\t\tvar creatorService = \"#{creatorService}\"\n\t\t\t\t\t\tvar ins_record_ids = #{JSON.stringify(ins_record_ids)}\n\t\t\t\t\t\tif(creatorService && ins_record_ids && ins_record_ids.length > 0){\n\t\t\t\t\t\t\tvar objcetName = ins_record_ids[0].o\n\t\t\t\t\t\t\tvar id = ins_record_ids[0].ids[0]\n\t\t\t\t\t\t\tvar uobj = {};\n\t\t\t\t\t\t\tuobj[\"X-User-Id\"] = getCookie(\"X-User-Id\");\n\t\t\t\t\t\t\tuobj[\"X-Auth-Token\"] = getCookie(\"X-Auth-Token\");\n\t\t\t\t\t\t\tredirectUrl = creatorService + \"app/-/\" + objcetName + \"/view/\" + id + \"?\" + $.param(uobj);\n\t\t\t\t\t\t\topenWindow(redirectUrl);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\"\"\";\n\n\n\tif !Steedos.isMobile()\n\t\tform = db.forms.findOne(instance.form);\n\t\tif form?.instance_style == 'table'\n\t\t\tinstance_style = \"instance-table\"\n\n\tif options?.templateName == 'table'\n\t\tinstance_style = \"instance-table\"\n\n\tif options?.instance_style\n\t\tinstance_style = options.instance_style\n\n\tif !options || options.showTrace == true\n\t\ttrace = InstanceReadOnlyTemplate.getTracesView(user, space, instance)\n\telse\n\t\ttrace = \"\"\n\n\tinstanceBoxStyle = \"\";\n\n\tif instance && instance.final_decision\n\t\tif instance.final_decision == \"approved\"\n\t\t\tinstanceBoxStyle = \"box-success\"\n\t\telse if (instance.final_decision == \"rejected\")\n\t\t\tinstanceBoxStyle = \"box-danger\"\n\tif !options || options.showAttachments == true\n\t\tattachment = InstanceReadOnlyTemplate.getAttachmentView(user, space, instance)\n\t\trelated_instances = InstanceReadOnlyTemplate.getRelatedInstancesView(user, space, instance, options)\n\t\trelated_records = InstanceReadOnlyTemplate.getRelatedRecordsView(user, space, instance, options)\n\telse\n\t\tattachment = \"\"\n\t\trelated_instances = \"\"\n\t\trelated_records = \"\"\n\n\n\twidth = \"960px\"\n\t#\t如果给table的parent设置width,则会导致阿里云邮箱显示table 异常\n\tif options?.width\n\t\twidth = \"\"\n\n\tcssHref = Meteor.absoluteUrl(\"steedos-css\")\n\t\n\tjqHref = Meteor.absoluteUrl(\"website/libs/jquery.min.js\")\n\n\tallCssLink = \"\"\"\"\"\"\n\n\ttraceCheck = \"\"\n\tif !_.isEmpty(trace)\n\t\ttraceCheck = \"checked\"\n\tif options?.tagger == 'email' || options?.editable\n\t\tshowTracesBtn = \"\"\n\telse\n\t\tshowTracesBtn = \"\"\"\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t\"\"\"\n\n\tshowTracesScript = \"\"\"\n\t\t$( document ).ready(function(){\n\t\t\tvar b = document.getElementById('cbx-print-traces');\n\t\t\tvar t = document.getElementsByClassName('instance-traces')[0];\n\t\t\tif (b && b.checked && t){\n\t\t\t\tt.style = 'display: block;'\n\t\t\t} else if(t){\n\t\t\t\tt.style = 'display: none;'\n\t\t\t}\n\t\t\tif(b){\n\t\t\t\tb.addEventListener('change', function(e){\n\t\t\t\t\tif (e.target.checked){\n\t\t\t\t\t\tt.style = 'display: block;'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt.style = 'display: none;'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\n\t\t\tvar attachmentsCheckbox = document.getElementById('cbx-print-attachments');\n\t\t\tvar attachmentsView = document.getElementsByClassName('attachments-section')[0];\n\t\t\tif (attachmentsCheckbox && attachmentsCheckbox.checked && attachmentsView){\n\t\t\t\tattachmentsView.style = 'display: block;'\n\t\t\t} else if(attachmentsView){\n\t\t\t\tattachmentsView.style = 'display: none;'\n\t\t\t}\n\t\t\tif(attachmentsCheckbox){\n\t\t\t\tattachmentsCheckbox.addEventListener('change', function(e){\n\t\t\t\t\tif (e.target.checked){\n\t\t\t\t\t\tattachmentsView.style = 'display: block;'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tattachmentsView.style = 'display: none;'\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\"\"\"\n\n\tif options?.styles\n\t\tallCssLink = \"\"\n\n\tform = db.forms.findOne({_id: instance.form});\n\tformDescriptionHtml = \"\"\n\tif form\n\t\tformDescription = form.description\n\t\tif formDescription\n\t\t\tformDescription = formDescription.replace(/\\n/g,\"
\")\n\t\t\tformDescriptionHtml = \"\"\"\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t#{formDescription}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\"\"\"\n\n\thtml = \"\"\"\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t#{allCssLink}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t#{options.plugins || \"\"}\n\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t#{showTracesBtn}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t#{formDescriptionHtml}\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t#{attachment}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t#{related_instances}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t#{related_records}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t#{body}\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t#{trace}\n\t\t\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\n\t\t\t\n\t\t\n\t\"\"\"\n\n\treturn html","var _getLocale, _getRequiredFields, _getStartStepEditableFields, _getStartStepRequiredFields, _getTemplateData, _getViewHtml, getLinkText, marked; \n\nmarked = require(\"marked\");\n\nInstanceReadOnlyTemplate = {};\n\nInstanceReadOnlyTemplate.instance_attachment = \"\\n\t\\n\t\t{{this.name}}\\n\t\\n\";\n\nInstanceReadOnlyTemplate.afSelectUserRead = \"
{{value}}
\";\n\nInstanceReadOnlyTemplate.afFormGroupRead = \"
\\n\t{{#with getField this.name}}\\n\t\t{{#if equals type 'section'}}\\n\t\t\t\t
\\n\t\t\t\t\t\\n\t\t\t\t\t

{{{description}}}

\\n\t\t\t\t
\\n\t\t{{else}}\\n\t\t\t{{#if equals type 'table'}}\\n\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t{{{description}}}\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t{{{getTableThead this}}}\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t{{{getTableBody this}}}\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t
\\n\t\t\t{{else}}\\n\t\t\t\t{{#if showLabel}}\\n\t\t\t\t\t\\n\t\t\t\t{{/if}}\\n\t\t\t\t{{#if isTextarea this}}\\n\t\t\t\t\t

{{{getValue code}}}

\\n\t\t\t\t{{else}}\\n\t\t\t\t\t
{{{getValue code}}}
\\n\t\t\t\t{{/if}}\\n\t\t\t{{/if}}\\n\t\t{{/if}}\\n\t{{/with}}\\n
\";\n\nInstanceReadOnlyTemplate.afFormGroup = \"\\n{{#with getField this.name}}\\n\t\t{{#if equals type 'section'}}\\n\t\t\t
\\n\t\t\t\t
\\n\t\t\t\t\t\\n\t\t\t\t\t

{{{description}}}

\\n\t\t\t\t
\\n \t\t\t\t
\\n\t\t{{else}}\\n\t\t\t{{#if equals type 'table'}}\\n\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t{{{description}}}\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t{{{getTableThead this}}}\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t{{{getTableBody this}}}\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t
\\n\t\t\t{{else}}\\n\t\t\t\t{{#if equals type 'input'}}\\n\t\t\t\t\t
\\n\t\t\t\t\t\t\\n\t\t\t\t\t\t{{#if is_textarea}}\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t{{#unless is_textarea}}\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t{{/unless}}\\n\t\t\t\t\t
\\n\t\t\t\t{{else}}\\n\t\t\t\t\t{{#if equals type 'number'}}\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\\n\t\t\t\t\t\t
\\n\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t{{#if equals type 'date'}}\\n\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t{{#if equals type 'dateTime'}}\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t{{#if equals type 'password'}}\\n\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t{{#if equals type 'select'}}\\n\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t{{#if equals type 'radio'}}\\n\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{#each options this}}\\n \t\t\t\t\t\t\t\t\t\t\t\t\\n \t\t\t\t\t\t\t\t\t\t\t\t\t{{/each}}\\n \t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'multiSelect'}}\\n\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#each options this}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{/each}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'url'}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'email'}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{#if equals type 'checkbox'}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{else}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
{{{getValue code}}}
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t\t{{/if}}\\n\t\t\t\t\t{{/if}}\\n\t\t\t\t{{/if}}\\n\t\t\t{{/if}}\\n\t\t{{/if}}\\n\t{{/with}}\";\n\nInstanceReadOnlyTemplate.create = function(tempalteName, steedosData) {\n var template, templateCompiled, templateRenderFunction;\n template = InstanceReadOnlyTemplate[tempalteName];\n templateCompiled = SpacebarsCompiler.compile(template, {\n isBody: true\n });\n templateRenderFunction = eval(templateCompiled);\n Template[tempalteName] = new Blaze.Template(tempalteName, templateRenderFunction);\n Template[tempalteName].steedosData = steedosData;\n return Template[tempalteName].helpers(InstanceformTemplate.helpers);\n};\n\nInstanceReadOnlyTemplate.createInstanceSignText = function(steedosData) {\n var instanceSignTextCompiled, instanceSignTextHtml, instanceSignTextRenderFunction;\n instanceSignTextHtml = _getViewHtml('client/views/instance/instance_sign_text.html');\n instanceSignTextCompiled = SpacebarsCompiler.compile(instanceSignTextHtml, {\n isBody: true\n });\n instanceSignTextRenderFunction = eval(instanceSignTextCompiled);\n Template.instanceSignText = new Blaze.Template(\"instanceSignText\", instanceSignTextRenderFunction);\n Template.instanceSignText.steedosData = steedosData;\n return Template.instanceSignText.helpers(InstanceSignText.helpers);\n};\n\nInstanceReadOnlyTemplate.createImageSign = function(steedosData) {\n var imageSignCompiled, imageSignHtml, imageSignRenderFunction;\n imageSignHtml = _getViewHtml('client/views/instance/image_sign.html');\n imageSignCompiled = SpacebarsCompiler.compile(imageSignHtml, {\n isBody: true\n });\n imageSignRenderFunction = eval(imageSignCompiled);\n Template.imageSign = new Blaze.Template(\"imageSign\", imageSignRenderFunction);\n Template.imageSign.steedosData = steedosData;\n return Template.imageSign.helpers(ImageSign.helpers);\n};\n\nInstanceReadOnlyTemplate.createTracesHanlder = function(steedosData) {\n var tracesHanlderCompiled, tracesHanlderHtml, tracesHanlderRenderFunction;\n tracesHanlderHtml = _getViewHtml('client/views/instance/traces_handler.html');\n tracesHanlderCompiled = SpacebarsCompiler.compile(tracesHanlderHtml, {\n isBody: true\n });\n tracesHanlderRenderFunction = eval(tracesHanlderCompiled);\n Template.instance_traces_handler = new Blaze.Template(\"instance_traces_handler\", tracesHanlderRenderFunction);\n Template.instance_traces_handler.steedosData = steedosData;\n return Template.instance_traces_handler.helpers(TracesHandler.helpers);\n};\n\nInstanceReadOnlyTemplate.init = function(steedosData) {\n InstanceReadOnlyTemplate.create(\"afSelectUserRead\", steedosData);\n if (Meteor.isServer) {\n InstanceReadOnlyTemplate.create(\"afFormGroup\", steedosData);\n }\n InstanceReadOnlyTemplate.create(\"afFormGroupRead\", steedosData);\n if (Meteor.isServer) {\n InstanceReadOnlyTemplate.create(\"instance_attachment\", {\n absolute: steedosData.absolute\n });\n InstanceReadOnlyTemplate.createImageSign(steedosData);\n InstanceReadOnlyTemplate.createTracesHanlder(steedosData);\n return InstanceReadOnlyTemplate.createInstanceSignText(steedosData);\n }\n};\n\ngetLinkText = function(item, label, detail_url) {\n if (detail_url) {\n detail_url = detail_url.replace(\"{_id}\", item._id);\n if (!/^http(s?):\\/\\//.test(detail_url)) {\n detail_url = Steedos.absoluteUrl(detail_url);\n }\n return '' + label + '';\n } else {\n return label;\n }\n};\n\nInstanceReadOnlyTemplate.getValue = function(value, field, locale, utcOffset) {\n var date, detail_url, e, fieldOptions, hours, month, nameField, records, res, seconds, selectedOption, selectedOptions, splitedValues, t, t0, t1, uiSchema, year;\n if (!value && value !== false) {\n return '';\n }\n if ([\"select\", \"multiSelect\", \"radio\"].indexOf(field.type) > -1) {\n fieldOptions = field.options.split(\"\\n\").map(function(n) {\n var itemSplits;\n itemSplits = n.split(\":\");\n return {\n label: itemSplits[0],\n value: itemSplits[1] || n\n };\n });\n }\n switch (field.type) {\n case 'email':\n value = value ? '' + value + '' : '';\n break;\n case 'url':\n if (value) {\n if (value.indexOf(\"http\") === 0) {\n try {\n value = \"\" + value + \"\";\n } catch (error) {\n e = error;\n value = \"\" + value + \"\";\n }\n } else {\n value = \"\" + value + \"\";\n }\n } else {\n value = '';\n }\n break;\n case 'group':\n if (field.is_multiselect) {\n value = value != null ? value.getProperty(\"fullname\").toString() : void 0;\n } else {\n value = value != null ? value.fullname : void 0;\n }\n break;\n case 'user':\n if (field.is_multiselect) {\n value = value != null ? value.getProperty(\"name\").toString() : void 0;\n } else {\n value = value != null ? value.name : void 0;\n }\n break;\n case 'password':\n value = '******';\n break;\n case 'checkbox':\n if (value && value !== 'false') {\n value = TAPi18n.__(\"form_field_checkbox_yes\", {}, locale);\n } else {\n value = TAPi18n.__(\"form_field_checkbox_no\", {}, locale);\n }\n break;\n case 'dateTime':\n if (value && value.length === 16) {\n t = value.split(\"T\");\n t0 = t[0].split(\"-\");\n t1 = t[1].split(\":\");\n year = t0[0];\n month = t0[1];\n date = t0[2];\n hours = t1[0];\n seconds = t1[1];\n value = new Date(year, month - 1, date, hours, seconds);\n } else {\n value = new Date(value);\n }\n value = InstanceReadOnlyTemplate.formatDate(value, utcOffset);\n break;\n case 'time':\n if (value && value.length === 16) {\n t = value.split(\"T\");\n t0 = t[0].split(\"-\");\n t1 = t[1].split(\":\");\n year = t0[0];\n month = t0[1];\n date = t0[2];\n hours = t1[0];\n seconds = t1[1];\n value = new Date(year, month - 1, date, hours, seconds);\n } else {\n value = new Date(value);\n }\n value = InstanceReadOnlyTemplate.formatTime(value);\n break;\n case 'input':\n if (field.is_textarea) {\n value = value;\n }\n break;\n case 'select':\n selectedOption = fieldOptions.find(function(item) {\n return item.value === value;\n });\n if (selectedOption) {\n value = selectedOption.label;\n }\n break;\n case 'radio':\n selectedOption = fieldOptions.find(function(item) {\n return item.value === value;\n });\n if (selectedOption) {\n value = selectedOption.label;\n }\n break;\n case 'multiSelect':\n splitedValues = value.split(\",\");\n selectedOptions = fieldOptions.filter(function(item) {\n return splitedValues.indexOf(item.value) > -1;\n });\n if (selectedOptions.length) {\n value = selectedOptions.map(function(item) {\n return item.label;\n }).join(\",\");\n }\n break;\n case 'number':\n if (value || value === 0) {\n if (field.is_percent) {\n value = Steedos.numberToPercentString(value, field.digits);\n } else {\n value = Steedos.numberToString(value, field.digits);\n }\n }\n break;\n case 'odata':\n detail_url = field.detail_url;\n if (field.is_multiselect) {\n value = _.map(value, function(item) {\n return getLinkText(item, item['@label'], detail_url);\n });\n } else {\n value = getLinkText(value, value['@label'], detail_url);\n }\n break;\n case 'image':\n if (field.is_multiselect) {\n value = _.map(value, function(item) {\n return '
';\n });\n value = value.join(\"\");\n } else {\n value = '
';\n }\n break;\n case 'file':\n if (value) {\n if (!field.is_multiselect) {\n value = [value];\n }\n if (Meteor.isClient) {\n res = Steedos.authRequest('/api/v1/cfs_files_filerecord?filters=[[\"_id\",\"in\", ' + JSON.stringify(value) + ']]&fields=[\"_id\",\"original\"]', {\n async: false\n });\n records = res.data.items;\n } else if (Meteor.isServer) {\n records = Steedos.objectFind(\"cfs_files_filerecord\", {\n filters: [[\"_id\", 'in', value]],\n fields: [\"_id\", \"original\"]\n });\n }\n value = _.map(records, function(item) {\n var fileName, filePreviewHtml, fileUrl;\n fileName = item.original.name;\n fileUrl = Steedos.absoluteUrl('/api/files/files/' + item._id);\n filePreviewHtml = '';\n if ([\".pdf\", \".jpg\", \".jpeg\", \".png\", \".gif\"].indexOf(fileName.slice(-4)) > -1) {\n filePreviewHtml = \" 预览\";\n }\n return \"
\" + fileName + \" \" + (filePreviewHtml != null ? filePreviewHtml : {\n filePreviewHtml: ''\n }) + \"
\";\n });\n value = value.join(\"\");\n }\n break;\n case 'lookup':\n if (value) {\n if (!field.is_multiselect) {\n value = [value];\n }\n if (Meteor.isClient) {\n uiSchema = Creator.getObject(field.reference_to);\n nameField = (uiSchema != null ? uiSchema.NAME_FIELD_KEY : void 0) || 'name';\n res = Steedos.authRequest('/api/v1/' + field.reference_to + '?filters=[[\"' + (field.reference_to_field || '_id') + '\",\"in\", ' + JSON.stringify(value) + ']]&fields=[\"_id\",\"' + nameField + '\"]', {\n async: false\n });\n records = res.data.items;\n } else if (Meteor.isServer) {\n nameField = Steedos.getObjectNameFieldKey(field.reference_to);\n records = Steedos.objectFind(field.reference_to, {\n filters: [[field.reference_to_field || '_id', 'in', value]],\n fields: [\"_id\", nameField]\n });\n }\n value = _.map(records, function(item) {\n return \"\" + item[nameField] + \"\";\n });\n value = value.join(\" , \");\n }\n break;\n case 'html':\n value = value ? \"
\" + value + \"
\" : '';\n }\n return value;\n};\n\nInstanceReadOnlyTemplate.getLabel = function(fields, code) {\n var field;\n field = fields.findPropertyByPK(\"code\", code);\n if (field) {\n if (field.name) {\n return field.name;\n } else {\n return field.code;\n }\n }\n};\n\nInstanceReadOnlyTemplate.getInstanceFormVersion = function(instance) {\n var form, form_fields, form_version;\n form = db.forms.findOne(instance.form);\n form_version = {};\n form_fields = [];\n if (form.current._id === instance.form_version) {\n form_version = form.current;\n } else {\n form_version = _.where(form.historys, {\n _id: instance.form_version\n })[0];\n }\n form_version.fields.forEach(function(field) {\n if (field.type === 'section') {\n form_fields.push(field);\n if (field.fields) {\n return field.fields.forEach(function(f) {\n return form_fields.push(f);\n });\n }\n } else if (field.type === 'table') {\n field['sfields'] = field['fields'];\n delete field['fields'];\n return form_fields.push(field);\n } else {\n return form_fields.push(field);\n }\n });\n form_version.fields = form_fields;\n return form_version;\n};\n\nInstanceReadOnlyTemplate.getFlowVersion = function(instance) {\n var flow, flow_version;\n flow = db.flows.findOne(instance.flow);\n flow_version = {};\n if (flow.current._id === instance.flow_version) {\n flow_version = flow.current;\n } else {\n flow_version = _.where(flow.historys, {\n _id: instance.flow_version\n })[0];\n }\n return flow_version;\n};\n\n_getViewHtml = function(path) {\n var viewHtml;\n viewHtml = Assets.getText(path);\n if (viewHtml) {\n viewHtml = viewHtml.replace(//i, \"\").replace(/<\\/template>/i, \"\");\n }\n return viewHtml;\n};\n\n_getLocale = function(user) {\n var locale, ref, ref1;\n if ((user != null ? (ref = user.locale) != null ? ref.toLocaleLowerCase() : void 0 : void 0) === 'zh-cn') {\n locale = \"zh-CN\";\n } else if ((user != null ? (ref1 = user.locale) != null ? ref1.toLocaleLowerCase() : void 0 : void 0) === 'en-us') {\n locale = \"en\";\n } else {\n locale = \"zh-CN\";\n }\n return locale;\n};\n\n_getRequiredFields = function(fields, rev) {\n if (!rev) {\n rev = [];\n }\n fields.forEach(function(field) {\n if (field.type === 'section') {\n return _getRequiredFields(field.fields, rev);\n } else if (field.type === 'table') {\n\n } else {\n if (field.is_required) {\n return rev.push(field.code);\n }\n }\n });\n return rev;\n};\n\n_getStartStepEditableFields = function(fields, steps) {\n var editableCode, startStep;\n startStep = steps.findPropertyByPK(\"step_type\", \"start\");\n editableCode = [];\n _.keys(startStep.permissions).forEach(function(key) {\n if (startStep.permissions[key] === 'editable') {\n return editableCode.push(key);\n }\n });\n return editableCode;\n};\n\n_getStartStepRequiredFields = function(fields, steps) {\n var editableCode, requiredFields;\n requiredFields = _getRequiredFields(fields);\n editableCode = _getStartStepEditableFields(fields, steps);\n return _.intersection(requiredFields, editableCode);\n};\n\n_getTemplateData = function(user, space, instance, options) {\n var flow, form, form_version, locale, steedosData;\n if (Meteor.isServer) {\n form_version = InstanceReadOnlyTemplate.getInstanceFormVersion(instance);\n } else {\n form_version = WorkflowManager.getInstanceFormVersion(instance);\n }\n locale = _getLocale(user);\n steedosData = {};\n if (Meteor.isClient) {\n steedosData = _.clone(WorkflowManager_format.getAutoformSchemaValues());\n steedosData.insname = instance.name;\n steedosData.ins_state = instance.state;\n steedosData.ins_final_decision = instance.ins_final_decision;\n steedosData.ins_code = instance.code;\n steedosData.ins_is_archived = instance.is_archived;\n steedosData.ins_is_deleted = instance.ins_is_deleted;\n steedosData.applicant_name = instance.applicant_name;\n steedosData.applicantContext = instance.applicant_name;\n }\n steedosData.instance = instance;\n steedosData.form_version = form_version;\n steedosData.locale = locale;\n steedosData.utcOffset = user.utcOffset;\n steedosData.space = instance.space;\n steedosData.sessionUserId = user._id;\n if (Meteor.isServer) {\n if (options != null ? options.editable : void 0) {\n form = db.forms.findOne({\n _id: instance.form\n });\n flow = db.flows.findOne({\n _id: instance.flow\n });\n steedosData.startStepEditableFields = _getStartStepEditableFields(form.current.fields, flow.current.steps);\n }\n }\n return steedosData;\n};\n\nInstanceReadOnlyTemplate.formatDate = function(date, utcOffset) {\n var passing;\n if (Meteor.isServer) {\n passing = false;\n } else {\n passing = true;\n }\n if (!utcOffset && utcOffset !== 0) {\n utcOffset = 8;\n }\n return moment(date).utcOffset(utcOffset, passing).format(\"YYYY-MM-DD HH:mm\");\n};\n\nInstanceReadOnlyTemplate.formatTime = function(date) {\n var utcOffset;\n utcOffset = 0;\n return moment(date).utcOffset(utcOffset).format(\"HH:mm\");\n};\n\nInstanceReadOnlyTemplate.getInstanceView = function(user, space, instance, options) {\n var body, instanceCompiled, instanceRenderFunction, instanceTemplate, steedosData;\n steedosData = _getTemplateData(user, space, instance, options);\n steedosData.absolute = false;\n if (options != null ? options.absolute : void 0) {\n steedosData.absolute = true;\n }\n instanceTemplate = TemplateManager.getTemplate(instance, options != null ? options.templateName : void 0);\n instanceTemplate = instanceTemplate.replace(/afSelectUser/g, \"afSelectUserRead\");\n if (!(options != null ? options.editable : void 0)) {\n instanceTemplate = instanceTemplate.replace(/afFormGroup/g, \"afFormGroupRead\");\n }\n instanceCompiled = SpacebarsCompiler.compile(instanceTemplate, {\n isBody: true\n });\n instanceRenderFunction = eval(instanceCompiled);\n Template.instance_readonly_view = new Blaze.Template(\"instance_readonly_view\", instanceRenderFunction);\n Template.instance_readonly_view.steedosData = steedosData;\n Template.instance_readonly_view.helpers(InstanceformTemplate.helpers);\n InstanceReadOnlyTemplate.init(steedosData);\n body = Blaze.toHTMLWithData(Template.instance_readonly_view, steedosData);\n return \"
\\n\t\" + body + \"\\n
\";\n};\n\nInstanceReadOnlyTemplate.getTracesView = function(user, space, instance, options) {\n var body, form, steedosData, traceCompiled, traceRenderFunction, tracesHtml;\n steedosData = _getTemplateData(user, space, instance);\n form = db.forms.findOne(instance.form);\n if (form.instance_style === \"table\" || (options != null ? options.templateName : void 0) === \"table\") {\n tracesHtml = _getViewHtml('client/views/instance/traces_table.html');\n } else {\n tracesHtml = _getViewHtml('client/views/instance/traces.html');\n }\n traceCompiled = SpacebarsCompiler.compile(tracesHtml, {\n isBody: true\n });\n traceRenderFunction = eval(traceCompiled);\n Template.trace_readonly_view = new Blaze.Template(\"trace_readonly_view\", traceRenderFunction);\n Template.trace_readonly_view.steedosData = steedosData;\n Template.trace_readonly_view.helpers(TracesTemplate.helpers);\n body = Blaze.toHTMLWithData(Template.trace_readonly_view, instance.traces);\n return body;\n};\n\nInstanceReadOnlyTemplate.getAttachmentView = function(user, space, instance) {\n var attachmentCompiled, attachmentHtml, attachmentRenderFunction, body, steedosData;\n steedosData = _getTemplateData(user, space, instance);\n attachmentHtml = _getViewHtml('client/views/instance/instance_attachments.html');\n attachmentCompiled = SpacebarsCompiler.compile(attachmentHtml, {\n isBody: true\n });\n attachmentRenderFunction = eval(attachmentCompiled);\n Template.attachments_readonly_view = new Blaze.Template(\"attachments_readonly_view\", attachmentRenderFunction);\n Template.attachments_readonly_view.steedosData = steedosData;\n Template.attachments_readonly_view.helpers(InstanceAttachmentTemplate.helpers);\n body = Blaze.toHTMLWithData(Template.attachments_readonly_view);\n return body;\n};\n\nInstanceReadOnlyTemplate.getRelatedInstancesView = function(user, space, instance, options) {\n var body, relatedInstancesCompiled, relatedInstancesHtml, relatedInstancesRenderFunction, steedosData;\n steedosData = _getTemplateData(user, space, instance);\n steedosData.absolute = false;\n if (options != null ? options.absolute : void 0) {\n steedosData.absolute = true;\n }\n relatedInstancesHtml = _getViewHtml('client/views/instance/related_instances.html');\n relatedInstancesCompiled = SpacebarsCompiler.compile(relatedInstancesHtml, {\n isBody: true\n });\n relatedInstancesRenderFunction = eval(relatedInstancesCompiled);\n Template.related_instances_view = new Blaze.Template(\"related_instances_view\", relatedInstancesRenderFunction);\n Template.related_instances_view.steedosData = steedosData;\n Template.related_instances_view.helpers(RelatedInstances.helpers);\n body = Blaze.toHTMLWithData(Template.related_instances_view, steedosData);\n return body;\n};\n\nInstanceReadOnlyTemplate.getRelatedRecordsView = function(user, space, instance, options) {\n var body, relatedRecordsCompiled, relatedRecordsHtml, relatedRecordsRenderFunction, steedosData;\n steedosData = _getTemplateData(user, space, instance);\n steedosData.absolute = false;\n if (options != null ? options.absolute : void 0) {\n steedosData.absolute = true;\n }\n relatedRecordsHtml = _getViewHtml('client/views/instance/related_records.html');\n relatedRecordsCompiled = SpacebarsCompiler.compile(relatedRecordsHtml, {\n isBody: true\n });\n relatedRecordsRenderFunction = eval(relatedRecordsCompiled);\n Template.related_records_view = new Blaze.Template(\"related_records_view\", relatedRecordsRenderFunction);\n Template.related_records_view.steedosData = steedosData;\n Template.related_records_view.helpers(RelatedRecords.helpers);\n body = Blaze.toHTMLWithData(Template.related_records_view, steedosData);\n return body;\n};\n\nInstanceReadOnlyTemplate.getOnLoadScript = function(instance) {\n var form_script, form_version;\n form_version = WorkflowManager.getFormVersion(instance.form, instance.form_version);\n form_script = form_version.form_script;\n if (form_script && form_script.replace(/\\n/g, \"\").replace(/\\s/g, \"\").length > 0) {\n form_script = \"CoreForm = {};CoreForm.instanceform = {};\" + form_script;\n return form_script += \";if(CoreForm.form_OnLoad){window.onload = CoreForm.form_OnLoad();}\";\n } else {\n return form_script = \"\";\n }\n};\n\nInstanceReadOnlyTemplate.getInstanceHtml = function(user, space, instance, options) {\n var allCssLink, attachment, body, creatorService, cssHref, form, formDescription, formDescriptionHtml, html, ins_record_ids, instanceBoxStyle, instance_style, jqHref, locale, onLoadScript, openFileScript, ref, ref1, related_instances, related_records, showTracesBtn, showTracesScript, trace, traceCheck, width;\n body = InstanceReadOnlyTemplate.getInstanceView(user, space, instance, options);\n onLoadScript = InstanceReadOnlyTemplate.getOnLoadScript(instance);\n creatorService = (ref = Meteor.settings[\"public\"].webservices) != null ? (ref1 = ref.creator) != null ? ref1.url : void 0 : void 0;\n ins_record_ids = instance.record_ids;\n locale = _getLocale(user);\n openFileScript = \"if(window.isNode && isNode()){\\n\tattachs = document.getElementsByClassName(\\\"ins_attach_href\\\");\\n\tfor(var i = 0; i < attachs.length; i++){\\n\t\tattach = attachs[i];\\n\t\tattach.addEventListener(\\\"click\\\", function(e){\\n\t\t\tif(isImage(this.dataset.type) || isHtml(this.dataset.type)){\\n\t\t\t\te.preventDefault();\\n\t\t\t\topenWindow(\\\"/api/files/instances/\\\" + this.dataset.id);\\n\t\t\t}else if(nw_core.canOpenFile(this.dataset.name)){\\n\t\t\t\te.preventDefault();\\n\t\t\t\tnw_core.openFile(this.href, this.dataset.name)\\n\t\t\t}\\n\t\t});\\n\t}\\n}\\n\\nvar flow = \\\"\" + instance.flow + \"\\\";\\nvar space = \\\"\" + instance.space + \"\\\";\\n\\nfunction getCookie(name){\\n\tlet pattern = RegExp(name + \\\"=.[^;]*\\\")\\n\tlet matched = document.cookie.match(pattern)\\n\tif(matched){\\n\t\tlet cookie = matched[0].split('=')\\n\t\treturn cookie[1]\\n\t}\\n\treturn ''\\n}\\n\\nvar records = document.getElementsByClassName(\\\"ins-related-records\\\");\\nfor(var i = 0; i < records.length; i++){\\n\t\tvar record = records[i];\\n\t\trecord.addEventListener(\\\"click\\\", function(e){\\n\t\t\tvar creatorService = \\\"\" + creatorService + \"\\\"\\n\t\t\tvar ins_record_ids = \" + (JSON.stringify(ins_record_ids)) + \"\\n\t\t\tif(creatorService && ins_record_ids && ins_record_ids.length > 0){\\n\t\t\t\tvar objcetName = ins_record_ids[0].o\\n\t\t\t\tvar id = ins_record_ids[0].ids[0]\\n\t\t\t\tvar uobj = {};\\n\t\t\t\tuobj[\\\"X-User-Id\\\"] = getCookie(\\\"X-User-Id\\\");\\n\t\t\t\tuobj[\\\"X-Auth-Token\\\"] = getCookie(\\\"X-Auth-Token\\\");\\n\t\t\t\tredirectUrl = creatorService + \\\"app/-/\\\" + objcetName + \\\"/view/\\\" + id + \\\"?\\\" + $.param(uobj);\\n\t\t\t\topenWindow(redirectUrl);\\n\t\t\t}\\n\t\t});\\n\t}\\n\";\n if (!Steedos.isMobile()) {\n form = db.forms.findOne(instance.form);\n if ((form != null ? form.instance_style : void 0) === 'table') {\n instance_style = \"instance-table\";\n }\n }\n if ((options != null ? options.templateName : void 0) === 'table') {\n instance_style = \"instance-table\";\n }\n if (options != null ? options.instance_style : void 0) {\n instance_style = options.instance_style;\n }\n if (!options || options.showTrace === true) {\n trace = InstanceReadOnlyTemplate.getTracesView(user, space, instance);\n } else {\n trace = \"\";\n }\n instanceBoxStyle = \"\";\n if (instance && instance.final_decision) {\n if (instance.final_decision === \"approved\") {\n instanceBoxStyle = \"box-success\";\n } else if (instance.final_decision === \"rejected\") {\n instanceBoxStyle = \"box-danger\";\n }\n }\n if (!options || options.showAttachments === true) {\n attachment = InstanceReadOnlyTemplate.getAttachmentView(user, space, instance);\n related_instances = InstanceReadOnlyTemplate.getRelatedInstancesView(user, space, instance, options);\n related_records = InstanceReadOnlyTemplate.getRelatedRecordsView(user, space, instance, options);\n } else {\n attachment = \"\";\n related_instances = \"\";\n related_records = \"\";\n }\n width = \"960px\";\n if (options != null ? options.width : void 0) {\n width = \"\";\n }\n cssHref = Meteor.absoluteUrl(\"steedos-css\");\n jqHref = Meteor.absoluteUrl(\"website/libs/jquery.min.js\");\n allCssLink = \"\";\n traceCheck = \"\";\n if (!_.isEmpty(trace)) {\n traceCheck = \"checked\";\n }\n if ((options != null ? options.tagger : void 0) === 'email' || (options != null ? options.editable : void 0)) {\n showTracesBtn = \"\";\n } else {\n showTracesBtn = \"
\\n\t
\\n\t\t\\n\t\t\\n\t
\\n
\";\n }\n showTracesScript = \"$( document ).ready(function(){\\n\tvar b = document.getElementById('cbx-print-traces');\\n\tvar t = document.getElementsByClassName('instance-traces')[0];\\n\tif (b && b.checked && t){\\n\t\tt.style = 'display: block;'\\n\t} else if(t){\\n\t\tt.style = 'display: none;'\\n\t}\\n\tif(b){\\n\t\tb.addEventListener('change', function(e){\\n\t\t\tif (e.target.checked){\\n\t\t\t\tt.style = 'display: block;'\\n\t\t\t} else {\\n\t\t\t\tt.style = 'display: none;'\\n\t\t\t}\\n\t\t});\\n\t}\\n\\n\\n\tvar attachmentsCheckbox = document.getElementById('cbx-print-attachments');\\n\tvar attachmentsView = document.getElementsByClassName('attachments-section')[0];\\n\tif (attachmentsCheckbox && attachmentsCheckbox.checked && attachmentsView){\\n\t\tattachmentsView.style = 'display: block;'\\n\t} else if(attachmentsView){\\n\t\tattachmentsView.style = 'display: none;'\\n\t}\\n\tif(attachmentsCheckbox){\\n\t\tattachmentsCheckbox.addEventListener('change', function(e){\\n\t\t\tif (e.target.checked){\\n\t\t\t\tattachmentsView.style = 'display: block;'\\n\t\t\t} else {\\n\t\t\t\tattachmentsView.style = 'display: none;'\\n\t\t\t}\\n\t\t});\\n\t}\\n});\\n\";\n if (options != null ? options.styles : void 0) {\n allCssLink = \"\";\n }\n form = db.forms.findOne({\n _id: instance.form\n });\n formDescriptionHtml = \"\";\n if (form) {\n formDescription = form.description;\n if (formDescription) {\n formDescription = formDescription.replace(/\\n/g, \"
\");\n formDescriptionHtml = \"
\\n\t
\\n\t\t\" + formDescription + \"\\n\t
\\n
\";\n }\n }\n html = \"\\n\\n\t\\n\t\t\\n\t\t\" + allCssLink + \"\\n\t\t\\n\t\t\\n\t\t\" + (options.plugins || \"\") + \"\\n\\n\t\t\\n\t\\n\t\\n\t\t
\\n\t\t\t
\\n\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t\t\t\" + showTracesBtn + \"\\n\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\" + formDescriptionHtml + \"\\n\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\" + attachment + \"\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\" + related_instances + \"\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\" + related_records + \"\\n\t\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t\t\t\" + body + \"\\n\t\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t
\\n\t\t\t\t\t\t\t\t\" + trace + \"\\n\t\t\t\t\t\t\t
\\n\\n\t\t\t\t\t\t
\\n\t\t\t\t\t
\\n\t\t\t\t
\\n\t\t\t
\\n\t\t
\\n\t\\n\t\\n\";\n return html;\n};\n","TemplateManager = {};\n\nformId = 'instanceform';\n\n\nTemplateManager.instance_title = ()->\n\tpageTitle = \"\"\"\n\t\t{{instance.name}}\n\t\"\"\"\n\n\tpageTitleTrClass = \"instance-name\"\n\n\tif CoreForm?.pageTitleFieldName\n\t\tpageTitle = \"\"\"\n\t\t\t\t{{> afFormGroup name=\"#{CoreForm.pageTitleFieldName}\" label=false}}\n\t\t\"\"\"\n\t\tpageTitleTrClass = \"\"\n\n\tif CoreForm?.pageTitle\n\t\tpageTitle = \"\"\"\n\t\t\t#{CoreForm.pageTitle}\n\t\t\"\"\"\n\t\tpageTitleTrClass = \"\"\n\n\tval =\n\t\tpageTitle: pageTitle\n\t\tpageTitleTrClass: pageTitleTrClass\n\n\treturn val\n\nTemplateManager.handleTableTemplate = (instance, _export) ->\n\n\ttemplate = \"\"\"\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t
\n\t\t\t\t\t#{this.instance_title().pageTitle}\n\t\t\t\t
\n\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\"\"\";\n\n\ttable_fields = InstanceformTemplate.helpers.table_fields(instance)\n\n\ttable_fields && table_fields.forEach (table_field)->\n\n\t\trequired = \"\"\n\t\tif !CoreForm?.pageTitleFieldName || CoreForm?.pageTitleFieldName != table_field.code\n\t\t\tif table_field.is_required\n\t\t\t\trequired = \"is-required\"\n\n\t\t\tif _export\n\t\t\t\trequired = \"\";\n\n\t\t\tpureCode = Steedos.removeSpecialCharacter(table_field.code);\n\n\t\t\tif InstanceformTemplate.helpers.isOpinionField(table_field)\n\t\t\t\ttemplate += table_field.tr_start\n\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\"\"\"\n\t\t\t\ttemplate += table_field.tr_end\n\t\t\telse\n\t\t\t\tif InstanceformTemplate.helpers.includes(table_field.type, 'section,table')\n\t\t\t\t\ttemplate += table_field.tr_start\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\t\t\t\telse\n\t\t\t\t\ttemplate += table_field.tr_start\n\n\t\t\t\t\tif _export\n\t\t\t\t\t\ttitle_permission = \"\"\n\t\t\t\t\t\tfield_permission = \"\"\n\t\t\t\t\telse\n\t\t\t\t\t\ttitle_permission = \"title-\" + table_field.permission\n\t\t\t\t\t\tfield_permission = \"field-\" + table_field.permission\n\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\n\ttemplate += \"\"\"\n\t\t
\n\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t\n\t\t\t\t\t\t{{> instanceSignText name=\"#{table_field.code}\"}}\n\t\t\t\t\t\n\t\t\t\t\t\t {{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t
\n\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t
\n\t\"\"\"\n\treturn template\n\n#此处模板公用与:instance 编辑、查看、打印、转发时生成附件、发送邮件body部分(table 模板)\n#如果有修改,请测试确认其他功能是否正常。\nTemplateManager._template =\n\tdefault: (instance)->\n\n\t\ttemplate = \"\"\"\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

#{TemplateManager.instance_title().pageTitle}

\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t\t{{#each steedos_form.fields}}\n\t\t\t\t{{#if isOpinionField this}}\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t{{> instanceSignText name=this.code}}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t{{else}}\n\t\t\t\t\t{{#if includes this.type 'section,table'}}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{{> afFormGroup name=this.code label=false}}\n\t\t\t\t\t\t
\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t{{> afFormGroup name=this.code}}\n\t\t\t\t\t\t
\n\t\t\t\t\t{{/if}}\n\t\t\t\t{{/if}}\n\t\t\t{{/each}}\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t {{_t \"instance_initiator\"}} :\n\t\t\t\t\t
\n\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\"\"\"\n\t\treturn template\n\n\ttable: (instance)->\n\t\treturn TemplateManager.handleTableTemplate(instance)\n#\ttable: '''\n#\t\t\n#\t\t\t\n#\t\t\t\t\n#\t\t\t\n# \n#\t\t\t\t\n#\t\t\t\n#
\n#\t\t\t\t\t

{{instance.name}}

\n#\t\t\t\t\t\n#\t\t\t\t
\n#\t\t\t\t\t\n#\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n#\t\t\t\t
\n#\t\t\n#\t\t {{#each table_fields}}\n#\t\t\t\t{{#if isOpinionField this}}\n#\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\n#\t\t\t\t\t\t\n#\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t{{else}}\n#\t\t\t\t\t{{#if includes this.type 'section,table'}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{else}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{/if}}\n#\t\t\t\t{{/if}}\n#\n#\t\t {{/each}}\n#\t\t
\n#\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t\n#\t\t\t\t\t\t\t{{> instanceSignText step=(getOpinionFieldStepName this) default=''}}\n#\t\t\t\t\t\t\n#\t\t\t\t\t\t\t {{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t
\n#\t'''\n\nTemplateManager._templateHelps =\n\tapplicantContext: ->\n\t\tsteedos_instance = WorkflowManager.getInstance();\n\t\tdata = {\n\t\t\tname: 'ins_applicant',\n\t\t\tatts: {\n\t\t\t\tname: 'ins_applicant',\n\t\t\t\tid: 'ins_applicant',\n\t\t\t\tclass: 'selectUser form-control',\n\t\t\t\tstyle: 'padding:6px 12px;width:140px;display:inline'\n\t\t\t}\n\t\t}\n#\t\tif not steedos_instance || steedos_instance.state != \"draft\"\n\t\tdata.atts.disabled = true\n\t\treturn data;\n\ninstanceId: ->\n\treturn 'instanceform';#\"instance_\" + Session.get(\"instanceId\");\n\nform_types: ->\n\tif ApproveManager.isReadOnly()\n\t\treturn 'disabled';\n\telse\n\t\treturn 'method';\n\nsteedos_form: ->\n\tform_version = WorkflowManager.getInstanceFormVersion();\n\tif form_version\n\t\treturn form_version\n\ninnersubformContext: (obj)->\n\tdoc_values = WorkflowManager_format.getAutoformSchemaValues();\n\tobj[\"tableValues\"] = if doc_values then doc_values[obj.code] else []\n\tobj[\"formId\"] = formId;\n\treturn obj;\n\ninstance: ->\n\tSession.get(\"change_date\")\n\tif (Session.get(\"instanceId\"))\n\t\tsteedos_instance = WorkflowManager.getInstance();\n\t\treturn steedos_instance;\n\nequals: (a, b) ->\n\treturn (a == b)\n\nincludes: (a, b) ->\n\treturn b.split(',').includes(a);\n\nfields: ->\n\tform_version = WorkflowManager.getInstanceFormVersion();\n\tif form_version\n\t\treturn new SimpleSchema(WorkflowManager_format.getAutoformSchema(form_version));\n\ndoc_values: ->\n\tWorkflowManager_format.getAutoformSchemaValues();\n\ninstance_box_style: ->\n\tbox = Session.get(\"box\")\n\tif box == \"inbox\" || box == \"draft\"\n\t\tjudge = Session.get(\"judge\")\n\t\tif judge\n\t\t\tif (judge == \"approved\")\n\t\t\t\treturn \"box-success\"\n\t\t\telse if (judge == \"rejected\")\n\t\t\t\treturn \"box-danger\"\n\tins = WorkflowManager.getInstance();\n\tif ins && ins.final_decision\n\t\tif ins.final_decision == \"approved\"\n\t\t\treturn \"box-success\"\n\t\telse if (ins.final_decision == \"rejected\")\n\t\t\treturn \"box-danger\"\n\n\nTemplateManager.getTemplate = (instance, templateName) ->\n\tflow = db.flows.findOne(instance.flow);\n\tform = db.forms.findOne(instance.form);\n\n\tif templateName\n\t\tif templateName == 'table'\n\t\t\treturn TemplateManager._template.table(instance)\n\t\treturn TemplateManager._template.default(instance)\n\n\tif Session?.get(\"instancePrint\")\n\t\tif flow?.print_template\n\t\t\treturn \"
\" + flow.print_template + \"
\"\n\t\telse\n\t\t\tif flow?.instance_template\n\t\t\t\treturn \"
\" + flow.instance_template + \"
\"\n\t\t\telse\n\t\t\t\treturn TemplateManager._template.table(instance)\n\telse\n\t\tif Steedos.isMobile()\n\t\t\treturn TemplateManager._template.default(instance)\n\n\t\tif flow?.instance_template\n\t\t\treturn \"
\" + flow.instance_template + \"
\"\n\n\t\tif form?.instance_style\n\t\t\tif form.instance_style == 'table'\n\t\t\t\treturn TemplateManager._template.table(instance)\n\t\t\treturn TemplateManager._template.default(instance)\n\t\telse\n\t\t\treturn TemplateManager._template.default(instance)\n\n#TemplateManager.exportTemplate = (flowId) ->\n#\ttemplate = TemplateManager.getTemplate(flowId);\n#\n#\tflow = WorkflowManager.getFlow(flowId);\n#\n#\tif flow?.instance_template\n#\t\treturn template;\n#\n#\treturn template;\n\n","var formId; \n\nTemplateManager = {};\n\nformId = 'instanceform';\n\nTemplateManager.instance_title = function() {\n var pageTitle, pageTitleTrClass, val;\n pageTitle = \"{{instance.name}}\";\n pageTitleTrClass = \"instance-name\";\n if (typeof CoreForm !== \"undefined\" && CoreForm !== null ? CoreForm.pageTitleFieldName : void 0) {\n pageTitle = \"{{> afFormGroup name=\\\"\" + CoreForm.pageTitleFieldName + \"\\\" label=false}}\";\n pageTitleTrClass = \"\";\n }\n if (typeof CoreForm !== \"undefined\" && CoreForm !== null ? CoreForm.pageTitle : void 0) {\n pageTitle = \"\" + CoreForm.pageTitle;\n pageTitleTrClass = \"\";\n }\n val = {\n pageTitle: pageTitle,\n pageTitleTrClass: pageTitleTrClass\n };\n return val;\n};\n\nTemplateManager.handleTableTemplate = function(instance, _export) {\n var table_fields, template;\n template = \"
\\n\t\\n\t\t\\n\t\t\t\\n\t\t\\n\\n\t
\\n\t\t\t\t\" + (this.instance_title().pageTitle) + \"\\n\t\t\t
\\n\t\\n\t\t\t\\n\t\t\t\t\\n\t\t\t\t\\n\t\t\t\t\\n\t\t\t\t\\n\t\t\t\";\n table_fields = InstanceformTemplate.helpers.table_fields(instance);\n table_fields && table_fields.forEach(function(table_field) {\n var field_permission, pureCode, required, title_permission;\n required = \"\";\n if (!(typeof CoreForm !== \"undefined\" && CoreForm !== null ? CoreForm.pageTitleFieldName : void 0) || (typeof CoreForm !== \"undefined\" && CoreForm !== null ? CoreForm.pageTitleFieldName : void 0) !== table_field.code) {\n if (table_field.is_required) {\n required = \"is-required\";\n }\n if (_export) {\n required = \"\";\n }\n pureCode = Steedos.removeSpecialCharacter(table_field.code);\n if (InstanceformTemplate.helpers.isOpinionField(table_field)) {\n template += table_field.tr_start;\n template += \"\\n\";\n return template += table_field.tr_end;\n } else {\n if (InstanceformTemplate.helpers.includes(table_field.type, 'section,table')) {\n template += table_field.tr_start;\n template += \"\";\n return template += table_field.tr_end;\n } else {\n template += table_field.tr_start;\n if (_export) {\n title_permission = \"\";\n field_permission = \"\";\n } else {\n title_permission = \"title-\" + table_field.permission;\n field_permission = \"field-\" + table_field.permission;\n }\n template += \"\\n\";\n return template += table_field.tr_end;\n }\n }\n }\n });\n template += \"\t
\\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n\\n\t{{> instanceSignText name=\\\"\" + table_field.code + \"\\\"}}\\n\\n {{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n\\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n\\n\t{{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n
\\n\\n\t\\n\t\t\\n\t\t\t\\n\t\t\t\\n\t\t\\n\t\\n
\";\n return template;\n};\n\nTemplateManager._template = {\n \"default\": function(instance) {\n var template;\n template = \"
\\n\t
\\n\t\t

\" + (TemplateManager.instance_title().pageTitle) + \"

\\n\t\t\\n\t
\\n\t\\n
\\n{{#each steedos_form.fields}}\\n\t{{#if isOpinionField this}}\\n\t\t
\\n\t\t\t
\\n\t\t\t\t\\n\\n\t\t\t\t{{> instanceSignText name=this.code}}\\n\t\t\t
\\n\t\t
\\n\t{{else}}\\n\t\t{{#if includes this.type 'section,table'}}\\n\t\t\t
\\n\t\t\t\t{{> afFormGroup name=this.code label=false}}\\n\t\t\t
\\n\t\t{{else}}\\n\t\t\t
\\n\t\t\t{{> afFormGroup name=this.code}}\\n\t\t\t
\\n\t\t{{/if}}\\n\t{{/if}}\\n{{/each}}\\n
\\n\t
\\n\t
\\n\t\t
\\n\t\t {{_t \\\"instance_initiator\\\"}} :\\n\t\t
\\n\t\t{{>Template.dynamic template=\\\"afSelectUser\\\" data=applicantContext}}\\n\t
\\n\t
\\n
\";\n return template;\n },\n table: function(instance) {\n return TemplateManager.handleTableTemplate(instance);\n }\n};\n\nTemplateManager._templateHelps = {\n applicantContext: function() {\n var data, steedos_instance;\n steedos_instance = WorkflowManager.getInstance();\n data = {\n name: 'ins_applicant',\n atts: {\n name: 'ins_applicant',\n id: 'ins_applicant',\n \"class\": 'selectUser form-control',\n style: 'padding:6px 12px;width:140px;display:inline'\n }\n };\n data.atts.disabled = true;\n return data;\n }\n};\n\n({\n instanceId: function() {\n return 'instanceform';\n },\n form_types: function() {\n if (ApproveManager.isReadOnly()) {\n return 'disabled';\n } else {\n return 'method';\n }\n },\n steedos_form: function() {\n var form_version;\n form_version = WorkflowManager.getInstanceFormVersion();\n if (form_version) {\n return form_version;\n }\n },\n innersubformContext: function(obj) {\n var doc_values;\n doc_values = WorkflowManager_format.getAutoformSchemaValues();\n obj[\"tableValues\"] = doc_values ? doc_values[obj.code] : [];\n obj[\"formId\"] = formId;\n return obj;\n },\n instance: function() {\n var steedos_instance;\n Session.get(\"change_date\");\n if (Session.get(\"instanceId\")) {\n steedos_instance = WorkflowManager.getInstance();\n return steedos_instance;\n }\n },\n equals: function(a, b) {\n return a === b;\n },\n includes: function(a, b) {\n return b.split(',').includes(a);\n },\n fields: function() {\n var form_version;\n form_version = WorkflowManager.getInstanceFormVersion();\n if (form_version) {\n return new SimpleSchema(WorkflowManager_format.getAutoformSchema(form_version));\n }\n },\n doc_values: function() {\n return WorkflowManager_format.getAutoformSchemaValues();\n },\n instance_box_style: function() {\n var box, ins, judge;\n box = Session.get(\"box\");\n if (box === \"inbox\" || box === \"draft\") {\n judge = Session.get(\"judge\");\n if (judge) {\n if (judge === \"approved\") {\n return \"box-success\";\n } else if (judge === \"rejected\") {\n return \"box-danger\";\n }\n }\n }\n ins = WorkflowManager.getInstance();\n if (ins && ins.final_decision) {\n if (ins.final_decision === \"approved\") {\n return \"box-success\";\n } else if (ins.final_decision === \"rejected\") {\n return \"box-danger\";\n }\n }\n }\n});\n\nTemplateManager.getTemplate = function(instance, templateName) {\n var flow, form;\n flow = db.flows.findOne(instance.flow);\n form = db.forms.findOne(instance.form);\n if (templateName) {\n if (templateName === 'table') {\n return TemplateManager._template.table(instance);\n }\n return TemplateManager._template[\"default\"](instance);\n }\n if (typeof Session !== \"undefined\" && Session !== null ? Session.get(\"instancePrint\") : void 0) {\n if (flow != null ? flow.print_template : void 0) {\n return \"
\" + flow.print_template + \"
\";\n } else {\n if (flow != null ? flow.instance_template : void 0) {\n return \"
\" + flow.instance_template + \"
\";\n } else {\n return TemplateManager._template.table(instance);\n }\n }\n } else {\n if (Steedos.isMobile()) {\n return TemplateManager._template[\"default\"](instance);\n }\n if (flow != null ? flow.instance_template : void 0) {\n return \"
\" + flow.instance_template + \"
\";\n }\n if (form != null ? form.instance_style : void 0) {\n if (form.instance_style === 'table') {\n return TemplateManager._template.table(instance);\n }\n return TemplateManager._template[\"default\"](instance);\n } else {\n return TemplateManager._template[\"default\"](instance);\n }\n }\n};\n","SteedosTable = {};\n\nSteedosTable.formId = \"instanceform\";\n\nSteedosTable.checkItem = function (field, item_index) {\n var fieldObj = SteedosTable.getField(field);\n\n var fieldVal = SteedosTable.getItemModalValue(field, item_index);\n\n var sf_name = '';\n var rev = true;\n fieldObj.sfields.forEach(function (sf) {\n if (sf.permission == 'editable') {\n sf_name = fieldObj.code + \".\" + sf.code;\n if (!InstanceManager.checkFormFieldValue($(\"[name='\" + sf_name + \"']\")[0], sf_name, fieldVal[sf.code])) {\n rev = false;\n }\n }\n });\n\n return rev;\n}\n\nSteedosTable.setTableItemValue = function (field, item_index, item_value) {\n\n var tableValue = SteedosTable.getTableValue(field);\n tableValue[item_index] = item_value;\n}\n\nSteedosTable.getTableItemValue = function (field, item_index) {\n return SteedosTable.getTableValue(field)[item_index];\n}\n\nSteedosTable.removeTableItem = function (field, item_index) {\n var item_value = SteedosTable.getTableItemValue(field, item_index);\n item_value.removed = true;\n}\n\nSteedosTable.setTableValue = function (field, value) {\n $(\"table[name='\" + field + \"']\").val({\n val: value\n });\n}\n\nSteedosTable.getTableValue = function (field) {\n return $(\"table[name='\" + field + \"']\").val().val;\n}\n\nSteedosTable.getValidValue = function (field) {\n var value = SteedosTable.getTableValue(field);\n\n if (!value) {\n return\n }\n\n var validValue = [];\n\n value.forEach(function (v) {\n if (!v.removed) {\n validValue.push(v);\n }\n });\n return validValue;\n}\n\n\nSteedosTable.handleData = function (field, values) {\n\n if (!values || !(values instanceof Array)) {\n return values;\n }\n\n var fieldObj = SteedosTable.getField(field);\n\n values.forEach(function (v) {\n fieldObj.sfields.forEach(function (f) {\n if (f.type == 'user' || f.type == 'group') {\n var value = v[f.code]\n if (f.is_multiselect) {\n if (value && value.length > 0 && typeof (value[0]) == 'object') {\n v[f.code] = v[f.code].getProperty(\"id\");\n }\n } else {\n if (value && typeof (value) == 'object') {\n v[f.code] = v[f.code].id;\n }\n }\n } else if (f.type == 'dateTime') {\n var value = v[f.code]\n if (value) {\n if (value.length == 16) {\n var t = value.split(\"T\");\n var t0 = t[0].split(\"-\");\n var t1 = t[1].split(\":\");\n\n year = t0[0];\n month = t0[1];\n date = t0[2];\n hours = t1[0];\n seconds = t1[1];\n value = new Date(year, month - 1, date, hours, seconds);\n v[f.code] = value;\n }\n\n }\n }\n });\n });\n return values;\n}\n\nSteedosTable.getField = function (field) {\n var instanceFields = WorkflowManager.getInstanceFields();\n if (!instanceFields)\n return;\n\n var fieldObj = instanceFields.findPropertyByPK(\"code\", field);\n\n return fieldObj;\n}\n\n\nSteedosTable.getModalData = function (field, index) {\n\n var data = {};\n\n var fieldObj = SteedosTable.getField(field);\n\n if (!fieldObj) {\n return;\n }\n\n data.field = fieldObj;\n\n data.field.formula = Form_formula.getFormulaFieldVariable(\"Form_formula.field_values\", fieldObj.sfields);\n\n data.value = {};\n\n data.value[field] = SteedosTable.getTableItemValue(field, index);\n\n data.index = index;\n\n return data;\n}\n\n\n\nSteedosTable.getItemModalValue = function (field, item_index) {\n\n if (!AutoForm.getFormValues(\"steedos_table_modal_\" + field + \"_\" + item_index)) {\n return {}\n }\n\n var item_value = AutoForm.getFormValues(\"steedos_table_modal_\" + field + \"_\" + item_index).insertDoc[field];\n return item_value;\n}\n\n\nSteedosTable.addItem = function (field, index, _item_value) {\n var keys = SteedosTable.getKeys(field);\n var item_value = _item_value || SteedosTable.getItemModalValue(field, index);\n $(\"tbody[name='\" + field + \"Tbody']\").append(SteedosTable.getTr(keys, item_value, index, field, true))\n\n}\n\nSteedosTable.updateItem = function (field, index, _item_value) {\n\n var item = $(\"tr[name='\" + field + \"_item_\" + index + \"']\");\n\n var item_value = _item_value || SteedosTable.getItemModalValue(field, index);\n\n if (item && item.length > 0) {\n var keys = SteedosTable.getKeys(field);\n var tds = SteedosTable.getRemoveTd(field, index);\n\n var sfields = SteedosTable.getField(field).sfields;\n\n keys.forEach(function (key) {\n var sfield = sfields.findPropertyByPK(\"code\", key);\n\n var value = item_value[key];\n\n tds = tds + SteedosTable.getTd(sfield, index, value);\n\n });\n\n item.empty();\n\n item.append(tds);\n\n } else {\n\n SteedosTable.addItem(field, index);\n }\n\n if (SteedosTable.getTableValue(field)) {\n\n SteedosTable.setTableItemValue(field, index, item_value);\n\n //SteedosTable.valueHash[field][index] = item_value;\n\n } else {\n //SteedosTable.valueHash[field] = [item_value];\n\n SteedosTable.setTableValue(field, [item_value])\n\n }\n\n //执行主表公式计算\n InstanceManager.runFormula(field);\n\n}\n\nSteedosTable.removeItem = function (field, index) {\n\n $(\"tr[name='\" + field + \"_item_\" + index + \"']\").hide();\n\n SteedosTable.removeTableItem(field, index);\n\n InstanceManager.runFormula(field);\n}\n\nSteedosTable.showModal = function (field, index, method) {\n\n\n var modalData = SteedosTable.getModalData(field, index);\n\n modalData.method = method;\n setTimeout(function(){\n Modal.show(\"steedosTableModal\", modalData);\n }, 300)\n}\n\nSteedosTable.getKeys = function (field) {\n if (!AutoForm.getCurrentDataForForm(SteedosTable.formId)) {\n return [];\n }\n\n var ss = AutoForm.getFormSchema(SteedosTable.formId);\n\n var keys = [];\n\n if (ss.schema(field + \".$\").type === Object) {\n keys = ss.objectKeys(SimpleSchema._makeGeneric(field) + '.$')\n }\n\n return keys;\n\n}\n\nSteedosTable.getThead = function (field, editable) {\n\n var fieldObj = field;\n if (!_.isObject(field))\n fieldObj = SteedosTable.getField(field);\n\n if (!fieldObj) {\n return '';\n }\n\n var thead = '',\n trs = '',\n label = '',\n width = 100;\n\n if (editable) {\n // trs = \"\"\n trs = \"\"\n }\n\n var sfields = fieldObj.sfields;\n\n if (!sfields) {\n return thead;\n }\n\n var sf_length = sfields.length;\n\n if (sf_length > 0) {\n var wide_fields = sfields.filterProperty(\"is_wide\", true);\n\n width = 100 / (sf_length + wide_fields.length);\n }\n\n sfields.forEach(function (sf, index) {\n\n label = (sf.name != null && sf.name.length > 0) ? sf.name : sf.code;\n\n trs = trs + \"\" + label + \"\"\n });\n\n thead = '' + trs + '';\n\n return thead;\n}\n\nSteedosTable.getTbody = function (keys, field, values, editable, sfieldsEditable) {\n var tbody = \"\";\n\n if (values instanceof Array) {\n values.forEach(function (value, index) {\n tbody = tbody + SteedosTable.getTr(keys, value, index, field, editable, sfieldsEditable);\n });\n }\n\n return tbody;\n}\n\nSteedosTable.getTr = function (keys, item_value, index, field, editable, sfieldsEditable) {\n\n var fieldObj = field;\n if (!_.isObject(field))\n fieldObj = SteedosTable.getField(field);\n\n var tr = \"\";\n\n var tds = \"\";\n\n if (editable) {\n tds = SteedosTable.getRemoveTd(fieldObj.code, index);\n }\n\n var sfields = fieldObj.sfields;\n\n keys.forEach(function (key) {\n var sfield = sfields.findPropertyByPK(\"code\", key);\n\n var value = item_value[key];\n\n tds = tds + SteedosTable.getTd(sfield, index, value);\n\n });\n\n tr = tr + tds + \"\";\n return tr;\n}\n\nSteedosTable.getRemoveTd = function (field, index) {\n // return \"