{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-promise/dist/es6-promise.js","node_modules/events/events.js","node_modules/process/browser.js","node_modules/webworkify/index.js","src/config.js","src/core/features.js","src/core/media-info.js","src/core/media-segment-info.js","src/core/mse-controller.js","src/core/mse-events.js","src/core/transmuxer.js","src/core/transmuxing-controller.js","src/core/transmuxing-events.js","src/core/transmuxing-worker.js","src/demux/amf-parser.js","src/demux/demux-errors.js","src/demux/exp-golomb.js","src/demux/flv-demuxer.js","src/demux/sps-parser.js","src/flv.js","src/index.js","src/io/fetch-stream-loader.js","src/io/io-controller.js","src/io/loader.js","src/io/param-seek-handler.js","src/io/range-seek-handler.js","src/io/speed-sampler.js","src/io/websocket-loader.js","src/io/xhr-moz-chunked-loader.js","src/io/xhr-msstream-loader.js","src/io/xhr-range-loader.js","src/player/flv-player.js","src/player/native-player.js","src/player/player-errors.js","src/player/player-events.js","src/remux/aac-silent.js","src/remux/mp4-generator.js","src/remux/mp4-remuxer.js","src/utils/browser.js","src/utils/exception.js","src/utils/logger.js","src/utils/logging-control.js","src/utils/polyfill.js","src/utils/utf8-conv.js"],"names":[],"mappings":"AAAA;;ACAA;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;;;;ACtoCA;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;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;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;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;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;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;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;AACA;;AC9SA;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;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;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;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;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","file":"flv.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n*/\nfunction Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve;\nPromise.reject = reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n constructor: Promise,\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n then: then,\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nfunction polyfill() {\n var local = undefined;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise;\n}\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\n\nreturn Promise;\n\n})));\n//# sourceMappingURL=es6-promise.map\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n Function(['require','module','exports'], '(' + fn + ')(self)'),\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n Function(['require'], (\n // try to call default if defined to also support babel esmodule\n // exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);'\n )),\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false\n // referrerPolicy: leave as unspecified\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n mseFlvPlayback: false,\n mseLiveFlvPlayback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.mseFlvPlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n this.duration != null &&\n this.metadata != null &&\n this.hasKeyframesIndex != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n ms.removeSourceBuffer(sb);\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n let work = require('webworkify');\n this._worker = work(TransmuxingWorker);\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let probeData = null;\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else if ((probeData = FLVDemuxer.probe(data)).match) {\n // Always create new FLVDemuxer\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n probeData = null;\n Log.e(this.TAG, 'Non-FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');\n\n consumed = 0;\n }\n\n return consumed;\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n this._loadSegment(nextSegmentIndex);\n } else {\n this._remuxer.flushStashedSamples();\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport Polyfill from '../utils/polyfill.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\n\n/* post message to worker:\n data: {\n cmd: string\n param: any\n }\n\n receive message from worker:\n data: {\n msg: string,\n data: any\n }\n */\n\nlet TransmuxingWorker = function (self) {\n\n let TAG = 'TransmuxingWorker';\n let controller = null;\n let logcatListener = onLogcatCallback.bind(this);\n\n Polyfill.install();\n\n self.addEventListener('message', function (e) {\n switch (e.data.cmd) {\n case 'init':\n controller = new TransmuxingController(e.data.param[0], e.data.param[1]);\n controller.on(TransmuxingEvents.IO_ERROR, onIOError.bind(this));\n controller.on(TransmuxingEvents.DEMUX_ERROR, onDemuxError.bind(this));\n controller.on(TransmuxingEvents.INIT_SEGMENT, onInitSegment.bind(this));\n controller.on(TransmuxingEvents.MEDIA_SEGMENT, onMediaSegment.bind(this));\n controller.on(TransmuxingEvents.LOADING_COMPLETE, onLoadingComplete.bind(this));\n controller.on(TransmuxingEvents.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));\n controller.on(TransmuxingEvents.MEDIA_INFO, onMediaInfo.bind(this));\n controller.on(TransmuxingEvents.STATISTICS_INFO, onStatisticsInfo.bind(this));\n controller.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));\n break;\n case 'destroy':\n if (controller) {\n controller.destroy();\n controller = null;\n }\n self.postMessage({msg: 'destroyed'});\n break;\n case 'start':\n controller.start();\n break;\n case 'stop':\n controller.stop();\n break;\n case 'seek':\n controller.seek(e.data.param);\n break;\n case 'pause':\n controller.pause();\n break;\n case 'resume':\n controller.resume();\n break;\n case 'logging_config': {\n let config = e.data.param;\n LoggingControl.applyConfig(config);\n\n if (config.enableCallback === true) {\n LoggingControl.addLogListener(logcatListener);\n } else {\n LoggingControl.removeLogListener(logcatListener);\n }\n break;\n }\n }\n });\n\n function onInitSegment(type, initSegment) {\n let obj = {\n msg: TransmuxingEvents.INIT_SEGMENT,\n data: {\n type: type,\n data: initSegment\n }\n };\n self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer\n }\n\n function onMediaSegment(type, mediaSegment) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_SEGMENT,\n data: {\n type: type,\n data: mediaSegment\n }\n };\n self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer\n }\n\n function onLoadingComplete() {\n let obj = {\n msg: TransmuxingEvents.LOADING_COMPLETE\n };\n self.postMessage(obj);\n }\n\n function onRecoveredEarlyEof() {\n let obj = {\n msg: TransmuxingEvents.RECOVERED_EARLY_EOF\n };\n self.postMessage(obj);\n }\n\n function onMediaInfo(mediaInfo) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_INFO,\n data: mediaInfo\n };\n self.postMessage(obj);\n }\n\n function onStatisticsInfo(statInfo) {\n let obj = {\n msg: TransmuxingEvents.STATISTICS_INFO,\n data: statInfo\n };\n self.postMessage(obj);\n }\n\n function onIOError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.IO_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onDemuxError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.DEMUX_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onRecommendSeekpoint(milliseconds) {\n self.postMessage({\n msg: TransmuxingEvents.RECOMMEND_SEEKPOINT,\n data: milliseconds\n });\n }\n\n function onLogcatCallback(type, str) {\n self.postMessage({\n msg: 'logcat_callback',\n data: {\n type: type,\n logcat: str\n }\n });\n }\n\n};\n\nexport default TransmuxingWorker;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n Log.w(this.TAG, 'Found another AudioSpecificConfig!');\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let frameType = (spec & 240) >>> 4;\n let codecId = spec & 15;\n\n if (codecId !== 7) {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n Log.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport FlvPlayer from './player/flv-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'flv':\n return new FlvPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet flvjs = {};\n\nflvjs.createPlayer = createPlayer;\nflvjs.isSupported = isSupported;\nflvjs.getFeatureList = getFeatureList;\n\nflvjs.Events = PlayerEvents;\nflvjs.ErrorTypes = ErrorTypes;\nflvjs.ErrorDetails = ErrorDetails;\n\nflvjs.FlvPlayer = FlvPlayer;\nflvjs.NativePlayer = NativePlayer;\nflvjs.LoggingControl = LoggingControl;\n\nObject.defineProperty(flvjs, 'version', {\n enumerable: true,\n get: function () {\n // replaced by browserify-versionify transform\n return '__VERSION__';\n }\n});\n\nexport default flvjs;","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./flv.js').default;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._requestAbort = false;\n this._status = LoaderStatus.kIdle;\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n } else {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 1024 * 384; // default initial size: 384KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use single normalized speed for size of stashSizeKB\n stashSizeKB = normalized;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* Notice: ms-stream may cause IE/Edge browser crash if seek too frequently!!!\n * The browser may crash in wininet.dll. Disable for now.\n *\n * For IE11/Edge browser by microsoft which supports `xhr.responseType = 'ms-stream'`\n * Notice that ms-stream API sucks. The buffer is always expanding along with downloading.\n *\n * We need to abort the xhr if buffer size exceeded limit size (e.g. 16 MiB), then do reconnect.\n * in order to release previous ArrayBuffer to avoid memory leak\n *\n * Otherwise, the ArrayBuffer will increase to a terrible size that equals final file size.\n */\nclass MSStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n if (typeof self.MSStream === 'undefined' || typeof self.MSStreamReader === 'undefined') {\n return false;\n }\n\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'ms-stream';\n return (xhr.responseType === 'ms-stream');\n } catch (e) {\n Log.w('MSStreamLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-msstream-loader');\n this.TAG = 'MSStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._reader = null; // MSStreamReader\n\n this._totalRange = null;\n this._currentRange = null;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n\n this._contentLength = null;\n this._receivedLength = 0;\n\n this._bufferLimit = 16 * 1024 * 1024; // 16MB\n this._lastTimeBufferSize = 0;\n this._isReconnecting = false;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._reader) {\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._internalOpen(dataSource, range, false);\n }\n\n _internalOpen(dataSource, range, isSubrange) {\n this._dataSource = dataSource;\n\n if (!isSubrange) {\n this._totalRange = range;\n } else {\n this._currentRange = range;\n }\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let reader = this._reader = new self.MSStreamReader();\n reader.onprogress = this._msrOnProgress.bind(this);\n reader.onload = this._msrOnLoad.bind(this);\n reader.onerror = this._msrOnError.bind(this);\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'ms-stream';\n xhr.onreadystatechange = this._xhrOnReadyStateChange.bind(this);\n xhr.onerror = this._xhrOnError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n if (this._isReconnecting) {\n this._isReconnecting = false;\n } else {\n this._status = LoaderStatus.kConnecting;\n }\n xhr.send();\n }\n\n abort() {\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._reader) {\n if (this._reader.readyState === 1) { // LOADING\n this._reader.abort();\n }\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.abort();\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n }\n\n _xhrOnReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n if (xhr.responseURL != undefined) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n let lengthHeader = xhr.getResponseHeader('Content-Length');\n if (lengthHeader != null && this._contentLength == null) {\n let length = parseInt(lengthHeader);\n if (length > 0) {\n this._contentLength = length;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MSStreamLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n } else if (xhr.readyState === 3) { // LOADING\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n let msstream = xhr.response;\n this._reader.readAsArrayBuffer(msstream);\n }\n }\n }\n\n _xhrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EXCEPTION;\n let info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n _msrOnProgress(e) {\n let reader = e.target;\n let bigbuffer = reader.result;\n if (bigbuffer == null) { // result may be null, workaround for buggy M$\n this._doReconnectIfNeeded();\n return;\n }\n\n let slice = bigbuffer.slice(this._lastTimeBufferSize);\n this._lastTimeBufferSize = bigbuffer.byteLength;\n let byteStart = this._totalRange.from + this._receivedLength;\n this._receivedLength += slice.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(slice, byteStart, this._receivedLength);\n }\n\n if (bigbuffer.byteLength >= this._bufferLimit) {\n Log.v(this.TAG, `MSStream buffer exceeded max size near ${byteStart + slice.byteLength}, reconnecting...`);\n this._doReconnectIfNeeded();\n }\n }\n\n _doReconnectIfNeeded() {\n if (this._contentLength == null || this._receivedLength < this._contentLength) {\n this._isReconnecting = true;\n this._lastTimeBufferSize = 0;\n this._internalAbort();\n\n let range = {\n from: this._totalRange.from + this._receivedLength,\n to: -1\n };\n this._internalOpen(this._dataSource, range, true);\n }\n }\n\n _msrOnLoad(e) { // actually it is onComplete event\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._totalRange.from, this._totalRange.from + this._receivedLength - 1);\n }\n }\n\n _msrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'MSStream meet Early-Eof'};\n } else {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n}\n\nexport default MSStreamLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass FlvPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'FlvPlayer';\n this._type = 'FlvPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() !== 'flv') {\n throw new InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default FlvPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n ); \n return result; \n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport {SampleInfo, MediaSegmentInfo, MediaSegmentInfoList} from '../core/media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n this._remuxVideo(videoTrack);\n this._remuxAudio(audioTrack);\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({unit: silentUnit, dts: dts, pts: dts});\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts - dtsCorrection;\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n\n let needFillSilentFrames = false;\n let silentFrames = null;\n\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n if (sampleDuration > refSampleDuration * 1.5 && this._audioMeta.codec !== 'mp3' && this._fillAudioTimestampGap && !Browser.safari) {\n // We need to insert silent frames to fill timestamp gap\n needFillSilentFrames = true;\n let delta = Math.abs(sampleDuration - refSampleDuration);\n let frameCount = Math.ceil(delta / refSampleDuration);\n let currentDts = dts + refSampleDuration; // Notice: in float\n\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `dts: ${dts + sampleDuration} ms, expected: ${dts + Math.round(refSampleDuration)} ms, ` +\n `delta: ${Math.round(delta)} ms, generate: ${frameCount} frames`);\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n let intDts = Math.round(currentDts); // round to integer\n if (silentFrames.length > 0) {\n // Set previous frame sample duration\n let previousFrame = silentFrames[silentFrames.length - 1];\n previousFrame.duration = intDts - previousFrame.dts;\n }\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: 0, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += unit.byteLength;\n currentDts += refSampleDuration;\n }\n\n // last frame: align end time to next frame dts\n let lastFrame = silentFrames[silentFrames.length - 1];\n lastFrame.duration = dts + sampleDuration - lastFrame.dts;\n\n // silentFrames.forEach((frame) => {\n // Log.w(this.TAG, `SilentAudio: dts: ${frame.dts}, duration: ${frame.duration}`);\n // });\n\n // Set correct sample duration for current frame\n sampleDuration = Math.round(refSampleDuration);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'flv.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LXByb21pc2UvZGlzdC9lczYtcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy93ZWJ3b3JraWZ5L2luZGV4LmpzIiwic3JjXFxjb25maWcuanMiLCJzcmNcXGNvcmVcXGZlYXR1cmVzLmpzIiwic3JjXFxjb3JlXFxtZWRpYS1pbmZvLmpzIiwic3JjXFxjb3JlXFxtZWRpYS1zZWdtZW50LWluZm8uanMiLCJzcmNcXGNvcmVcXG1zZS1jb250cm9sbGVyLmpzIiwic3JjXFxjb3JlXFxtc2UtZXZlbnRzLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGVyLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGluZy1jb250cm9sbGVyLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGluZy1ldmVudHMuanMiLCJzcmNcXGNvcmVcXHRyYW5zbXV4aW5nLXdvcmtlci5qcyIsInNyY1xcZGVtdXhcXGFtZi1wYXJzZXIuanMiLCJzcmNcXGRlbXV4XFxkZW11eC1lcnJvcnMuanMiLCJzcmNcXGRlbXV4XFxleHAtZ29sb21iLmpzIiwic3JjXFxkZW11eFxcZmx2LWRlbXV4ZXIuanMiLCJzcmNcXGRlbXV4XFxzcHMtcGFyc2VyLmpzIiwic3JjXFxmbHYuanMiLCJzcmNcXGluZGV4LmpzIiwic3JjXFxpb1xcZmV0Y2gtc3RyZWFtLWxvYWRlci5qcyIsInNyY1xcaW9cXGlvLWNvbnRyb2xsZXIuanMiLCJzcmNcXGlvXFxsb2FkZXIuanMiLCJzcmNcXGlvXFxwYXJhbS1zZWVrLWhhbmRsZXIuanMiLCJzcmNcXGlvXFxyYW5nZS1zZWVrLWhhbmRsZXIuanMiLCJzcmNcXGlvXFxzcGVlZC1zYW1wbGVyLmpzIiwic3JjXFxpb1xcd2Vic29ja2V0LWxvYWRlci5qcyIsInNyY1xcaW9cXHhoci1tb3otY2h1bmtlZC1sb2FkZXIuanMiLCJzcmNcXGlvXFx4aHItbXNzdHJlYW0tbG9hZGVyLmpzIiwic3JjXFxpb1xceGhyLXJhbmdlLWxvYWRlci5qcyIsInNyY1xccGxheWVyXFxmbHYtcGxheWVyLmpzIiwic3JjXFxwbGF5ZXJcXG5hdGl2ZS1wbGF5ZXIuanMiLCJzcmNcXHBsYXllclxccGxheWVyLWVycm9ycy5qcyIsInNyY1xccGxheWVyXFxwbGF5ZXItZXZlbnRzLmpzIiwic3JjXFxyZW11eFxcYWFjLXNpbGVudC5qcyIsInNyY1xccmVtdXhcXG1wNC1nZW5lcmF0b3IuanMiLCJzcmNcXHJlbXV4XFxtcDQtcmVtdXhlci5qcyIsInNyY1xcdXRpbHNcXGJyb3dzZXIuanMiLCJzcmNcXHV0aWxzXFxleGNlcHRpb24uanMiLCJzcmNcXHV0aWxzXFxsb2dnZXIuanMiLCJzcmNcXHV0aWxzXFxsb2dnaW5nLWNvbnRyb2wuanMiLCJzcmNcXHV0aWxzXFxwb2x5ZmlsbC5qcyIsInNyY1xcdXRpbHNcXHV0ZjgtY29udi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3RvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUksQ0FBVixJQUFlLElBQWhCLEtBQXlCLEVBQWxELEdBQ0EsQ0FBQyxNQUFNLElBQUksQ0FBVixJQUFlLElBQWhCLEtBQXlCLENBRHpCLEdBQzhCLE1BQU0sSUFBSSxDQUFWLElBQWUsSUFEeEQ7QUFFQSxvQkFBSSxRQUFPLE9BQVAsSUFBa0IsUUFBTyxRQUE3QixFQUF1QztBQUNuQyw2QkFBUSxPQUFSO0FBQ0Esd0JBQUksSUFBSixDQUFTLE9BQU8sWUFBUCxDQUFxQixVQUFTLEVBQVYsR0FBZ0IsTUFBcEMsQ0FBVDtBQUNBLHdCQUFJLElBQUosQ0FBUyxPQUFPLFlBQVAsQ0FBcUIsUUFBTyxLQUFSLEdBQWlCLE1BQXJDLENBQVQ7QUFDQSx5QkFBSyxDQUFMO0FBQ0E7QUFDSDtBQUNKO0FBQ0o7QUFDRCxZQUFJLElBQUosQ0FBUyxPQUFPLFlBQVAsQ0FBb0IsTUFBcEIsQ0FBVDtBQUNBLFVBQUUsQ0FBRjtBQUNIOztBQUVELFdBQU8sSUFBSSxJQUFKLENBQVMsRUFBVCxDQUFQO0FBQ0g7O2tCQUVjLFUiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3N0ZWZhbnBlbm5lci9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICA0LjEuMFxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgKGdsb2JhbC5FUzZQcm9taXNlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgX2lzQXJyYXkgPSB1bmRlZmluZWQ7XG5pZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG59IGVsc2Uge1xuICBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG59XG5cbnZhciBpc0FycmF5ID0gX2lzQXJyYXk7XG5cbnZhciBsZW4gPSAwO1xudmFyIHZlcnR4TmV4dCA9IHVuZGVmaW5lZDtcbnZhciBjdXN0b21TY2hlZHVsZXJGbiA9IHVuZGVmaW5lZDtcblxudmFyIGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgcXVldWVbbGVuXSA9IGNhbGxiYWNrO1xuICBxdWV1ZVtsZW4gKyAxXSA9IGFyZztcbiAgbGVuICs9IDI7XG4gIGlmIChsZW4gPT09IDIpIHtcbiAgICAvLyBJZiBsZW4gaXMgMiwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgaWYgKGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICBjdXN0b21TY2hlZHVsZXJGbihmbHVzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gIGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbn1cblxuZnVuY3Rpb24gc2V0QXNhcChhc2FwRm4pIHtcbiAgYXNhcCA9IGFzYXBGbjtcbn1cblxudmFyIGJyb3dzZXJXaW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbnZhciBicm93c2VyR2xvYmFsID0gYnJvd3NlcldpbmRvdyB8fCB7fTtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgaXNOb2RlID0gdHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAoe30pLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbnZhciBpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8vIG5vZGVcbmZ1bmN0aW9uIHVzZU5leHRUaWNrKCkge1xuICAvLyBub2RlIHZlcnNpb24gMC4xMC54IGRpc3BsYXlzIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5leHRUaWNrIGlzIHVzZWQgcmVjdXJzaXZlbHlcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jdWpvanMvd2hlbi9pc3N1ZXMvNDEwIGZvciBkZXRhaWxzXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xufVxuXG4vLyB2ZXJ0eFxuZnVuY3Rpb24gdXNlVmVydHhUaW1lcigpIHtcbiAgaWYgKHR5cGVvZiB2ZXJ0eE5leHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZlcnR4TmV4dChmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgdmFyIG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgbm9kZS5kYXRhID0gaXRlcmF0aW9ucyA9ICsraXRlcmF0aW9ucyAlIDI7XG4gIH07XG59XG5cbi8vIHdlYiB3b3JrZXJcbmZ1bmN0aW9uIHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VTZXRUaW1lb3V0KCkge1xuICAvLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBlczYtcHJvbWlzZSB3aWxsIGJlIHVuYWZmZWN0ZWQgYnlcbiAgLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG4gIHZhciBnbG9iYWxTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU2V0VGltZW91dChmbHVzaCwgMSk7XG4gIH07XG59XG5cbnZhciBxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcbmZ1bmN0aW9uIGZsdXNoKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG4gICAgdmFyIGFyZyA9IHF1ZXVlW2kgKyAxXTtcblxuICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICBxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICBxdWV1ZVtpICsgMV0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0VmVydHgoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHIgPSByZXF1aXJlO1xuICAgIHZhciB2ZXJ0eCA9IHIoJ3ZlcnR4Jyk7XG4gICAgdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICByZXR1cm4gdXNlVmVydHhUaW1lcigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbiAgfVxufVxuXG52YXIgc2NoZWR1bGVGbHVzaCA9IHVuZGVmaW5lZDtcbi8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG5pZiAoaXNOb2RlKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VOZXh0VGljaygpO1xufSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTXV0YXRpb25PYnNlcnZlcigpO1xufSBlbHNlIGlmIChpc1dvcmtlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTtcbn0gZWxzZSBpZiAoYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSBhdHRlbXB0VmVydHgoKTtcbn0gZWxzZSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIF9hcmd1bWVudHMgPSBhcmd1bWVudHM7XG5cbiAgdmFyIHBhcmVudCA9IHRoaXM7XG5cbiAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaWYgKGNoaWxkW1BST01JU0VfSURdID09PSB1bmRlZmluZWQpIHtcbiAgICBtYWtlUHJvbWlzZShjaGlsZCk7XG4gIH1cblxuICB2YXIgX3N0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICBpZiAoX3N0YXRlKSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjYWxsYmFjayA9IF9hcmd1bWVudHNbX3N0YXRlIC0gMV07XG4gICAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGludm9rZUNhbGxiYWNrKF9zdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCBwYXJlbnQuX3Jlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KSgpO1xuICB9IGVsc2Uge1xuICAgIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gIH1cblxuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdpdGggdGhlXG4gIHBhc3NlZCBgdmFsdWVgLiBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVzb2x2ZSgxKTtcbiAgfSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoMSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZXNvbHZlXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBbnl9IHZhbHVlIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuXG4gIGB2YWx1ZWBcbiovXG5mdW5jdGlvbiByZXNvbHZlKG9iamVjdCkge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgX3Jlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbnZhciBQUk9NSVNFX0lEID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDE2KTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBQRU5ESU5HID0gdm9pZCAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xuXG52YXIgR0VUX1RIRU5fRVJST1IgPSBuZXcgRXJyb3JPYmplY3QoKTtcblxuZnVuY3Rpb24gc2VsZkZ1bGZpbGxtZW50KCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG59XG5cbmZ1bmN0aW9uIGNhbm5vdFJldHVybk93bigpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGhlbihwcm9taXNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgIHJldHVybiBHRVRfVEhFTl9FUlJPUjtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgYXNhcChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IgPSB0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChzZWFsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHNlYWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTtcblxuICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgX3JlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgfVxuICB9LCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gRlVMRklMTEVEKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgX3JlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHJldHVybiBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuJCQpIHtcbiAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IgJiYgdGhlbiQkID09PSB0aGVuICYmIG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IucmVzb2x2ZSA9PT0gcmVzb2x2ZSkge1xuICAgIGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICB9IGVsc2Uge1xuICAgIGlmICh0aGVuJCQgPT09IEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgIEdFVF9USEVOX0VSUk9SLmVycm9yID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoZW4kJCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0aGVuJCQpKSB7XG4gICAgICBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgX3JlamVjdChwcm9taXNlLCBzZWxmRnVsZmlsbG1lbnQoKSk7XG4gIH0gZWxzZSBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCBnZXRUaGVuKHZhbHVlKSk7XG4gIH0gZWxzZSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICB9XG5cbiAgcHVibGlzaChwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fc3RhdGUgPSBGVUxGSUxMRUQ7XG5cbiAgaWYgKHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzYXAocHVibGlzaCwgcHJvbWlzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb21pc2UuX3N0YXRlID0gUkVKRUNURUQ7XG4gIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICBhc2FwKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIF9zdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7XG4gIHZhciBsZW5ndGggPSBfc3Vic2NyaWJlcnMubGVuZ3RoO1xuXG4gIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgX3N1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICBfc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwYXJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkge1xuICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdW5kZWZpbmVkLFxuICAgICAgY2FsbGJhY2sgPSB1bmRlZmluZWQsXG4gICAgICBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xufVxuXG5mdW5jdGlvbiBFcnJvck9iamVjdCgpIHtcbiAgdGhpcy5lcnJvciA9IG51bGw7XG59XG5cbnZhciBUUllfQ0FUQ0hfRVJST1IgPSBuZXcgRXJyb3JPYmplY3QoKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICB0cnkge1xuICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICByZXR1cm4gVFJZX0NBVENIX0VSUk9SO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgdmFyIGhhc0NhbGxiYWNrID0gaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yID0gdW5kZWZpbmVkLFxuICAgICAgc3VjY2VlZGVkID0gdW5kZWZpbmVkLFxuICAgICAgZmFpbGVkID0gdW5kZWZpbmVkO1xuXG4gIGlmIChoYXNDYWxsYmFjaykge1xuICAgIHZhbHVlID0gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICBpZiAodmFsdWUgPT09IFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICB2YWx1ZS5lcnJvciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIGNhbm5vdFJldHVybk93bigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBkZXRhaWw7XG4gICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIC8vIG5vb3BcbiAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgIF9yZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgX3JlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBGVUxGSUxMRUQpIHtcbiAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gUkVKRUNURUQpIHtcbiAgICAgIF9yZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgdHJ5IHtcbiAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkge1xuICAgICAgX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBfcmVqZWN0KHByb21pc2UsIGUpO1xuICB9XG59XG5cbnZhciBpZCA9IDA7XG5mdW5jdGlvbiBuZXh0SWQoKSB7XG4gIHJldHVybiBpZCsrO1xufVxuXG5mdW5jdGlvbiBtYWtlUHJvbWlzZShwcm9taXNlKSB7XG4gIHByb21pc2VbUFJPTUlTRV9JRF0gPSBpZCsrO1xuICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgcHJvbWlzZS5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICBwcm9taXNlLl9zdWJzY3JpYmVycyA9IFtdO1xufVxuXG5mdW5jdGlvbiBFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcblxuICBpZiAoIXRoaXMucHJvbWlzZVtQUk9NSVNFX0lEXSkge1xuICAgIG1ha2VQcm9taXNlKHRoaXMucHJvbWlzZSk7XG4gIH1cblxuICBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICB0aGlzLl9lbnVtZXJhdGUoKTtcbiAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIF9yZWplY3QodGhpcy5wcm9taXNlLCB2YWxpZGF0aW9uRXJyb3IoKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGlvbkVycm9yKCkge1xuICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbn07XG5cbkVudW1lcmF0b3IucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIF9pbnB1dCA9IHRoaXMuX2lucHV0O1xuXG4gIGZvciAodmFyIGkgPSAwOyB0aGlzLl9zdGF0ZSA9PT0gUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLl9lYWNoRW50cnkoX2lucHV0W2ldLCBpKTtcbiAgfVxufTtcblxuRW51bWVyYXRvci5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICB2YXIgYyA9IHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3I7XG4gIHZhciByZXNvbHZlJCQgPSBjLnJlc29sdmU7XG5cbiAgaWYgKHJlc29sdmUkJCA9PT0gcmVzb2x2ZSkge1xuICAgIHZhciBfdGhlbiA9IGdldFRoZW4oZW50cnkpO1xuXG4gICAgaWYgKF90aGVuID09PSB0aGVuICYmIGVudHJ5Ll9zdGF0ZSAhPT0gUEVORElORykge1xuICAgICAgdGhpcy5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgX3RoZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgdGhpcy5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgfSBlbHNlIGlmIChjID09PSBQcm9taXNlKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBjKG5vb3ApO1xuICAgICAgaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBlbnRyeSwgX3RoZW4pO1xuICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHByb21pc2UsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93aWxsU2V0dGxlQXQobmV3IGMoZnVuY3Rpb24gKHJlc29sdmUkJCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSQkKGVudHJ5KTtcbiAgICAgIH0pLCBpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fd2lsbFNldHRsZUF0KHJlc29sdmUkJChlbnRyeSksIGkpO1xuICB9XG59O1xuXG5FbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24gKHN0YXRlLCBpLCB2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZTtcblxuICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICB0aGlzLl9yZW1haW5pbmctLTtcblxuICAgIGlmIChzdGF0ZSA9PT0gUkVKRUNURUQpIHtcbiAgICAgIF9yZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICB9XG59O1xuXG5FbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24gKHByb21pc2UsIGkpIHtcbiAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gIHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICByZXR1cm4gZW51bWVyYXRvci5fc2V0dGxlZEF0KFJFSkVDVEVELCBpLCByZWFzb24pO1xuICB9KTtcbn07XG5cbi8qKlxuICBgUHJvbWlzZS5hbGxgIGFjY2VwdHMgYW4gYXJyYXkgb2YgcHJvbWlzZXMsIGFuZCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2hcbiAgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVzIGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBvclxuICByZWplY3RlZCB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIGJlIHJlamVjdGVkLiBJdCBjYXN0cyBhbGxcbiAgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCBpdGVyYWJsZSB0byBwcm9taXNlcyBhcyBpdCBydW5zIHRoaXMgYWxnb3JpdGhtLlxuXG4gIEV4YW1wbGU6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSByZXNvbHZlKDEpO1xuICBsZXQgcHJvbWlzZTIgPSByZXNvbHZlKDIpO1xuICBsZXQgcHJvbWlzZTMgPSByZXNvbHZlKDMpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gVGhlIGFycmF5IGhlcmUgd291bGQgYmUgWyAxLCAyLCAzIF07XG4gIH0pO1xuICBgYGBcblxuICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYGFsbGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZVxuICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2VzJ3NcbiAgcmVqZWN0aW9uIGhhbmRsZXIuIEZvciBleGFtcGxlOlxuXG4gIEV4YW1wbGU6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSByZXNvbHZlKDEpO1xuICBsZXQgcHJvbWlzZTIgPSByZWplY3QobmV3IEVycm9yKFwiMlwiKSk7XG4gIGxldCBwcm9taXNlMyA9IHJlamVjdChuZXcgRXJyb3IoXCIzXCIpKTtcbiAgbGV0IHByb21pc2VzID0gWyBwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07XG5cbiAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpe1xuICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIVxuICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09IFwiMlwiXG4gIH0pO1xuICBgYGBcblxuICBAbWV0aG9kIGFsbFxuICBAc3RhdGljXG4gIEBwYXJhbSB7QXJyYXl9IGVudHJpZXMgYXJyYXkgb2YgcHJvbWlzZXNcbiAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2UuXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBgcHJvbWlzZXNgIGhhdmUgYmVlblxuICBmdWxmaWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC5cbiAgQHN0YXRpY1xuKi9cbmZ1bmN0aW9uIGFsbChlbnRyaWVzKSB7XG4gIHJldHVybiBuZXcgRW51bWVyYXRvcih0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xufVxuXG4vKipcbiAgYFByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZVxuICBmaXJzdCBwYXNzZWQgcHJvbWlzZSB0byBzZXR0bGUuXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVzb2x2ZSgncHJvbWlzZSAxJyk7XG4gICAgfSwgMjAwKTtcbiAgfSk7XG5cbiAgbGV0IHByb21pc2UyID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDInKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyByZXN1bHQgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMVxuICAgIC8vIHdhcyByZXNvbHZlZC5cbiAgfSk7XG4gIGBgYFxuXG4gIGBQcm9taXNlLnJhY2VgIGlzIGRldGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAgc2V0dGxlZCBwcm9taXNlIG1hdHRlcnMuIEZvciBleGFtcGxlLCBldmVuIGlmIG90aGVyIHByb21pc2VzIGdpdmVuIHRvIHRoZVxuICBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50IGFyZSByZXNvbHZlZCwgYnV0IHRoZSBmaXJzdCBzZXR0bGVkIHByb21pc2UgaGFzXG4gIGJlY29tZSByZWplY3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJlY2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZFxuICBwcm9taXNlIHdpbGwgYmVjb21lIHJlamVjdGVkOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Byb21pc2UgMicpKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVuc1xuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAncHJvbWlzZSAyJyBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0ZWQgYmVmb3JlXG4gICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWRcbiAgfSk7XG4gIGBgYFxuXG4gIEFuIGV4YW1wbGUgcmVhbC13b3JsZCB1c2UgY2FzZSBpcyBpbXBsZW1lbnRpbmcgdGltZW91dHM6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBQcm9taXNlLnJhY2UoW2FqYXgoJ2Zvby5qc29uJyksIHRpbWVvdXQoNTAwMCldKVxuICBgYGBcblxuICBAbWV0aG9kIHJhY2VcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWRcbiAgcHJvbWlzZSB0byBzZXR0bGUuXG4qL1xuZnVuY3Rpb24gcmFjZShlbnRyaWVzKSB7XG4gIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiAoXywgcmVqZWN0KSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yZWplY3RgIHJldHVybnMgYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhlIHBhc3NlZCBgcmVhc29uYC5cbiAgSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcbiAgfSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCFcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUydcbiAgfSk7XG4gIGBgYFxuXG4gIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdXSE9PUFMnKSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCFcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUydcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgcmVqZWN0XG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBbnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHJlYXNvbmAuXG4qL1xuZnVuY3Rpb24gcmVqZWN0KHJlYXNvbikge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgX3JlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5mdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKSB7XG4gIHRoaXNbUFJPTUlTRV9JRF0gPSBuZXh0SWQoKTtcbiAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgaWYgKG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIG5lZWRzUmVzb2x2ZXIoKTtcbiAgICB0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSA/IGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKSA6IG5lZWRzTmV3KCk7XG4gIH1cbn1cblxuUHJvbWlzZS5hbGwgPSBhbGw7XG5Qcm9taXNlLnJhY2UgPSByYWNlO1xuUHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTtcblByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gc2V0U2NoZWR1bGVyO1xuUHJvbWlzZS5fc2V0QXNhcCA9IHNldEFzYXA7XG5Qcm9taXNlLl9hc2FwID0gYXNhcDtcblxuUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQcm9taXNlLFxuXG4gIC8qKlxuICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIENoYWluaW5nXG4gICAgLS0tLS0tLS1cbiAgXG4gICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG4gIFxuICAgIGBgYGpzXG4gICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgfSk7XG4gIFxuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgIH0pO1xuICAgIGBgYFxuICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBBc3NpbWlsYXRpb25cbiAgICAtLS0tLS0tLS0tLS1cbiAgXG4gICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgU2ltcGxlIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgcmVzdWx0O1xuICBcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBFcnJiYWNrIEV4YW1wbGVcbiAgXG4gICAgYGBganNcbiAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBQcm9taXNlIEV4YW1wbGU7XG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgYXV0aG9yLCBib29rcztcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9XG4gICAgYGBgXG4gIFxuICAgIEVycmJhY2sgRXhhbXBsZVxuICBcbiAgICBgYGBqc1xuICBcbiAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gIFxuICAgIH1cbiAgXG4gICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcbiAgXG4gICAgfVxuICBcbiAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIFByb21pc2UgRXhhbXBsZTtcbiAgXG4gICAgYGBgamF2YXNjcmlwdFxuICAgIGZpbmRBdXRob3IoKS5cbiAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgdGhlblxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICB0aGVuOiB0aGVuLFxuXG4gIC8qKlxuICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuICBcbiAgICBgYGBqc1xuICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgIH1cbiAgXG4gICAgLy8gc3luY2hyb25vdXNcbiAgICB0cnkge1xuICAgICAgZmluZEF1dGhvcigpO1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIH1cbiAgXG4gICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgQG1ldGhvZCBjYXRjaFxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG4gICdjYXRjaCc6IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgICB2YXIgbG9jYWwgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYWwgPSBnbG9iYWw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgUCA9IGxvY2FsLlByb21pc2U7XG5cbiAgICBpZiAoUCkge1xuICAgICAgICB2YXIgcHJvbWlzZVRvU3RyaW5nID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlVG9TdHJpbmcgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbC5Qcm9taXNlID0gUHJvbWlzZTtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZS5wb2x5ZmlsbCA9IHBvbHlmaWxsO1xuUHJvbWlzZS5Qcm9taXNlID0gUHJvbWlzZTtcblxucmV0dXJuIFByb21pc2U7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lczYtcHJvbWlzZS5tYXBcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJ2YXIgYnVuZGxlRm4gPSBhcmd1bWVudHNbM107XG52YXIgc291cmNlcyA9IGFyZ3VtZW50c1s0XTtcbnZhciBjYWNoZSA9IGFyZ3VtZW50c1s1XTtcblxudmFyIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgb3B0aW9ucykge1xuICAgIHZhciB3a2V5O1xuICAgIHZhciBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjYWNoZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGNhY2hlS2V5c1tpXTtcbiAgICAgICAgdmFyIGV4cCA9IGNhY2hlW2tleV0uZXhwb3J0cztcbiAgICAgICAgLy8gVXNpbmcgYmFiZWwgYXMgYSB0cmFuc3BpbGVyIHRvIHVzZSBlc21vZHVsZSwgdGhlIGV4cG9ydCB3aWxsIGFsd2F5c1xuICAgICAgICAvLyBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBleHBvcnQgYXMgYSBwcm9wZXJ0eSBvZiBpdC4gVG8gZW5zdXJlXG4gICAgICAgIC8vIHRoZSBleGlzdGluZyBhcGkgYW5kIGJhYmVsIGVzbW9kdWxlIGV4cG9ydHMgYXJlIGJvdGggc3VwcG9ydGVkIHdlXG4gICAgICAgIC8vIGNoZWNrIGZvciBib3RoXG4gICAgICAgIGlmIChleHAgPT09IGZuIHx8IGV4cCAmJiBleHAuZGVmYXVsdCA9PT0gZm4pIHtcbiAgICAgICAgICAgIHdrZXkgPSBrZXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghd2tleSkge1xuICAgICAgICB3a2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG4gICAgICAgIHZhciB3Y2FjaGUgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICAgICAgd2NhY2hlW2tleV0gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlc1t3a2V5XSA9IFtcbiAgICAgICAgICAgIEZ1bmN0aW9uKFsncmVxdWlyZScsJ21vZHVsZScsJ2V4cG9ydHMnXSwgJygnICsgZm4gKyAnKShzZWxmKScpLFxuICAgICAgICAgICAgd2NhY2hlXG4gICAgICAgIF07XG4gICAgfVxuICAgIHZhciBza2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG5cbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJ10sIChcbiAgICAgICAgICAgIC8vIHRyeSB0byBjYWxsIGRlZmF1bHQgaWYgZGVmaW5lZCB0byBhbHNvIHN1cHBvcnQgYmFiZWwgZXNtb2R1bGVcbiAgICAgICAgICAgIC8vIGV4cG9ydHNcbiAgICAgICAgICAgICd2YXIgZiA9IHJlcXVpcmUoJyArIHN0cmluZ2lmeSh3a2V5KSArICcpOycgK1xuICAgICAgICAgICAgJyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTsnXG4gICAgICAgICkpLFxuICAgICAgICBzY2FjaGVcbiAgICBdO1xuXG4gICAgdmFyIHdvcmtlclNvdXJjZXMgPSB7fTtcbiAgICByZXNvbHZlU291cmNlcyhza2V5KTtcblxuICAgIGZ1bmN0aW9uIHJlc29sdmVTb3VyY2VzKGtleSkge1xuICAgICAgICB3b3JrZXJTb3VyY2VzW2tleV0gPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGRlcFBhdGggaW4gc291cmNlc1trZXldWzFdKSB7XG4gICAgICAgICAgICB2YXIgZGVwS2V5ID0gc291cmNlc1trZXldWzFdW2RlcFBhdGhdO1xuICAgICAgICAgICAgaWYgKCF3b3JrZXJTb3VyY2VzW2RlcEtleV0pIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlU291cmNlcyhkZXBLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNyYyA9ICcoJyArIGJ1bmRsZUZuICsgJykoeydcbiAgICAgICAgKyBPYmplY3Qua2V5cyh3b3JrZXJTb3VyY2VzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShrZXkpICsgJzpbJ1xuICAgICAgICAgICAgICAgICsgc291cmNlc1trZXldWzBdXG4gICAgICAgICAgICAgICAgKyAnLCcgKyBzdHJpbmdpZnkoc291cmNlc1trZXldWzFdKSArICddJ1xuICAgICAgICAgICAgO1xuICAgICAgICB9KS5qb2luKCcsJylcbiAgICAgICAgKyAnfSx7fSxbJyArIHN0cmluZ2lmeShza2V5KSArICddKSdcbiAgICA7XG5cbiAgICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbc3JjXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmJhcmUpIHsgcmV0dXJuIGJsb2I7IH1cbiAgICB2YXIgd29ya2VyVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpO1xuICAgIHdvcmtlci5vYmplY3RVUkwgPSB3b3JrZXJVcmw7XG4gICAgcmV0dXJuIHdvcmtlcjtcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgZW5hYmxlV29ya2VyOiBmYWxzZSxcbiAgICBlbmFibGVTdGFzaEJ1ZmZlcjogdHJ1ZSxcbiAgICBzdGFzaEluaXRpYWxTaXplOiB1bmRlZmluZWQsXG5cbiAgICBpc0xpdmU6IGZhbHNlLFxuXG4gICAgbGF6eUxvYWQ6IHRydWUsXG4gICAgbGF6eUxvYWRNYXhEdXJhdGlvbjogMyAqIDYwLFxuICAgIGxhenlMb2FkUmVjb3ZlckR1cmF0aW9uOiAzMCxcbiAgICBkZWZlckxvYWRBZnRlclNvdXJjZU9wZW46IHRydWUsXG5cbiAgICAvLyBhdXRvQ2xlYW51cFNvdXJjZUJ1ZmZlcjogZGVmYXVsdCBhcyBmYWxzZSwgbGVhdmUgdW5zcGVjaWZpZWRcbiAgICBhdXRvQ2xlYW51cE1heEJhY2t3YXJkRHVyYXRpb246IDMgKiA2MCxcbiAgICBhdXRvQ2xlYW51cE1pbkJhY2t3YXJkRHVyYXRpb246IDIgKiA2MCxcblxuICAgIHN0YXRpc3RpY3NJbmZvUmVwb3J0SW50ZXJ2YWw6IDYwMCxcblxuICAgIGZpeEF1ZGlvVGltZXN0YW1wR2FwOiB0cnVlLFxuXG4gICAgYWNjdXJhdGVTZWVrOiBmYWxzZSxcbiAgICBzZWVrVHlwZTogJ3JhbmdlJywgIC8vIFtyYW5nZSwgcGFyYW0sIGN1c3RvbV1cbiAgICBzZWVrUGFyYW1TdGFydDogJ2JzdGFydCcsXG4gICAgc2Vla1BhcmFtRW5kOiAnYmVuZCcsXG4gICAgcmFuZ2VMb2FkWmVyb1N0YXJ0OiBmYWxzZSxcbiAgICBjdXN0b21TZWVrSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgIHJldXNlUmVkaXJlY3RlZFVSTDogZmFsc2VcbiAgICAvLyByZWZlcnJlclBvbGljeTogbGVhdmUgYXMgdW5zcGVjaWZpZWRcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnKTtcbn0iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IElPQ29udHJvbGxlciBmcm9tICcuLi9pby9pby1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7Y3JlYXRlRGVmYXVsdENvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuY2xhc3MgRmVhdHVyZXMge1xuXG4gICAgc3RhdGljIHN1cHBvcnRNU0VIMjY0UGxheWJhY2soKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuTWVkaWFTb3VyY2UgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5NZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQoJ3ZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40MkUwMUUsbXA0YS40MC4yXCInKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3VwcG9ydE5ldHdvcmtTdHJlYW1JTygpIHtcbiAgICAgICAgbGV0IGlvY3RsID0gbmV3IElPQ29udHJvbGxlcih7fSwgY3JlYXRlRGVmYXVsdENvbmZpZygpKTtcbiAgICAgICAgbGV0IGxvYWRlclR5cGUgPSBpb2N0bC5sb2FkZXJUeXBlO1xuICAgICAgICBpb2N0bC5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiBsb2FkZXJUeXBlID09ICdmZXRjaC1zdHJlYW0tbG9hZGVyJyB8fCBsb2FkZXJUeXBlID09ICd4aHItbW96LWNodW5rZWQtbG9hZGVyJztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TmV0d29ya0xvYWRlclR5cGVOYW1lKCkge1xuICAgICAgICBsZXQgaW9jdGwgPSBuZXcgSU9Db250cm9sbGVyKHt9LCBjcmVhdGVEZWZhdWx0Q29uZmlnKCkpO1xuICAgICAgICBsZXQgbG9hZGVyVHlwZSA9IGlvY3RsLmxvYWRlclR5cGU7XG4gICAgICAgIGlvY3RsLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIGxvYWRlclR5cGU7XG4gICAgfVxuXG4gICAgc3RhdGljIHN1cHBvcnROYXRpdmVNZWRpYVBsYXliYWNrKG1pbWVUeXBlKSB7XG4gICAgICAgIGlmIChGZWF0dXJlcy52aWRlb0VsZW1lbnQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBGZWF0dXJlcy52aWRlb0VsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FuUGxheSA9IEZlYXR1cmVzLnZpZGVvRWxlbWVudC5jYW5QbGF5VHlwZShtaW1lVHlwZSk7XG4gICAgICAgIHJldHVybiBjYW5QbGF5ID09PSAncHJvYmFibHknIHx8IGNhblBsYXkgPT0gJ21heWJlJztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RmVhdHVyZUxpc3QoKSB7XG4gICAgICAgIGxldCBmZWF0dXJlcyA9IHtcbiAgICAgICAgICAgIG1zZUZsdlBsYXliYWNrOiBmYWxzZSxcbiAgICAgICAgICAgIG1zZUxpdmVGbHZQbGF5YmFjazogZmFsc2UsXG4gICAgICAgICAgICBuZXR3b3JrU3RyZWFtSU86IGZhbHNlLFxuICAgICAgICAgICAgbmV0d29ya0xvYWRlck5hbWU6ICcnLFxuICAgICAgICAgICAgbmF0aXZlTVA0SDI2NFBsYXliYWNrOiBmYWxzZSxcbiAgICAgICAgICAgIG5hdGl2ZVdlYm1WUDhQbGF5YmFjazogZmFsc2UsXG4gICAgICAgICAgICBuYXRpdmVXZWJtVlA5UGxheWJhY2s6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgZmVhdHVyZXMubXNlRmx2UGxheWJhY2sgPSBGZWF0dXJlcy5zdXBwb3J0TVNFSDI2NFBsYXliYWNrKCk7XG4gICAgICAgIGZlYXR1cmVzLm5ldHdvcmtTdHJlYW1JTyA9IEZlYXR1cmVzLnN1cHBvcnROZXR3b3JrU3RyZWFtSU8oKTtcbiAgICAgICAgZmVhdHVyZXMubmV0d29ya0xvYWRlck5hbWUgPSBGZWF0dXJlcy5nZXROZXR3b3JrTG9hZGVyVHlwZU5hbWUoKTtcbiAgICAgICAgZmVhdHVyZXMubXNlTGl2ZUZsdlBsYXliYWNrID0gZmVhdHVyZXMubXNlRmx2UGxheWJhY2sgJiYgZmVhdHVyZXMubmV0d29ya1N0cmVhbUlPO1xuICAgICAgICBmZWF0dXJlcy5uYXRpdmVNUDRIMjY0UGxheWJhY2sgPSBGZWF0dXJlcy5zdXBwb3J0TmF0aXZlTWVkaWFQbGF5YmFjaygndmlkZW8vbXA0OyBjb2RlY3M9XCJhdmMxLjQyMDAxRSwgbXA0YS40MC4yXCInKTtcbiAgICAgICAgZmVhdHVyZXMubmF0aXZlV2VibVZQOFBsYXliYWNrID0gRmVhdHVyZXMuc3VwcG9ydE5hdGl2ZU1lZGlhUGxheWJhY2soJ3ZpZGVvL3dlYm07IGNvZGVjcz1cInZwOC4wLCB2b3JiaXNcIicpO1xuICAgICAgICBmZWF0dXJlcy5uYXRpdmVXZWJtVlA5UGxheWJhY2sgPSBGZWF0dXJlcy5zdXBwb3J0TmF0aXZlTWVkaWFQbGF5YmFjaygndmlkZW8vd2VibTsgY29kZWNzPVwidnA5XCInKTtcblxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVzOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jbGFzcyBNZWRpYUluZm8ge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWltZVR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gbnVsbDtcblxuICAgICAgICB0aGlzLmhhc0F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNWaWRlbyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9Db2RlYyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlkZW9Db2RlYyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9EYXRhUmF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMudmlkZW9EYXRhUmF0ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5hdWRpb1NhbXBsZVJhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmF1ZGlvQ2hhbm5lbENvdW50ID0gbnVsbDtcblxuICAgICAgICB0aGlzLndpZHRoID0gbnVsbDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBudWxsO1xuICAgICAgICB0aGlzLmZwcyA9IG51bGw7XG4gICAgICAgIHRoaXMucHJvZmlsZSA9IG51bGw7XG4gICAgICAgIHRoaXMubGV2ZWwgPSBudWxsO1xuICAgICAgICB0aGlzLnJlZkZyYW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2hyb21hRm9ybWF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXJOdW0gPSBudWxsO1xuICAgICAgICB0aGlzLnNhckRlbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBudWxsOyAgLy8gTWVkaWFJbmZvW11cbiAgICAgICAgdGhpcy5zZWdtZW50Q291bnQgPSBudWxsO1xuICAgICAgICB0aGlzLmhhc0tleWZyYW1lc0luZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZXlmcmFtZXNJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgaXNDb21wbGV0ZSgpIHtcbiAgICAgICAgbGV0IGF1ZGlvSW5mb0NvbXBsZXRlID0gKHRoaXMuaGFzQXVkaW8gPT09IGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5oYXNBdWRpbyA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb0NvZGVjICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9TYW1wbGVSYXRlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9DaGFubmVsQ291bnQgIT0gbnVsbCk7XG5cbiAgICAgICAgbGV0IHZpZGVvSW5mb0NvbXBsZXRlID0gKHRoaXMuaGFzVmlkZW8gPT09IGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5oYXNWaWRlbyA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb0NvZGVjICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkdGggIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9maWxlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGV2ZWwgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZGcmFtZXMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaHJvbWFGb3JtYXQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXJOdW0gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXJEZW4gIT0gbnVsbCk7XG5cbiAgICAgICAgLy8ga2V5ZnJhbWVzSW5kZXggbWF5IG5vdCBiZSBwcmVzZW50XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVUeXBlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICB0aGlzLmhhc0tleWZyYW1lc0luZGV4ICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgIGF1ZGlvSW5mb0NvbXBsZXRlICYmXG4gICAgICAgICAgICAgICB2aWRlb0luZm9Db21wbGV0ZTtcbiAgICB9XG5cbiAgICBpc1NlZWthYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNLZXlmcmFtZXNJbmRleCA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXROZWFyZXN0S2V5ZnJhbWUobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0aGlzLmtleWZyYW1lc0luZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5rZXlmcmFtZXNJbmRleDtcbiAgICAgICAgbGV0IGtleWZyYW1lSWR4ID0gdGhpcy5fc2VhcmNoKHRhYmxlLnRpbWVzLCBtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDoga2V5ZnJhbWVJZHgsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IHRhYmxlLnRpbWVzW2tleWZyYW1lSWR4XSxcbiAgICAgICAgICAgIGZpbGVwb3NpdGlvbjogdGFibGUuZmlsZXBvc2l0aW9uc1trZXlmcmFtZUlkeF1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfc2VhcmNoKGxpc3QsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpZHggPSAwO1xuXG4gICAgICAgIGxldCBsYXN0ID0gbGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgbGV0IGxib3VuZCA9IDA7XG4gICAgICAgIGxldCB1Ym91bmQgPSBsYXN0O1xuXG4gICAgICAgIGlmICh2YWx1ZSA8IGxpc3RbMF0pIHtcbiAgICAgICAgICAgIGlkeCA9IDA7XG4gICAgICAgICAgICBsYm91bmQgPSB1Ym91bmQgKyAxOyAgLy8gc2tpcCBzZWFyY2hcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChsYm91bmQgPD0gdWJvdW5kKSB7XG4gICAgICAgICAgICBtaWQgPSBsYm91bmQgKyBNYXRoLmZsb29yKCh1Ym91bmQgLSBsYm91bmQpIC8gMik7XG4gICAgICAgICAgICBpZiAobWlkID09PSBsYXN0IHx8ICh2YWx1ZSA+PSBsaXN0W21pZF0gJiYgdmFsdWUgPCBsaXN0W21pZCArIDFdKSkge1xuICAgICAgICAgICAgICAgIGlkeCA9IG1pZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFttaWRdIDwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBsYm91bmQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1Ym91bmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVkaWFJbmZvOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBSZXByZXNlbnRzIGFuIG1lZGlhIHNhbXBsZSAoYXVkaW8gLyB2aWRlbylcbmV4cG9ydCBjbGFzcyBTYW1wbGVJbmZvIHtcblxuICAgIGNvbnN0cnVjdG9yKGR0cywgcHRzLCBkdXJhdGlvbiwgb3JpZ2luYWxEdHMsIGlzU3luYykge1xuICAgICAgICB0aGlzLmR0cyA9IGR0cztcbiAgICAgICAgdGhpcy5wdHMgPSBwdHM7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5vcmlnaW5hbER0cyA9IG9yaWdpbmFsRHRzO1xuICAgICAgICB0aGlzLmlzU3luY1BvaW50ID0gaXNTeW5jO1xuICAgICAgICB0aGlzLmZpbGVwb3NpdGlvbiA9IG51bGw7XG4gICAgfVxuXG59XG5cbi8vIE1lZGlhIFNlZ21lbnQgY29uY2VwdCBpcyBkZWZpbmVkIGluIE1lZGlhIFNvdXJjZSBFeHRlbnNpb25zIHNwZWMuXG4vLyBQYXJ0aWN1bGFybHkgaW4gSVNPIEJNRkYgZm9ybWF0LCBhbiBNZWRpYSBTZWdtZW50IGNvbnRhaW5zIGEgbW9vZiBib3ggZm9sbG93ZWQgYnkgYSBtZGF0IGJveC5cbmV4cG9ydCBjbGFzcyBNZWRpYVNlZ21lbnRJbmZvIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJlZ2luRHRzID0gMDtcbiAgICAgICAgdGhpcy5lbmREdHMgPSAwO1xuICAgICAgICB0aGlzLmJlZ2luUHRzID0gMDtcbiAgICAgICAgdGhpcy5lbmRQdHMgPSAwO1xuICAgICAgICB0aGlzLm9yaWdpbmFsQmVnaW5EdHMgPSAwO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRW5kRHRzID0gMDtcbiAgICAgICAgdGhpcy5zeW5jUG9pbnRzID0gW107ICAgICAvLyBTYW1wbGVJbmZvW25dLCBmb3IgdmlkZW8gSURSIGZyYW1lcyBvbmx5XG4gICAgICAgIHRoaXMuZmlyc3RTYW1wbGUgPSBudWxsOyAgLy8gU2FtcGxlSW5mb1xuICAgICAgICB0aGlzLmxhc3RTYW1wbGUgPSBudWxsOyAgIC8vIFNhbXBsZUluZm9cbiAgICB9XG5cbiAgICBhcHBlbmRTeW5jUG9pbnQoc2FtcGxlSW5mbykgeyAgLy8gYWxzbyBjYWxsZWQgUmFuZG9tIEFjY2VzcyBQb2ludFxuICAgICAgICBzYW1wbGVJbmZvLmlzU3luY1BvaW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zeW5jUG9pbnRzLnB1c2goc2FtcGxlSW5mbyk7XG4gICAgfVxuXG59XG5cbi8vIE9yZGVyZWQgbGlzdCBmb3IgcmVjb3JkaW5nIHZpZGVvIElEUiBmcmFtZXMsIHNvcnRlZCBieSBvcmlnaW5hbER0c1xuZXhwb3J0IGNsYXNzIElEUlNhbXBsZUxpc3Qge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2xpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbGlzdCA9IFtdO1xuICAgIH1cblxuICAgIGFwcGVuZEFycmF5KHN5bmNQb2ludHMpIHtcbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9saXN0O1xuXG4gICAgICAgIGlmIChzeW5jUG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCAmJiBzeW5jUG9pbnRzWzBdLm9yaWdpbmFsRHRzIDwgbGlzdFtsaXN0Lmxlbmd0aCAtIDFdLm9yaWdpbmFsRHRzKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShsaXN0LCBzeW5jUG9pbnRzKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0U3luY1BvaW50QmVmb3JlRHRzKGR0cykge1xuICAgICAgICBpZiAodGhpcy5fbGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGlzdCA9IHRoaXMuX2xpc3Q7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBsZXQgbGFzdCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG1pZCA9IDA7XG4gICAgICAgIGxldCBsYm91bmQgPSAwO1xuICAgICAgICBsZXQgdWJvdW5kID0gbGFzdDtcblxuICAgICAgICBpZiAoZHRzIDwgbGlzdFswXS5kdHMpIHtcbiAgICAgICAgICAgIGlkeCA9IDA7XG4gICAgICAgICAgICBsYm91bmQgPSB1Ym91bmQgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGxib3VuZCA8PSB1Ym91bmQpIHtcbiAgICAgICAgICAgIG1pZCA9IGxib3VuZCArIE1hdGguZmxvb3IoKHVib3VuZCAtIGxib3VuZCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChtaWQgPT09IGxhc3QgfHwgKGR0cyA+PSBsaXN0W21pZF0uZHRzICYmIGR0cyA8IGxpc3RbbWlkICsgMV0uZHRzKSkge1xuICAgICAgICAgICAgICAgIGlkeCA9IG1pZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFttaWRdLmR0cyA8IGR0cykge1xuICAgICAgICAgICAgICAgIGxib3VuZCA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVib3VuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3RbaWR4XTtcbiAgICB9XG5cbn1cblxuLy8gRGF0YSBzdHJ1Y3R1cmUgZm9yIHJlY29yZGluZyBpbmZvcm1hdGlvbiBvZiBtZWRpYSBzZWdtZW50cyBpbiBzaW5nbGUgdHJhY2suXG5leHBvcnQgY2xhc3MgTWVkaWFTZWdtZW50SW5mb0xpc3Qge1xuXG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5fbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9sYXN0QXBwZW5kTG9jYXRpb24gPSAtMTsgIC8vIGNhY2hlZCBsYXN0IGluc2VydCBsb2NhdGlvblxuICAgIH1cblxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGlzdC5sZW5ndGg7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3QubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9saXN0ID0gW107XG4gICAgICAgIHRoaXMuX2xhc3RBcHBlbmRMb2NhdGlvbiA9IC0xO1xuICAgIH1cblxuICAgIF9zZWFyY2hOZWFyZXN0U2VnbWVudEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgIGxldCBsaXN0ID0gdGhpcy5fbGlzdDtcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3QgPSBsaXN0Lmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBtaWQgPSAwO1xuICAgICAgICBsZXQgbGJvdW5kID0gMDtcbiAgICAgICAgbGV0IHVib3VuZCA9IGxhc3Q7XG5cbiAgICAgICAgbGV0IGlkeCA9IDA7XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsQmVnaW5EdHMgPCBsaXN0WzBdLm9yaWdpbmFsQmVnaW5EdHMpIHtcbiAgICAgICAgICAgIGlkeCA9IC0xO1xuICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChsYm91bmQgPD0gdWJvdW5kKSB7XG4gICAgICAgICAgICBtaWQgPSBsYm91bmQgKyBNYXRoLmZsb29yKCh1Ym91bmQgLSBsYm91bmQpIC8gMik7XG4gICAgICAgICAgICBpZiAobWlkID09PSBsYXN0IHx8IChvcmlnaW5hbEJlZ2luRHRzID4gbGlzdFttaWRdLmxhc3RTYW1wbGUub3JpZ2luYWxEdHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yaWdpbmFsQmVnaW5EdHMgPCBsaXN0W21pZCArIDFdLm9yaWdpbmFsQmVnaW5EdHMpKSkge1xuICAgICAgICAgICAgICAgIGlkeCA9IG1pZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFttaWRdLm9yaWdpbmFsQmVnaW5EdHMgPCBvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgICAgICAgICAgbGJvdW5kID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdWJvdW5kID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cblxuICAgIF9zZWFyY2hOZWFyZXN0U2VnbWVudEFmdGVyKG9yaWdpbmFsQmVnaW5EdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaE5lYXJlc3RTZWdtZW50QmVmb3JlKG9yaWdpbmFsQmVnaW5EdHMpICsgMTtcbiAgICB9XG5cbiAgICBhcHBlbmQobWVkaWFTZWdtZW50SW5mbykge1xuICAgICAgICBsZXQgbGlzdCA9IHRoaXMuX2xpc3Q7XG4gICAgICAgIGxldCBtc2kgPSBtZWRpYVNlZ21lbnRJbmZvO1xuICAgICAgICBsZXQgbGFzdEFwcGVuZElkeCA9IHRoaXMuX2xhc3RBcHBlbmRMb2NhdGlvbjtcbiAgICAgICAgbGV0IGluc2VydElkeCA9IDA7XG5cbiAgICAgICAgaWYgKGxhc3RBcHBlbmRJZHggIT09IC0xICYmIGxhc3RBcHBlbmRJZHggPCBsaXN0Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNpLm9yaWdpbmFsQmVnaW5EdHMgPj0gbGlzdFtsYXN0QXBwZW5kSWR4XS5sYXN0U2FtcGxlLm9yaWdpbmFsRHRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxhc3RBcHBlbmRJZHggPT09IGxpc3QubGVuZ3RoIC0gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0QXBwZW5kSWR4IDwgbGlzdC5sZW5ndGggLSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2kub3JpZ2luYWxCZWdpbkR0cyA8IGxpc3RbbGFzdEFwcGVuZElkeCArIDFdLm9yaWdpbmFsQmVnaW5EdHMpKSkge1xuICAgICAgICAgICAgaW5zZXJ0SWR4ID0gbGFzdEFwcGVuZElkeCArIDE7ICAvLyB1c2UgY2FjaGVkIGxvY2F0aW9uIGlkeFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGluc2VydElkeCA9IHRoaXMuX3NlYXJjaE5lYXJlc3RTZWdtZW50QmVmb3JlKG1zaS5vcmlnaW5hbEJlZ2luRHRzKSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0QXBwZW5kTG9jYXRpb24gPSBpbnNlcnRJZHg7XG4gICAgICAgIHRoaXMuX2xpc3Quc3BsaWNlKGluc2VydElkeCwgMCwgbXNpKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0U2VnbWVudEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLl9zZWFyY2hOZWFyZXN0U2VnbWVudEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKTtcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGlzdFtpZHhdO1xuICAgICAgICB9IGVsc2UgeyAgLy8gLTFcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGFzdFNhbXBsZUJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRMYXN0U2VnbWVudEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKTtcbiAgICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQubGFzdFNhbXBsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGFzdFN5bmNQb2ludEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgIGxldCBzZWdtZW50SWR4ID0gdGhpcy5fc2VhcmNoTmVhcmVzdFNlZ21lbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cyk7XG4gICAgICAgIGxldCBzeW5jUG9pbnRzID0gdGhpcy5fbGlzdFtzZWdtZW50SWR4XS5zeW5jUG9pbnRzO1xuICAgICAgICB3aGlsZSAoc3luY1BvaW50cy5sZW5ndGggPT09IDAgJiYgc2VnbWVudElkeCA+IDApIHtcbiAgICAgICAgICAgIHNlZ21lbnRJZHgtLTtcbiAgICAgICAgICAgIHN5bmNQb2ludHMgPSB0aGlzLl9saXN0W3NlZ21lbnRJZHhdLnN5bmNQb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5bmNQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5bmNQb2ludHNbc3luY1BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBCcm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IE1TRUV2ZW50cyBmcm9tICcuL21zZS1ldmVudHMuanMnO1xuaW1wb3J0IHtTYW1wbGVJbmZvLCBJRFJTYW1wbGVMaXN0fSBmcm9tICcuL21lZGlhLXNlZ21lbnQtaW5mby5qcyc7XG5pbXBvcnQge0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLy8gTWVkaWEgU291cmNlIEV4dGVuc2lvbnMgY29udHJvbGxlclxuY2xhc3MgTVNFQ29udHJvbGxlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnTVNFQ29udHJvbGxlcic7XG5cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaXNMaXZlICYmIHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cFNvdXJjZUJ1ZmZlciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEZvciBsaXZlIHN0cmVhbSwgZG8gYXV0byBjbGVhbnVwIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cFNvdXJjZUJ1ZmZlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmUgPSB7XG4gICAgICAgICAgICBvblNvdXJjZU9wZW46IHRoaXMuX29uU291cmNlT3Blbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Tb3VyY2VFbmRlZDogdGhpcy5fb25Tb3VyY2VFbmRlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Tb3VyY2VDbG9zZTogdGhpcy5fb25Tb3VyY2VDbG9zZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Tb3VyY2VCdWZmZXJFcnJvcjogdGhpcy5fb25Tb3VyY2VCdWZmZXJFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Tb3VyY2VCdWZmZXJVcGRhdGVFbmQ6IHRoaXMuX29uU291cmNlQnVmZmVyVXBkYXRlRW5kLmJpbmQodGhpcylcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21lZGlhU291cmNlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9pc0J1ZmZlckZ1bGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzUGVuZGluZ0VvcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3JlcXVpcmVTZXRNZWRpYUR1cmF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdNZWRpYUR1cmF0aW9uID0gMDtcblxuICAgICAgICB0aGlzLl9wZW5kaW5nU291cmNlQnVmZmVySW5pdCA9IFtdO1xuICAgICAgICB0aGlzLl9taW1lVHlwZXMgPSB7XG4gICAgICAgICAgICB2aWRlbzogbnVsbCxcbiAgICAgICAgICAgIGF1ZGlvOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3NvdXJjZUJ1ZmZlcnMgPSB7XG4gICAgICAgICAgICB2aWRlbzogbnVsbCxcbiAgICAgICAgICAgIGF1ZGlvOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2xhc3RJbml0U2VnbWVudHMgPSB7XG4gICAgICAgICAgICB2aWRlbzogbnVsbCxcbiAgICAgICAgICAgIGF1ZGlvOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50cyA9IHtcbiAgICAgICAgICAgIHZpZGVvOiBbXSxcbiAgICAgICAgICAgIGF1ZGlvOiBbXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZlUmFuZ2VzID0ge1xuICAgICAgICAgICAgdmlkZW86IFtdLFxuICAgICAgICAgICAgYXVkaW86IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2lkckxpc3QgPSBuZXcgSURSU2FtcGxlTGlzdCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQgfHwgdGhpcy5fbWVkaWFTb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoTWVkaWFFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBhdHRhY2hNZWRpYUVsZW1lbnQobWVkaWFFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYVNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignTWVkaWFTb3VyY2UgaGFzIGJlZW4gYXR0YWNoZWQgdG8gYW4gSFRNTE1lZGlhRWxlbWVudCEnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXMgPSB0aGlzLl9tZWRpYVNvdXJjZSA9IG5ldyB3aW5kb3cuTWVkaWFTb3VyY2UoKTtcbiAgICAgICAgbXMuYWRkRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIHRoaXMuZS5vblNvdXJjZU9wZW4pO1xuICAgICAgICBtcy5hZGRFdmVudExpc3RlbmVyKCdzb3VyY2VlbmRlZCcsIHRoaXMuZS5vblNvdXJjZUVuZGVkKTtcbiAgICAgICAgbXMuYWRkRXZlbnRMaXN0ZW5lcignc291cmNlY2xvc2UnLCB0aGlzLmUub25Tb3VyY2VDbG9zZSk7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVtZW50O1xuICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZU9iamVjdFVSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHRoaXMuX21lZGlhU291cmNlKTtcbiAgICAgICAgbWVkaWFFbGVtZW50LnNyYyA9IHRoaXMuX21lZGlhU291cmNlT2JqZWN0VVJMO1xuICAgIH1cblxuICAgIGRldGFjaE1lZGlhRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhU291cmNlKSB7XG4gICAgICAgICAgICBsZXQgbXMgPSB0aGlzLl9tZWRpYVNvdXJjZTtcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5fc291cmNlQnVmZmVycykge1xuICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgc2VnbWVudHMgc2hvdWxkIGJlIGRpc2NhcmRcbiAgICAgICAgICAgICAgICBsZXQgcHMgPSB0aGlzLl9wZW5kaW5nU2VnbWVudHNbdHlwZV07XG4gICAgICAgICAgICAgICAgcHMuc3BsaWNlKDAsIHBzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZ21lbnRzW3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZlUmFuZ2VzW3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0SW5pdFNlZ21lbnRzW3R5cGVdID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgc291cmNlYnVmZmVyc1xuICAgICAgICAgICAgICAgIGxldCBzYiA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKHNiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtcy5yZWFkeVN0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXMucmVtb3ZlU291cmNlQnVmZmVyKHNiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5lLm9uU291cmNlQnVmZmVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigndXBkYXRlZW5kJywgdGhpcy5lLm9uU291cmNlQnVmZmVyVXBkYXRlRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW1lVHlwZXNbdHlwZV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobXMucmVhZHlTdGF0ZSA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbXMuZW5kT2ZTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZSh0aGlzLlRBRywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIHRoaXMuZS5vblNvdXJjZU9wZW4pO1xuICAgICAgICAgICAgbXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlZW5kZWQnLCB0aGlzLmUub25Tb3VyY2VFbmRlZCk7XG4gICAgICAgICAgICBtcy5yZW1vdmVFdmVudExpc3RlbmVyKCdzb3VyY2VjbG9zZScsIHRoaXMuZS5vblNvdXJjZUNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTb3VyY2VCdWZmZXJJbml0ID0gW107XG4gICAgICAgICAgICB0aGlzLl9pc0J1ZmZlckZ1bGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2lkckxpc3QuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhU291cmNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWVkaWFTb3VyY2VPYmplY3RVUkwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuX21lZGlhU291cmNlT2JqZWN0VVJMKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhU291cmNlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFwcGVuZEluaXRTZWdtZW50KGluaXRTZWdtZW50LCBkZWZlcnJlZCkge1xuICAgICAgICBpZiAoIXRoaXMuX21lZGlhU291cmNlIHx8IHRoaXMuX21lZGlhU291cmNlLnJlYWR5U3RhdGUgIT09ICdvcGVuJykge1xuICAgICAgICAgICAgLy8gc291cmNlYnVmZmVyIGNyZWF0aW9uIHJlcXVpcmVzIG1lZGlhU291cmNlLnJlYWR5U3RhdGUgPT09ICdvcGVuJ1xuICAgICAgICAgICAgLy8gc28gd2UgZGVmZXIgdGhlIHNvdXJjZWJ1ZmZlciBjcmVhdGlvbiwgdW50aWwgc291cmNlb3BlbiBldmVudCB0cmlnZ2VyZWRcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTb3VyY2VCdWZmZXJJbml0LnB1c2goaW5pdFNlZ21lbnQpO1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhpcyBJbml0U2VnbWVudCBpcyBpbiB0aGUgZnJvbnQgb2YgcGVuZGluZyBzZWdtZW50cyBxdWV1ZVxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZ21lbnRzW2luaXRTZWdtZW50LnR5cGVdLnB1c2goaW5pdFNlZ21lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzID0gaW5pdFNlZ21lbnQ7XG4gICAgICAgIGxldCBtaW1lVHlwZSA9IGAke2lzLmNvbnRhaW5lcn1gO1xuICAgICAgICBpZiAoaXMuY29kZWMgJiYgaXMuY29kZWMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWltZVR5cGUgKz0gYDtjb2RlY3M9JHtpcy5jb2RlY31gO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpcnN0SW5pdFNlZ21lbnQgPSBmYWxzZTtcblxuICAgICAgICBMb2cudih0aGlzLlRBRywgJ1JlY2VpdmVkIEluaXRpYWxpemF0aW9uIFNlZ21lbnQsIG1pbWVUeXBlOiAnICsgbWltZVR5cGUpO1xuICAgICAgICB0aGlzLl9sYXN0SW5pdFNlZ21lbnRzW2lzLnR5cGVdID0gaXM7XG5cbiAgICAgICAgaWYgKG1pbWVUeXBlICE9PSB0aGlzLl9taW1lVHlwZXNbaXMudHlwZV0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWltZVR5cGVzW2lzLnR5cGVdKSB7ICAvLyBlbXB0eSwgZmlyc3QgY2hhbmNlIGNyZWF0ZSBzb3VyY2VidWZmZXJcbiAgICAgICAgICAgICAgICBmaXJzdEluaXRTZWdtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW2lzLnR5cGVdID0gdGhpcy5fbWVkaWFTb3VyY2UuYWRkU291cmNlQnVmZmVyKG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgc2IuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLmUub25Tb3VyY2VCdWZmZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHNiLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZWVuZCcsIHRoaXMuZS5vblNvdXJjZUJ1ZmZlclVwZGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoTVNFRXZlbnRzLkVSUk9SLCB7Y29kZTogZXJyb3IuY29kZSwgbXNnOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCBgTm90aWNlOiAke2lzLnR5cGV9IG1pbWVUeXBlIGNoYW5nZWQsIG9yaWdpbjogJHt0aGlzLl9taW1lVHlwZXNbaXMudHlwZV19LCB0YXJnZXQ6ICR7bWltZVR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9taW1lVHlwZXNbaXMudHlwZV0gPSBtaW1lVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVmZXJyZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmVycmVkIG1lYW5zIHRoaXMgSW5pdFNlZ21lbnQgaGFzIGJlZW4gcHVzaGVkIHRvIHBlbmRpbmdTZWdtZW50cyBxdWV1ZVxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZ21lbnRzW2lzLnR5cGVdLnB1c2goaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyc3RJbml0U2VnbWVudCkgeyAgLy8gYXBwZW5kIGltbWVkaWF0ZWx5IG9ubHkgaWYgaW5pdCBzZWdtZW50IGluIHN1YnNlcXVlbmNlXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlQnVmZmVyc1tpcy50eXBlXSAmJiAhdGhpcy5fc291cmNlQnVmZmVyc1tpcy50eXBlXS51cGRhdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvQXBwZW5kU2VnbWVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoQnJvd3Nlci5zYWZhcmkgJiYgaXMuY29udGFpbmVyID09PSAnYXVkaW8vbXBlZycgJiYgaXMubWVkaWFEdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgIC8vICdhdWRpby9tcGVnJyB0cmFjayB1bmRlciBTYWZhcmkgbWF5IGNhdXNlIE1lZGlhRWxlbWVudCdzIGR1cmF0aW9uIHRvIGJlIE5hTlxuICAgICAgICAgICAgLy8gTWFudWFsbHkgY29ycmVjdCBNZWRpYVNvdXJjZS5kdXJhdGlvbiB0byBtYWtlIHByb2dyZXNzIGJhciBzZWVrYWJsZSwgYW5kIHJlcG9ydCByaWdodCBkdXJhdGlvblxuICAgICAgICAgICAgdGhpcy5fcmVxdWlyZVNldE1lZGlhRHVyYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ01lZGlhRHVyYXRpb24gPSBpcy5tZWRpYUR1cmF0aW9uIC8gMTAwMDsgIC8vIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1lZGlhU291cmNlRHVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFwcGVuZE1lZGlhU2VnbWVudChtZWRpYVNlZ21lbnQpIHtcbiAgICAgICAgbGV0IG1zID0gbWVkaWFTZWdtZW50O1xuICAgICAgICB0aGlzLl9wZW5kaW5nU2VnbWVudHNbbXMudHlwZV0ucHVzaChtcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cFNvdXJjZUJ1ZmZlciAmJiB0aGlzLl9uZWVkQ2xlYW51cFNvdXJjZUJ1ZmZlcigpKSB7XG4gICAgICAgICAgICB0aGlzLl9kb0NsZWFudXBTb3VyY2VCdWZmZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzYiA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbbXMudHlwZV07XG4gICAgICAgIGlmIChzYiAmJiAhc2IudXBkYXRpbmcgJiYgIXRoaXMuX2hhc1BlbmRpbmdSZW1vdmVSYW5nZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5fZG9BcHBlbmRTZWdtZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlayhzZWNvbmRzKSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgYXBwZW5kZWQgYnVmZmVyc1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuX3NvdXJjZUJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhYm9ydCBjdXJyZW50IGJ1ZmZlciBhcHBlbmQgYWxnb3JpdGhtXG4gICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdO1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lZGlhU291cmNlLnJlYWR5U3RhdGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHJhbmdlIHJlbW92YWwgYWxnb3JpdGhtIGlzIHJ1bm5pbmcsIEludmFsaWRTdGF0ZUVycm9yIHdpbGwgYmUgdGhyb3dlZFxuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgIHNiLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSURSTGlzdCBzaG91bGQgYmUgY2xlYXJcbiAgICAgICAgICAgIHRoaXMuX2lkckxpc3QuY2xlYXIoKTtcblxuICAgICAgICAgICAgLy8gcGVuZGluZyBzZWdtZW50cyBzaG91bGQgYmUgZGlzY2FyZFxuICAgICAgICAgICAgbGV0IHBzID0gdGhpcy5fcGVuZGluZ1NlZ21lbnRzW3R5cGVdO1xuICAgICAgICAgICAgcHMuc3BsaWNlKDAsIHBzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYVNvdXJjZS5yZWFkeVN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgICAgIC8vIFBhcmVudCBNZWRpYVNvdXJjZSBvYmplY3QgaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSBIVE1MTWVkaWFFbGVtZW50XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlY29yZCByYW5nZXMgdG8gYmUgcmVtb3ZlIGZyb20gU291cmNlQnVmZmVyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNiLmJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gc2IuYnVmZmVyZWQuc3RhcnQoaSk7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IHNiLmJ1ZmZlcmVkLmVuZChpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZlUmFuZ2VzW3R5cGVdLnB1c2goe3N0YXJ0LCBlbmR9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgc2IgaXMgbm90IHVwZGF0aW5nLCBsZXQncyByZW1vdmUgcmFuZ2VzIG5vdyFcbiAgICAgICAgICAgIGlmICghc2IudXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb1JlbW92ZVJhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYWZhcmkgMTAgbWF5IGdldCBJbnZhbGlkU3RhdGVFcnJvciBpbiB0aGUgbGF0ZXIgYXBwZW5kQnVmZmVyKCkgYWZ0ZXIgU291cmNlQnVmZmVyLnJlbW92ZSgpIGNhbGxcbiAgICAgICAgICAgIC8vIEludGVybmFsIHBhcnNlcidzIHN0YXRlIG1heSBiZSBpbnZhbGlkIGF0IHRoaXMgdGltZS4gUmUtYXBwZW5kIGxhc3QgSW5pdFNlZ21lbnQgdG8gd29ya2Fyb3VuZC5cbiAgICAgICAgICAgIC8vIFJlbGF0ZWQgaXNzdWU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkyMzBcbiAgICAgICAgICAgIGlmIChCcm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0SW5pdFNlZ21lbnQgPSB0aGlzLl9sYXN0SW5pdFNlZ21lbnRzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SW5pdFNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZ21lbnRzW3R5cGVdLnB1c2gobGFzdEluaXRTZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYi51cGRhdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9BcHBlbmRTZWdtZW50cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5kT2ZTdHJlYW0oKSB7XG4gICAgICAgIGxldCBtcyA9IHRoaXMuX21lZGlhU291cmNlO1xuICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzO1xuICAgICAgICBpZiAoIW1zIHx8IG1zLnJlYWR5U3RhdGUgIT09ICdvcGVuJykge1xuICAgICAgICAgICAgaWYgKG1zICYmIG1zLnJlYWR5U3RhdGUgPT09ICdjbG9zZWQnICYmIHRoaXMuX2hhc1BlbmRpbmdTZWdtZW50cygpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgTWVkaWFTb3VyY2UgaGFzbid0IHR1cm5lZCBpbnRvIG9wZW4gc3RhdGUsIGFuZCB0aGVyZSdyZSBwZW5kaW5nIHNlZ21lbnRzXG4gICAgICAgICAgICAgICAgLy8gTWFyayBwZW5kaW5nIGVuZE9mU3RyZWFtLCBkZWZlciBjYWxsIHVudGlsIGFsbCBwZW5kaW5nIHNlZ21lbnRzIGFwcGVuZGVkIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUGVuZGluZ0VvcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNiLnZpZGVvICYmIHNiLnZpZGVvLnVwZGF0aW5nIHx8IHNiLmF1ZGlvICYmIHNiLmF1ZGlvLnVwZGF0aW5nKSB7XG4gICAgICAgICAgICAvLyBJZiBhbnkgc291cmNlYnVmZmVyIGlzIHVwZGF0aW5nLCBkZWZlciBlbmRPZlN0cmVhbSBvcGVyYXRpb25cbiAgICAgICAgICAgIC8vIFNlZSBfb25Tb3VyY2VCdWZmZXJVcGRhdGVFbmQoKVxuICAgICAgICAgICAgdGhpcy5faGFzUGVuZGluZ0VvcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNQZW5kaW5nRW9zID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBOb3RpZnkgbWVkaWEgZGF0YSBsb2FkaW5nIGNvbXBsZXRlXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGhlbHBmdWwgZm9yIGNvcnJlY3RpbmcgdG90YWwgZHVyYXRpb24gdG8gbWF0Y2ggbGFzdCBtZWRpYSBzZWdtZW50XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgTWVkaWFFbGVtZW50J3MgZW5kZWQgZXZlbnQgbWF5IG5vdCBiZSB0cmlnZ2VyZWRcbiAgICAgICAgICAgIG1zLmVuZE9mU3RyZWFtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXROZWFyZXN0S2V5ZnJhbWUoZHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZHJMaXN0LmdldExhc3RTeW5jUG9pbnRCZWZvcmVEdHMoZHRzKTtcbiAgICB9XG5cbiAgICBfbmVlZENsZWFudXBTb3VyY2VCdWZmZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9DbGVhbnVwU291cmNlQnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG5cbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0aGlzLl9zb3VyY2VCdWZmZXJzKSB7XG4gICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdO1xuICAgICAgICAgICAgaWYgKHNiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcmVkID0gc2IuYnVmZmVyZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIGJ1ZmZlcmVkLnN0YXJ0KDApID49IHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cE1heEJhY2t3YXJkRHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9kb0NsZWFudXBTb3VyY2VCdWZmZXIoKSB7XG4gICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZTtcblxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuX3NvdXJjZUJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIGxldCBzYiA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV07XG4gICAgICAgICAgICBpZiAoc2IpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyZWQgPSBzYi5idWZmZXJlZDtcbiAgICAgICAgICAgICAgICBsZXQgZG9SZW1vdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gYnVmZmVyZWQuc3RhcnQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmQgPSBidWZmZXJlZC5lbmQoaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IGN1cnJlbnRUaW1lICYmIGN1cnJlbnRUaW1lIDwgZW5kICsgMykgeyAgLy8gcGFkZGluZyAzIHNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIHN0YXJ0ID49IHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cE1heEJhY2t3YXJkRHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1JlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW92ZUVuZCA9IGN1cnJlbnRUaW1lIC0gdGhpcy5fY29uZmlnLmF1dG9DbGVhbnVwTWluQmFja3dhcmREdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZlUmFuZ2VzW3R5cGVdLnB1c2goe3N0YXJ0OiBzdGFydCwgZW5kOiByZW1vdmVFbmR9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmQgPCBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9SZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlc1t0eXBlXS5wdXNoKHtzdGFydDogc3RhcnQsIGVuZDogZW5kfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZG9SZW1vdmUgJiYgIXNiLnVwZGF0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvUmVtb3ZlUmFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZU1lZGlhU291cmNlRHVyYXRpb24oKSB7XG4gICAgICAgIGxldCBzYiA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnM7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQucmVhZHlTdGF0ZSA9PT0gMCB8fCB0aGlzLl9tZWRpYVNvdXJjZS5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNiLnZpZGVvICYmIHNiLnZpZGVvLnVwZGF0aW5nKSB8fCAoc2IuYXVkaW8gJiYgc2IuYXVkaW8udXBkYXRpbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX21lZGlhU291cmNlLmR1cmF0aW9uO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5fcGVuZGluZ01lZGlhRHVyYXRpb247XG5cbiAgICAgICAgaWYgKHRhcmdldCA+IDAgJiYgKGlzTmFOKGN1cnJlbnQpIHx8IHRhcmdldCA+IGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBMb2cudih0aGlzLlRBRywgYFVwZGF0ZSBNZWRpYVNvdXJjZSBkdXJhdGlvbiBmcm9tICR7Y3VycmVudH0gdG8gJHt0YXJnZXR9YCk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZS5kdXJhdGlvbiA9IHRhcmdldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlcXVpcmVTZXRNZWRpYUR1cmF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdNZWRpYUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBfZG9SZW1vdmVSYW5nZXMoKSB7XG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdIHx8IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV0udXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzYiA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV07XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlc1t0eXBlXTtcbiAgICAgICAgICAgIHdoaWxlIChyYW5nZXMubGVuZ3RoICYmICFzYi51cGRhdGluZykge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHNiLnJlbW92ZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kb0FwcGVuZFNlZ21lbnRzKCkge1xuICAgICAgICBsZXQgcGVuZGluZ1NlZ21lbnRzID0gdGhpcy5fcGVuZGluZ1NlZ21lbnRzO1xuXG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gcGVuZGluZ1NlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV0gfHwgdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXS51cGRhdGluZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGVuZGluZ1NlZ21lbnRzW3R5cGVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VnbWVudCA9IHBlbmRpbmdTZWdtZW50c1t0eXBlXS5zaGlmdCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQudGltZXN0YW1wT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBNUEVHIGF1ZGlvIHN0cmVhbSBpbiBNU0UsIGlmIHVuYnVmZmVyZWQtc2Vla2luZyBvY2N1cnJlZFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGV4cGxpY2l0bHkgc2V0IHRpbWVzdGFtcE9mZnNldCB0byB0aGUgZGVzaXJlZCBwb2ludCBpbiB0aW1lbGluZSBmb3IgbXBlZyBTb3VyY2VCdWZmZXIuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50T2Zmc2V0ID0gdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXS50aW1lc3RhbXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRPZmZzZXQgPSBzZWdtZW50LnRpbWVzdGFtcE9mZnNldCAvIDEwMDA7ICAvLyBpbiBzZWNvbmRzXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlbHRhID0gTWF0aC5hYnMoY3VycmVudE9mZnNldCAtIHRhcmdldE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IDAuMSkgeyAgLy8gSWYgdGltZSBkZWx0YSA+IDEwMG1zXG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cudih0aGlzLlRBRywgYFVwZGF0ZSBNUEVHIGF1ZGlvIHRpbWVzdGFtcE9mZnNldCBmcm9tICR7Y3VycmVudE9mZnNldH0gdG8gJHt0YXJnZXRPZmZzZXR9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdLnRpbWVzdGFtcE9mZnNldCA9IHRhcmdldE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VnbWVudC50aW1lc3RhbXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW50LmRhdGEgfHwgc2VnbWVudC5kYXRhLmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVtcHR5IGJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdLmFwcGVuZEJ1ZmZlcihzZWdtZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0J1ZmZlckZ1bGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd2aWRlbycgJiYgc2VnbWVudC5oYXNPd25Qcm9wZXJ0eSgnaW5mbycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pZHJMaXN0LmFwcGVuZEFycmF5KHNlZ21lbnQuaW5mby5zeW5jUG9pbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50c1t0eXBlXS51bnNoaWZ0KHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMjIpIHsgIC8vIFF1b3RhRXhjZWVkZWRFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90aWNlIHRoYXQgRmlyZUZveCBtYXkgbm90IHRocm93IFF1b3RhRXhjZWVkZWRFcnJvciBpZiBTb3VyY2VCdWZmZXIgaXMgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICogQ3VycmVudGx5IHdlIGNhbiBvbmx5IGRvIGxhenktbG9hZCB0byBhdm9pZCBTb3VyY2VCdWZmZXIgYmVjb21lIHNjYXR0ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvdXJjZUJ1ZmZlciBldmljdGlvbiBwb2xpY3kgbWF5IGJlIGNoYW5nZWQgaW4gZnV0dXJlIHZlcnNpb24gb2YgRmlyZUZveC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxhdGVkIGlzc3VlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzk4ODVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyODAwMjNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgYnVmZmVyIGZ1bGwsIGFib3J0IG5ldHdvcmsgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNCdWZmZXJGdWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KE1TRUV2ZW50cy5CVUZGRVJfRlVMTCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0J1ZmZlckZ1bGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KE1TRUV2ZW50cy5FUlJPUiwge2NvZGU6IGVycm9yLmNvZGUsIG1zZzogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uU291cmNlT3BlbigpIHtcbiAgICAgICAgTG9nLnYodGhpcy5UQUcsICdNZWRpYVNvdXJjZSBvblNvdXJjZU9wZW4nKTtcbiAgICAgICAgdGhpcy5fbWVkaWFTb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIHRoaXMuZS5vblNvdXJjZU9wZW4pO1xuICAgICAgICAvLyBkZWZlcnJlZCBzb3VyY2VidWZmZXIgY3JlYXRpb24gLyBpbml0aWFsaXphdGlvblxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NvdXJjZUJ1ZmZlckluaXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHBlbmRpbmdzID0gdGhpcy5fcGVuZGluZ1NvdXJjZUJ1ZmZlckluaXQ7XG4gICAgICAgICAgICB3aGlsZSAocGVuZGluZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBwZW5kaW5ncy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kSW5pdFNlZ21lbnQoc2VnbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlcmUgbWF5IGJlIHNvbWUgcGVuZGluZyBtZWRpYSBzZWdtZW50cywgYXBwZW5kIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2hhc1BlbmRpbmdTZWdtZW50cygpKSB7XG4gICAgICAgICAgICB0aGlzLl9kb0FwcGVuZFNlZ21lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KE1TRUV2ZW50cy5TT1VSQ0VfT1BFTik7XG4gICAgfVxuXG4gICAgX29uU291cmNlRW5kZWQoKSB7XG4gICAgICAgIC8vIGZpcmVkIG9uIGVuZE9mU3RyZWFtXG4gICAgICAgIExvZy52KHRoaXMuVEFHLCAnTWVkaWFTb3VyY2Ugb25Tb3VyY2VFbmRlZCcpO1xuICAgIH1cblxuICAgIF9vblNvdXJjZUNsb3NlKCkge1xuICAgICAgICAvLyBmaXJlZCBvbiBkZXRhY2hpbmcgZnJvbSBtZWRpYSBlbGVtZW50XG4gICAgICAgIExvZy52KHRoaXMuVEFHLCAnTWVkaWFTb3VyY2Ugb25Tb3VyY2VDbG9zZScpO1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFTb3VyY2UgJiYgdGhpcy5lICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhU291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZW9wZW4nLCB0aGlzLmUub25Tb3VyY2VPcGVuKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhU291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZWVuZGVkJywgdGhpcy5lLm9uU291cmNlRW5kZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFTb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlY2xvc2UnLCB0aGlzLmUub25Tb3VyY2VDbG9zZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaGFzUGVuZGluZ1NlZ21lbnRzKCkge1xuICAgICAgICBsZXQgcHMgPSB0aGlzLl9wZW5kaW5nU2VnbWVudHM7XG4gICAgICAgIHJldHVybiBwcy52aWRlby5sZW5ndGggPiAwIHx8IHBzLmF1ZGlvLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgX2hhc1BlbmRpbmdSZW1vdmVSYW5nZXMoKSB7XG4gICAgICAgIGxldCBwcnIgPSB0aGlzLl9wZW5kaW5nUmVtb3ZlUmFuZ2VzO1xuICAgICAgICByZXR1cm4gcHJyLnZpZGVvLmxlbmd0aCA+IDAgfHwgcHJyLmF1ZGlvLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgX29uU291cmNlQnVmZmVyVXBkYXRlRW5kKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVxdWlyZVNldE1lZGlhRHVyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1lZGlhU291cmNlRHVyYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNQZW5kaW5nUmVtb3ZlUmFuZ2VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvUmVtb3ZlUmFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5faGFzUGVuZGluZ1NlZ21lbnRzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvQXBwZW5kU2VnbWVudHMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNQZW5kaW5nRW9zKSB7XG4gICAgICAgICAgICB0aGlzLmVuZE9mU3RyZWFtKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KE1TRUV2ZW50cy5VUERBVEVfRU5EKTtcbiAgICB9XG5cbiAgICBfb25Tb3VyY2VCdWZmZXJFcnJvcihlKSB7XG4gICAgICAgIExvZy5lKHRoaXMuVEFHLCBgU291cmNlQnVmZmVyIEVycm9yOiAke2V9YCk7XG4gICAgICAgIC8vIHRoaXMgZXJyb3IgbWlnaHQgbm90IGFsd2F5cyBiZSBmYXRhbCwganVzdCBpZ25vcmUgaXRcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTVNFQ29udHJvbGxlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgTVNFRXZlbnRzID0ge1xuICAgIEVSUk9SOiAnZXJyb3InLFxuICAgIFNPVVJDRV9PUEVOOiAnc291cmNlX29wZW4nLFxuICAgIFVQREFURV9FTkQ6ICd1cGRhdGVfZW5kJyxcbiAgICBCVUZGRVJfRlVMTDogJ2J1ZmZlcl9mdWxsJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTVNFRXZlbnRzOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgTG9nZ2luZ0NvbnRyb2wgZnJvbSAnLi4vdXRpbHMvbG9nZ2luZy1jb250cm9sLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0NvbnRyb2xsZXIgZnJvbSAnLi90cmFuc211eGluZy1jb250cm9sbGVyLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0V2ZW50cyBmcm9tICcuL3RyYW5zbXV4aW5nLWV2ZW50cy5qcyc7XG5pbXBvcnQgVHJhbnNtdXhpbmdXb3JrZXIgZnJvbSAnLi90cmFuc211eGluZy13b3JrZXIuanMnO1xuaW1wb3J0IE1lZGlhSW5mbyBmcm9tICcuL21lZGlhLWluZm8uanMnO1xuXG5jbGFzcyBUcmFuc211eGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lZGlhRGF0YVNvdXJjZSwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ1RyYW5zbXV4ZXInO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlV29ya2VyICYmIHR5cGVvZiAoV29ya2VyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHdvcmsgPSByZXF1aXJlKCd3ZWJ3b3JraWZ5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyID0gd29yayhUcmFuc211eGluZ1dvcmtlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyRGVzdHJveWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5fb25Xb3JrZXJNZXNzYWdlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnaW5pdCcsIHBhcmFtOiBbbWVkaWFEYXRhU291cmNlLCBjb25maWddfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lID0ge1xuICAgICAgICAgICAgICAgICAgICBvbkxvZ2dpbmdDb25maWdDaGFuZ2VkOiB0aGlzLl9vbkxvZ2dpbmdDb25maWdDaGFuZ2VkLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIExvZ2dpbmdDb250cm9sLnJlZ2lzdGVyTGlzdGVuZXIodGhpcy5lLm9uTG9nZ2luZ0NvbmZpZ0NoYW5nZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnbG9nZ2luZ19jb25maWcnLCBwYXJhbTogTG9nZ2luZ0NvbnRyb2wuZ2V0Q29uZmlnKCl9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsICdFcnJvciB3aGlsZSBpbml0aWFsaXplIHRyYW5zbXV4aW5nIHdvcmtlciwgZmFsbGJhY2sgdG8gaW5saW5lIHRyYW5zbXV4aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyID0gbmV3IFRyYW5zbXV4aW5nQ29udHJvbGxlcihtZWRpYURhdGFTb3VyY2UsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyID0gbmV3IFRyYW5zbXV4aW5nQ29udHJvbGxlcihtZWRpYURhdGFTb3VyY2UsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbGxlcikge1xuICAgICAgICAgICAgbGV0IGN0bCA9IHRoaXMuX2NvbnRyb2xsZXI7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuSU9fRVJST1IsIHRoaXMuX29uSU9FcnJvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUiwgdGhpcy5fb25EZW11eEVycm9yLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgY3RsLm9uKFRyYW5zbXV4aW5nRXZlbnRzLklOSVRfU0VHTUVOVCwgdGhpcy5fb25Jbml0U2VnbWVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5ULCB0aGlzLl9vbk1lZGlhU2VnbWVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5MT0FESU5HX0NPTVBMRVRFLCB0aGlzLl9vbkxvYWRpbmdDb21wbGV0ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5SRUNPVkVSRURfRUFSTFlfRU9GLCB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgY3RsLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sIHRoaXMuX29uTWVkaWFJbmZvLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgY3RsLm9uKFRyYW5zbXV4aW5nRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTywgdGhpcy5fb25TdGF0aXN0aWNzSW5mby5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCB0aGlzLl9vblJlY29tbWVuZFNlZWtwb2ludC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fd29ya2VyRGVzdHJveWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlckRlc3Ryb3lpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnZGVzdHJveSd9KTtcbiAgICAgICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5yZW1vdmVMaXN0ZW5lcih0aGlzLmUub25Mb2dnaW5nQ29uZmlnQ2hhbmdlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBoYXNXb3JrZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JrZXIgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBvcGVuKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ3N0YXJ0J30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnc3RvcCd9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlayhtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdzZWVrJywgcGFyYW06IG1pbGxpc2Vjb25kc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlci5zZWVrKG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdwYXVzZSd9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIucGF1c2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdyZXN1bWUnfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyLnJlc3VtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uSW5pdFNlZ21lbnQodHlwZSwgaW5pdFNlZ21lbnQpIHtcbiAgICAgICAgLy8gZG8gYXN5bmMgaW52b2tlXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLklOSVRfU0VHTUVOVCwgdHlwZSwgaW5pdFNlZ21lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25NZWRpYVNlZ21lbnQodHlwZSwgbWVkaWFTZWdtZW50KSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQsIHR5cGUsIG1lZGlhU2VnbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkxvYWRpbmdDb21wbGV0ZSgpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblJlY292ZXJlZEVhcmx5RW9mKCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5SRUNPVkVSRURfRUFSTFlfRU9GKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uTWVkaWFJbmZvKG1lZGlhSW5mbykge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5NRURJQV9JTkZPLCBtZWRpYUluZm8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25TdGF0aXN0aWNzSW5mbyhzdGF0aXN0aWNzSW5mbykge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5TVEFUSVNUSUNTX0lORk8sIHN0YXRpc3RpY3NJbmZvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uSU9FcnJvcih0eXBlLCBpbmZvKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLklPX0VSUk9SLCB0eXBlLCBpbmZvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uRGVtdXhFcnJvcih0eXBlLCBpbmZvKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLkRFTVVYX0VSUk9SLCB0eXBlLCBpbmZvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uUmVjb21tZW5kU2Vla3BvaW50KG1pbGxpc2Vjb25kcykge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25Mb2dnaW5nQ29uZmlnQ2hhbmdlZChjb25maWcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdsb2dnaW5nX2NvbmZpZycsIHBhcmFtOiBjb25maWd9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbldvcmtlck1lc3NhZ2UoZSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGUuZGF0YTtcbiAgICAgICAgbGV0IGRhdGEgPSBtZXNzYWdlLmRhdGE7XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UubXNnID09PSAnZGVzdHJveWVkJyB8fCB0aGlzLl93b3JrZXJEZXN0cm95aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXJEZXN0cm95aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLm1zZykge1xuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5JTklUX1NFR01FTlQ6XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KG1lc3NhZ2UubXNnLCBkYXRhLnR5cGUsIGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLkxPQURJTkdfQ09NUExFVEU6XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0Y6XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KG1lc3NhZ2UubXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuTUVESUFfSU5GTzpcbiAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZGF0YSwgTWVkaWFJbmZvLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KG1lc3NhZ2UubXNnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChtZXNzYWdlLm1zZywgZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLklPX0VSUk9SOlxuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQobWVzc2FnZS5tc2csIGRhdGEudHlwZSwgZGF0YS5pbmZvKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuUkVDT01NRU5EX1NFRUtQT0lOVDpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQobWVzc2FnZS5tc2csIGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9nY2F0X2NhbGxiYWNrJzpcbiAgICAgICAgICAgICAgICBMb2cuZW1pdHRlci5lbWl0KCdsb2cnLCBkYXRhLnR5cGUsIGRhdGEubG9nY2F0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5pbXBvcnQgTWVkaWFJbmZvIGZyb20gJy4vbWVkaWEtaW5mby5qcyc7XG5pbXBvcnQgRkxWRGVtdXhlciBmcm9tICcuLi9kZW11eC9mbHYtZGVtdXhlci5qcyc7XG5pbXBvcnQgTVA0UmVtdXhlciBmcm9tICcuLi9yZW11eC9tcDQtcmVtdXhlci5qcyc7XG5pbXBvcnQgRGVtdXhFcnJvcnMgZnJvbSAnLi4vZGVtdXgvZGVtdXgtZXJyb3JzLmpzJztcbmltcG9ydCBJT0NvbnRyb2xsZXIgZnJvbSAnLi4vaW8vaW8tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgVHJhbnNtdXhpbmdFdmVudHMgZnJvbSAnLi90cmFuc211eGluZy1ldmVudHMuanMnO1xuaW1wb3J0IHtMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi4vaW8vbG9hZGVyLmpzJztcblxuLy8gVHJhbnNtdXhpbmcgKElPLCBEZW11eGluZywgUmVtdXhpbmcpIGNvbnRyb2xsZXIsIHdpdGggbXVsdGlwYXJ0IHN1cHBvcnRcbmNsYXNzIFRyYW5zbXV4aW5nQ29udHJvbGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihtZWRpYURhdGFTb3VyY2UsIGNvbmZpZykge1xuICAgICAgICB0aGlzLlRBRyA9ICdUcmFuc211eGluZ0NvbnRyb2xsZXInO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICAvLyB0cmVhdCBzaW5nbGUgcGFydCBtZWRpYSBhcyBtdWx0aXBhcnQgbWVkaWEsIHdoaWNoIGhhcyBvbmx5IG9uZSBzZWdtZW50XG4gICAgICAgIGlmICghbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBtZWRpYURhdGFTb3VyY2Uuc2VnbWVudHMgPSBbe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBtZWRpYURhdGFTb3VyY2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgZmlsZXNpemU6IG1lZGlhRGF0YVNvdXJjZS5maWxlc2l6ZSxcbiAgICAgICAgICAgICAgICB1cmw6IG1lZGlhRGF0YVNvdXJjZS51cmxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlsbCBpbiBkZWZhdWx0IElPIHBhcmFtcyBpZiBub3QgZXhpc3RzXG4gICAgICAgIGlmICh0eXBlb2YgbWVkaWFEYXRhU291cmNlLmNvcnMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgbWVkaWFEYXRhU291cmNlLmNvcnMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWVkaWFEYXRhU291cmNlLndpdGhDcmVkZW50aWFscyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBtZWRpYURhdGFTb3VyY2Uud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tZWRpYURhdGFTb3VyY2UgPSBtZWRpYURhdGFTb3VyY2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXggPSAwO1xuICAgICAgICBsZXQgdG90YWxEdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgICAgICAgIC8vIHRpbWVzdGFtcEJhc2UgZm9yIGVhY2ggc2VnbWVudCwgYW5kIGNhbGN1bGF0ZSB0b3RhbCBkdXJhdGlvblxuICAgICAgICAgICAgc2VnbWVudC50aW1lc3RhbXBCYXNlID0gdG90YWxEdXJhdGlvbjtcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gc2VnbWVudC5kdXJhdGlvbjtcbiAgICAgICAgICAgIC8vIHBhcmFtcyBuZWVkZWQgYnkgSU9Db250cm9sbGVyXG4gICAgICAgICAgICBzZWdtZW50LmNvcnMgPSBtZWRpYURhdGFTb3VyY2UuY29ycztcbiAgICAgICAgICAgIHNlZ21lbnQud2l0aENyZWRlbnRpYWxzID0gbWVkaWFEYXRhU291cmNlLndpdGhDcmVkZW50aWFscztcbiAgICAgICAgICAgIC8vIHJlZmVycmVyIHBvbGljeSBjb250cm9sLCBpZiBleGlzdFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5yZWZlcnJlclBvbGljeSkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucmVmZXJyZXJQb2xpY3kgPSBjb25maWcucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaXNOYU4odG90YWxEdXJhdGlvbikgJiYgdGhpcy5fbWVkaWFEYXRhU291cmNlLmR1cmF0aW9uICE9PSB0b3RhbER1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYURhdGFTb3VyY2UuZHVyYXRpb24gPSB0b3RhbER1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGVtdXhlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbXV4ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9pb2N0bCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lvY3RsKSB7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVtdXhlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLl9sb2FkU2VnbWVudCgwKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgfVxuXG4gICAgX2xvYWRTZWdtZW50KHNlZ21lbnRJbmRleCwgb3B0aW9uYWxGcm9tKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXggPSBzZWdtZW50SW5kZXg7XG4gICAgICAgIGxldCBkYXRhU291cmNlID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3NlZ21lbnRJbmRleF07XG5cbiAgICAgICAgbGV0IGlvY3RsID0gdGhpcy5faW9jdGwgPSBuZXcgSU9Db250cm9sbGVyKGRhdGFTb3VyY2UsIHRoaXMuX2NvbmZpZywgc2VnbWVudEluZGV4KTtcbiAgICAgICAgaW9jdGwub25FcnJvciA9IHRoaXMuX29uSU9FeGNlcHRpb24uYmluZCh0aGlzKTtcbiAgICAgICAgaW9jdGwub25TZWVrZWQgPSB0aGlzLl9vbklPU2Vla2VkLmJpbmQodGhpcyk7XG4gICAgICAgIGlvY3RsLm9uQ29tcGxldGUgPSB0aGlzLl9vbklPQ29tcGxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgaW9jdGwub25SZWRpcmVjdCA9IHRoaXMuX29uSU9SZWRpcmVjdC5iaW5kKHRoaXMpO1xuICAgICAgICBpb2N0bC5vblJlY292ZXJlZEVhcmx5RW9mID0gdGhpcy5fb25JT1JlY292ZXJlZEVhcmx5RW9mLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbmFsRnJvbSkge1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5iaW5kRGF0YVNvdXJjZSh0aGlzLl9pb2N0bCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpb2N0bC5vbkRhdGFBcnJpdmFsID0gdGhpcy5fb25Jbml0Q2h1bmtBcnJpdmFsLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpb2N0bC5vcGVuKG9wdGlvbmFsRnJvbSk7XG4gICAgfVxuXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgfVxuXG4gICAgX2ludGVybmFsQWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pb2N0bCkge1xuICAgICAgICAgICAgdGhpcy5faW9jdGwuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5faW9jdGwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7ICAvLyB0YWtlIGEgcmVzdFxuICAgICAgICBpZiAodGhpcy5faW9jdGwgJiYgdGhpcy5faW9jdGwuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2lvY3RsLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pb2N0bCAmJiB0aGlzLl9pb2N0bC5pc1BhdXNlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bC5yZXN1bWUoKTtcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlayhtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhSW5mbyA9PSBudWxsIHx8ICF0aGlzLl9tZWRpYUluZm8uaXNTZWVrYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFyZ2V0U2VnbWVudEluZGV4ID0gdGhpcy5fc2VhcmNoU2VnbWVudEluZGV4Q29udGFpbnMobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICBpZiAodGFyZ2V0U2VnbWVudEluZGV4ID09PSB0aGlzLl9jdXJyZW50U2VnbWVudEluZGV4KSB7XG4gICAgICAgICAgICAvLyBpbnRyYS1zZWdtZW50IHNlZWtpbmdcbiAgICAgICAgICAgIGxldCBzZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1t0YXJnZXRTZWdtZW50SW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoc2VnbWVudEluZm8gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCBzZWdtZW50IGxvYWRpbmcgc3RhcnRlZCwgYnV0IG1lZGlhaW5mbyBoYXNuJ3QgcmVjZWl2ZWQgeWV0XG4gICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIG1ldGFkYXRhIGxvYWRlZCwgdGhlbiBzZWVrIHRvIGV4cGVjdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ZnJhbWUgPSBzZWdtZW50SW5mby5nZXROZWFyZXN0S2V5ZnJhbWUobWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLnNlZWsoa2V5ZnJhbWUubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pb2N0bC5zZWVrKGtleWZyYW1lLmZpbGVwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgLy8gV2lsbCBiZSByZXNvbHZlZCBpbiBfb25SZW11eGVyTWVkaWFTZWdtZW50QXJyaXZhbCgpXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgPSBrZXlmcmFtZS5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjcm9zcy1zZWdtZW50IHNlZWtpbmdcbiAgICAgICAgICAgIGxldCB0YXJnZXRTZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1t0YXJnZXRTZWdtZW50SW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0U2VnbWVudEluZm8gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHNlZ21lbnQgaGFzbid0IGJlZW4gbG9hZGVkLiBXZSBuZWVkIG1ldGFkYXRhIHRoZW4gc2VlayB0byBleHBlY3RlZCB0aW1lXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsQWJvcnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLnNlZWsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLmluc2VydERpc2NvbnRpbnVpdHkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU2VnbWVudCh0YXJnZXRTZWdtZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugd2FpdCBmb3IgdGhlIG1ldGFkYXRhIGxvYWRlZCwgdGhlbiBzZWVrIHRvIGV4cGVjdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGFyZ2V0IHNlZ21lbnQncyBtZXRhZGF0YSwgZGlyZWN0IHNlZWsgdG8gdGFyZ2V0IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGtleWZyYW1lID0gdGFyZ2V0U2VnbWVudEluZm8uZ2V0TmVhcmVzdEtleWZyYW1lKG1pbGxpc2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuc2VlayhtaWxsaXNlY29uZHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuaW5zZXJ0RGlzY29udGludWl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIucmVzZXRNZWRpYUluZm8oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZW11eGVyLnRpbWVzdGFtcEJhc2UgPSB0aGlzLl9tZWRpYURhdGFTb3VyY2Uuc2VnbWVudHNbdGFyZ2V0U2VnbWVudEluZGV4XS50aW1lc3RhbXBCYXNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTZWdtZW50KHRhcmdldFNlZ21lbnRJbmRleCwga2V5ZnJhbWUuZmlsZXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZVNlZWtQb2ludCA9IGtleWZyYW1lLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRTZWdtZW50TWVkaWFJbmZvKHRhcmdldFNlZ21lbnRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmFibGVTdGF0aXN0aWNzUmVwb3J0ZXIoKTtcbiAgICB9XG5cbiAgICBfc2VhcmNoU2VnbWVudEluZGV4Q29udGFpbnMobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGxldCBzZWdtZW50cyA9IHRoaXMuX21lZGlhRGF0YVNvdXJjZS5zZWdtZW50cztcbiAgICAgICAgbGV0IGlkeCA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kcyA8IHNlZ21lbnRzW2ldLnRpbWVzdGFtcEJhc2UpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cblxuICAgIF9vbkluaXRDaHVua0Fycml2YWwoZGF0YSwgYnl0ZVN0YXJ0KSB7XG4gICAgICAgIGxldCBwcm9iZURhdGEgPSBudWxsO1xuICAgICAgICBsZXQgY29uc3VtZWQgPSAwO1xuXG4gICAgICAgIGlmIChieXRlU3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBJT0NvbnRyb2xsZXIgc2Vla2VkIGltbWVkaWF0ZWx5IGFmdGVyIG9wZW5lZCwgYnl0ZVN0YXJ0ID4gMCBjYWxsYmFjayBtYXkgcmVjZWl2ZWRcbiAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIuYmluZERhdGFTb3VyY2UodGhpcy5faW9jdGwpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci50aW1lc3RhbXBCYXNlID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3RoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXhdLnRpbWVzdGFtcEJhc2U7XG5cbiAgICAgICAgICAgIGNvbnN1bWVkID0gdGhpcy5fZGVtdXhlci5wYXJzZUNodW5rcyhkYXRhLCBieXRlU3RhcnQpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9iZURhdGEgPSBGTFZEZW11eGVyLnByb2JlKGRhdGEpKS5tYXRjaCkge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNyZWF0ZSBuZXcgRkxWRGVtdXhlclxuICAgICAgICAgICAgdGhpcy5fZGVtdXhlciA9IG5ldyBGTFZEZW11eGVyKHByb2JlRGF0YSwgdGhpcy5fY29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9yZW11eGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtdXhlciA9IG5ldyBNUDRSZW11eGVyKHRoaXMuX2NvbmZpZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtZHMgPSB0aGlzLl9tZWRpYURhdGFTb3VyY2U7XG4gICAgICAgICAgICBpZiAobWRzLmR1cmF0aW9uICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4obWRzLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIub3ZlcnJpZGVkRHVyYXRpb24gPSBtZHMuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1kcy5oYXNBdWRpbyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vdmVycmlkZWRIYXNBdWRpbyA9IG1kcy5oYXNBdWRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWRzLmhhc1ZpZGVvID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZW11eGVyLm92ZXJyaWRlZEhhc1ZpZGVvID0gbWRzLmhhc1ZpZGVvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9kZW11eGVyLnRpbWVzdGFtcEJhc2UgPSBtZHMuc2VnbWVudHNbdGhpcy5fY3VycmVudFNlZ21lbnRJbmRleF0udGltZXN0YW1wQmFzZTtcblxuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vbkVycm9yID0gdGhpcy5fb25EZW11eEV4Y2VwdGlvbi5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vbk1lZGlhSW5mbyA9IHRoaXMuX29uTWVkaWFJbmZvLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuYmluZERhdGFTb3VyY2UodGhpcy5fZGVtdXhlclxuICAgICAgICAgICAgICAgICAgICAgICAgIC5iaW5kRGF0YVNvdXJjZSh0aGlzLl9pb2N0bFxuICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIub25Jbml0U2VnbWVudCA9IHRoaXMuX29uUmVtdXhlckluaXRTZWdtZW50QXJyaXZhbC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fcmVtdXhlci5vbk1lZGlhU2VnbWVudCA9IHRoaXMuX29uUmVtdXhlck1lZGlhU2VnbWVudEFycml2YWwuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgY29uc3VtZWQgPSB0aGlzLl9kZW11eGVyLnBhcnNlQ2h1bmtzKGRhdGEsIGJ5dGVTdGFydCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9iZURhdGEgPSBudWxsO1xuICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsICdOb24tRkxWLCBVbnN1cHBvcnRlZCBtZWRpYSB0eXBlIScpO1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuREVNVVhfRVJST1IsIERlbXV4RXJyb3JzLkZPUk1BVF9VTlNVUFBPUlRFRCwgJ05vbi1GTFYsIFVuc3VwcG9ydGVkIG1lZGlhIHR5cGUnKTtcblxuICAgICAgICAgICAgY29uc3VtZWQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnN1bWVkO1xuICAgIH1cblxuICAgIF9vbk1lZGlhSW5mbyhtZWRpYUluZm8pIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhSW5mbyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBTdG9yZSBmaXJzdCBzZWdtZW50J3MgbWVkaWFpbmZvIGFzIGdsb2JhbCBtZWRpYUluZm9cbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mbyA9IE9iamVjdC5hc3NpZ24oe30sIG1lZGlhSW5mbyk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8ua2V5ZnJhbWVzSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLnNlZ21lbnRzID0gW107XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uc2VnbWVudENvdW50ID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLl9tZWRpYUluZm8sIE1lZGlhSW5mby5wcm90b3R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlZ21lbnRJbmZvID0gT2JqZWN0LmFzc2lnbih7fSwgbWVkaWFJbmZvKTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHNlZ21lbnRJbmZvLCBNZWRpYUluZm8ucHJvdG90eXBlKTtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvLnNlZ21lbnRzW3RoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXhdID0gc2VnbWVudEluZm87XG5cbiAgICAgICAgLy8gbm90aWZ5IG1lZGlhSW5mbyB1cGRhdGVcbiAgICAgICAgdGhpcy5fcmVwb3J0U2VnbWVudE1lZGlhSW5mbyh0aGlzLl9jdXJyZW50U2VnbWVudEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NlZWtUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLl9wZW5kaW5nU2Vla1RpbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZWsodGFyZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uSU9TZWVrZWQoKSB7XG4gICAgICAgIHRoaXMuX3JlbXV4ZXIuaW5zZXJ0RGlzY29udGludWl0eSgpO1xuICAgIH1cblxuICAgIF9vbklPQ29tcGxldGUoZXh0cmFEYXRhKSB7XG4gICAgICAgIGxldCBzZWdtZW50SW5kZXggPSBleHRyYURhdGE7XG4gICAgICAgIGxldCBuZXh0U2VnbWVudEluZGV4ID0gc2VnbWVudEluZGV4ICsgMTtcblxuICAgICAgICBpZiAobmV4dFNlZ21lbnRJbmRleCA8IHRoaXMuX21lZGlhRGF0YVNvdXJjZS5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsQWJvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRTZWdtZW50KG5leHRTZWdtZW50SW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVtdXhlci5mbHVzaFN0YXNoZWRTYW1wbGVzKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURSk7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25JT1JlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpIHtcbiAgICAgICAgbGV0IHNlZ21lbnRJbmRleCA9IHRoaXMuX2lvY3RsLmV4dHJhRGF0YTtcbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3NlZ21lbnRJbmRleF0ucmVkaXJlY3RlZFVSTCA9IHJlZGlyZWN0ZWRVUkw7XG4gICAgfVxuXG4gICAgX29uSU9SZWNvdmVyZWRFYXJseUVvZigpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0YpO1xuICAgIH1cblxuICAgIF9vbklPRXhjZXB0aW9uKHR5cGUsIGluZm8pIHtcbiAgICAgICAgTG9nLmUodGhpcy5UQUcsIGBJT0V4Y2VwdGlvbjogdHlwZSA9ICR7dHlwZX0sIGNvZGUgPSAke2luZm8uY29kZX0sIG1zZyA9ICR7aW5mby5tc2d9YCk7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5JT19FUlJPUiwgdHlwZSwgaW5mbyk7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVTdGF0aXN0aWNzUmVwb3J0ZXIoKTtcbiAgICB9XG5cbiAgICBfb25EZW11eEV4Y2VwdGlvbih0eXBlLCBpbmZvKSB7XG4gICAgICAgIExvZy5lKHRoaXMuVEFHLCBgRGVtdXhFeGNlcHRpb246IHR5cGUgPSAke3R5cGV9LCBpbmZvID0gJHtpbmZvfWApO1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuREVNVVhfRVJST1IsIHR5cGUsIGluZm8pO1xuICAgIH1cblxuICAgIF9vblJlbXV4ZXJJbml0U2VnbWVudEFycml2YWwodHlwZSwgaW5pdFNlZ21lbnQpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLklOSVRfU0VHTUVOVCwgdHlwZSwgaW5pdFNlZ21lbnQpO1xuICAgIH1cblxuICAgIF9vblJlbXV4ZXJNZWRpYVNlZ21lbnRBcnJpdmFsKHR5cGUsIG1lZGlhU2VnbWVudCkge1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NlZWtUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE1lZGlhIHNlZ21lbnRzIGFmdGVyIG5ldy1zZWdtZW50IGNyb3NzLXNlZWtpbmcgc2hvdWxkIGJlIGRyb3BwZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQsIHR5cGUsIG1lZGlhU2VnbWVudCk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwZW5kaW5nIHNlZWtQb2ludFxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgIT0gbnVsbCAmJiB0eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICBsZXQgc3luY1BvaW50cyA9IG1lZGlhU2VnbWVudC5pbmZvLnN5bmNQb2ludHM7XG4gICAgICAgICAgICBsZXQgc2Vla3BvaW50ID0gdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQ7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZVNlZWtQb2ludCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIFNhZmFyaTogUGFzcyBQVFMgZm9yIHJlY29tbWVuZF9zZWVrcG9pbnRcbiAgICAgICAgICAgIGlmIChCcm93c2VyLnNhZmFyaSAmJiBzeW5jUG9pbnRzLmxlbmd0aCA+IDAgJiYgc3luY1BvaW50c1swXS5vcmlnaW5hbER0cyA9PT0gc2Vla3BvaW50KSB7XG4gICAgICAgICAgICAgICAgc2Vla3BvaW50ID0gc3luY1BvaW50c1swXS5wdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlOiB1c2Ugb3JpZ2luYWwgRFRTIChrZXlmcmFtZS5taWxsaXNlY29uZHMpXG5cbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCBzZWVrcG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2VuYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBzZWxmLnNldEludGVydmFsKFxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydFN0YXRpc3RpY3NJbmZvLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuc3RhdGlzdGljc0luZm9SZXBvcnRJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZGlzYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlcikge1xuICAgICAgICAgICAgc2VsZi5jbGVhckludGVydmFsKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlcik7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlcG9ydFNlZ21lbnRNZWRpYUluZm8oc2VnbWVudEluZGV4KSB7XG4gICAgICAgIGxldCBzZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1tzZWdtZW50SW5kZXhdO1xuICAgICAgICBsZXQgZXhwb3J0SW5mbyA9IE9iamVjdC5hc3NpZ24oe30sIHNlZ21lbnRJbmZvKTtcblxuICAgICAgICBleHBvcnRJbmZvLmR1cmF0aW9uID0gdGhpcy5fbWVkaWFJbmZvLmR1cmF0aW9uO1xuICAgICAgICBleHBvcnRJbmZvLnNlZ21lbnRDb3VudCA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50Q291bnQ7XG4gICAgICAgIGRlbGV0ZSBleHBvcnRJbmZvLnNlZ21lbnRzO1xuICAgICAgICBkZWxldGUgZXhwb3J0SW5mby5rZXlmcmFtZXNJbmRleDtcblxuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTUVESUFfSU5GTywgZXhwb3J0SW5mbyk7XG4gICAgfVxuXG4gICAgX3JlcG9ydFN0YXRpc3RpY3NJbmZvKCkge1xuICAgICAgICBsZXQgaW5mbyA9IHt9O1xuXG4gICAgICAgIGluZm8udXJsID0gdGhpcy5faW9jdGwuY3VycmVudFVSTDtcbiAgICAgICAgaW5mby5oYXNSZWRpcmVjdCA9IHRoaXMuX2lvY3RsLmhhc1JlZGlyZWN0O1xuICAgICAgICBpZiAoaW5mby5oYXNSZWRpcmVjdCkge1xuICAgICAgICAgICAgaW5mby5yZWRpcmVjdGVkVVJMID0gdGhpcy5faW9jdGwuY3VycmVudFJlZGlyZWN0ZWRVUkw7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLnNwZWVkID0gdGhpcy5faW9jdGwuY3VycmVudFNwZWVkO1xuICAgICAgICBpbmZvLmxvYWRlclR5cGUgPSB0aGlzLl9pb2N0bC5sb2FkZXJUeXBlO1xuICAgICAgICBpbmZvLmN1cnJlbnRTZWdtZW50SW5kZXggPSB0aGlzLl9jdXJyZW50U2VnbWVudEluZGV4O1xuICAgICAgICBpbmZvLnRvdGFsU2VnbWVudENvdW50ID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzLmxlbmd0aDtcblxuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCBpbmZvKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhpbmdDb250cm9sbGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBUcmFuc211eGluZ0V2ZW50cyA9IHtcbiAgICBJT19FUlJPUjogJ2lvX2Vycm9yJyxcbiAgICBERU1VWF9FUlJPUjogJ2RlbXV4X2Vycm9yJyxcbiAgICBJTklUX1NFR01FTlQ6ICdpbml0X3NlZ21lbnQnLFxuICAgIE1FRElBX1NFR01FTlQ6ICdtZWRpYV9zZWdtZW50JyxcbiAgICBMT0FESU5HX0NPTVBMRVRFOiAnbG9hZGluZ19jb21wbGV0ZScsXG4gICAgUkVDT1ZFUkVEX0VBUkxZX0VPRjogJ3JlY292ZXJlZF9lYXJseV9lb2YnLFxuICAgIE1FRElBX0lORk86ICdtZWRpYV9pbmZvJyxcbiAgICBTVEFUSVNUSUNTX0lORk86ICdzdGF0aXN0aWNzX2luZm8nLFxuICAgIFJFQ09NTUVORF9TRUVLUE9JTlQ6ICdyZWNvbW1lbmRfc2Vla3BvaW50J1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhpbmdFdmVudHM7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBMb2dnaW5nQ29udHJvbCBmcm9tICcuLi91dGlscy9sb2dnaW5nLWNvbnRyb2wuanMnO1xuaW1wb3J0IFBvbHlmaWxsIGZyb20gJy4uL3V0aWxzL3BvbHlmaWxsLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0NvbnRyb2xsZXIgZnJvbSAnLi90cmFuc211eGluZy1jb250cm9sbGVyLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0V2ZW50cyBmcm9tICcuL3RyYW5zbXV4aW5nLWV2ZW50cy5qcyc7XG5cbi8qIHBvc3QgbWVzc2FnZSB0byB3b3JrZXI6XG4gICBkYXRhOiB7XG4gICAgICAgY21kOiBzdHJpbmdcbiAgICAgICBwYXJhbTogYW55XG4gICB9XG5cbiAgIHJlY2VpdmUgbWVzc2FnZSBmcm9tIHdvcmtlcjpcbiAgIGRhdGE6IHtcbiAgICAgICBtc2c6IHN0cmluZyxcbiAgICAgICBkYXRhOiBhbnlcbiAgIH1cbiAqL1xuXG5sZXQgVHJhbnNtdXhpbmdXb3JrZXIgPSBmdW5jdGlvbiAoc2VsZikge1xuXG4gICAgbGV0IFRBRyA9ICdUcmFuc211eGluZ1dvcmtlcic7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGxldCBsb2djYXRMaXN0ZW5lciA9IG9uTG9nY2F0Q2FsbGJhY2suYmluZCh0aGlzKTtcblxuICAgIFBvbHlmaWxsLmluc3RhbGwoKTtcblxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHN3aXRjaCAoZS5kYXRhLmNtZCkge1xuICAgICAgICAgICAgY2FzZSAnaW5pdCc6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG5ldyBUcmFuc211eGluZ0NvbnRyb2xsZXIoZS5kYXRhLnBhcmFtWzBdLCBlLmRhdGEucGFyYW1bMV0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuSU9fRVJST1IsIG9uSU9FcnJvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLkRFTVVYX0VSUk9SLCBvbkRlbXV4RXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5JTklUX1NFR01FTlQsIG9uSW5pdFNlZ21lbnQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5ULCBvbk1lZGlhU2VnbWVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLkxPQURJTkdfQ09NUExFVEUsIG9uTG9hZGluZ0NvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuUkVDT1ZFUkVEX0VBUkxZX0VPRiwgb25SZWNvdmVyZWRFYXJseUVvZi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sIG9uTWVkaWFJbmZvLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCBvblN0YXRpc3RpY3NJbmZvLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuUkVDT01NRU5EX1NFRUtQT0lOVCwgb25SZWNvbW1lbmRTZWVrcG9pbnQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe21zZzogJ2Rlc3Ryb3llZCd9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzdG9wJzpcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlZWsnOlxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc2VlayhlLmRhdGEucGFyYW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGF1c2UnOlxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Jlc3VtZSc6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xvZ2dpbmdfY29uZmlnJzoge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBlLmRhdGEucGFyYW07XG4gICAgICAgICAgICAgICAgTG9nZ2luZ0NvbnRyb2wuYXBwbHlDb25maWcoY29uZmlnKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZW5hYmxlQ2FsbGJhY2sgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0NvbnRyb2wuYWRkTG9nTGlzdGVuZXIobG9nY2F0TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmdDb250cm9sLnJlbW92ZUxvZ0xpc3RlbmVyKGxvZ2NhdExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG9uSW5pdFNlZ21lbnQodHlwZSwgaW5pdFNlZ21lbnQpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIG1zZzogVHJhbnNtdXhpbmdFdmVudHMuSU5JVF9TRUdNRU5ULFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgZGF0YTogaW5pdFNlZ21lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmosIFtpbml0U2VnbWVudC5kYXRhXSk7ICAvLyBkYXRhOiBBcnJheUJ1ZmZlclxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWVkaWFTZWdtZW50KHR5cGUsIG1lZGlhU2VnbWVudCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5ULFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgZGF0YTogbWVkaWFTZWdtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uob2JqLCBbbWVkaWFTZWdtZW50LmRhdGFdKTsgIC8vIGRhdGE6IEFycmF5QnVmZmVyXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Mb2FkaW5nQ29tcGxldGUoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLkxPQURJTkdfQ09NUExFVEVcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVjb3ZlcmVkRWFybHlFb2YoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0ZcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWVkaWFJbmZvKG1lZGlhSW5mbykge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5NRURJQV9JTkZPLFxuICAgICAgICAgICAgZGF0YTogbWVkaWFJbmZvXG4gICAgICAgIH07XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uob2JqKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN0YXRpc3RpY3NJbmZvKHN0YXRJbmZvKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTyxcbiAgICAgICAgICAgIGRhdGE6IHN0YXRJbmZvXG4gICAgICAgIH07XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uob2JqKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbklPRXJyb3IodHlwZSwgaW5mbykge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIG1zZzogVHJhbnNtdXhpbmdFdmVudHMuSU9fRVJST1IsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBpbmZvOiBpbmZvXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVtdXhFcnJvcih0eXBlLCBpbmZvKSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUixcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGluZm86IGluZm9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25SZWNvbW1lbmRTZWVrcG9pbnQobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULFxuICAgICAgICAgICAgZGF0YTogbWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTG9nY2F0Q2FsbGJhY2sodHlwZSwgc3RyKSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgbXNnOiAnbG9nY2F0X2NhbGxiYWNrJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGxvZ2NhdDogc3RyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhpbmdXb3JrZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBkZWNvZGVVVEY4IGZyb20gJy4uL3V0aWxzL3V0ZjgtY29udi5qcyc7XG5pbXBvcnQge0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxubGV0IGxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYnVmID0gbmV3IEFycmF5QnVmZmVyKDIpO1xuICAgIChuZXcgRGF0YVZpZXcoYnVmKSkuc2V0SW50MTYoMCwgMjU2LCB0cnVlKTsgIC8vIGxpdHRsZS1lbmRpYW4gd3JpdGVcbiAgICByZXR1cm4gKG5ldyBJbnQxNkFycmF5KGJ1ZikpWzBdID09PSAyNTY7ICAvLyBwbGF0Zm9ybS1zcGVjIHJlYWQsIGlmIGVxdWFsIHRoZW4gTEVcbn0pKCk7XG5cbmNsYXNzIEFNRiB7XG5cbiAgICBzdGF0aWMgcGFyc2VTY3JpcHREYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBsZXQgZGF0YSA9IHt9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IEFNRi5wYXJzZVZhbHVlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBTUYucGFyc2VWYWx1ZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG5hbWUuc2l6ZSwgZGF0YVNpemUgLSBuYW1lLnNpemUpO1xuXG4gICAgICAgICAgICBkYXRhW25hbWUuZGF0YV0gPSB2YWx1ZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZSgnQU1GJywgZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZU9iamVjdChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRGF0YSBub3QgZW5vdWdoIHdoZW4gcGFyc2UgU2NyaXB0RGF0YU9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lID0gQU1GLnBhcnNlU3RyaW5nKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCB2YWx1ZSA9IEFNRi5wYXJzZVZhbHVlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgbmFtZS5zaXplLCBkYXRhU2l6ZSAtIG5hbWUuc2l6ZSk7XG4gICAgICAgIGxldCBpc09iamVjdEVuZCA9IHZhbHVlLm9iamVjdEVuZDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUuZGF0YSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUuZGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpemU6IG5hbWUuc2l6ZSArIHZhbHVlLnNpemUsXG4gICAgICAgICAgICBvYmplY3RFbmQ6IGlzT2JqZWN0RW5kXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlVmFyaWFibGUoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIHJldHVybiBBTUYucGFyc2VPYmplY3QoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VTdHJpbmcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIGlmIChkYXRhU2l6ZSA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0RhdGEgbm90IGVub3VnaCB3aGVuIHBhcnNlIFN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCBsZW5ndGggPSB2LmdldFVpbnQxNigwLCAhbGUpO1xuXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdHIgPSBkZWNvZGVVVEY4KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgMiwgbGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBzdHIsXG4gICAgICAgICAgICBzaXplOiAyICsgbGVuZ3RoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlTG9uZ1N0cmluZyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRGF0YSBub3QgZW5vdWdoIHdoZW4gcGFyc2UgTG9uZ1N0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCBsZW5ndGggPSB2LmdldFVpbnQzMigwLCAhbGUpO1xuXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdHIgPSBkZWNvZGVVVEY4KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgNCwgbGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBzdHIsXG4gICAgICAgICAgICBzaXplOiA0ICsgbGVuZ3RoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlRGF0ZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgMTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0RhdGEgc2l6ZSBpbnZhbGlkIHdoZW4gcGFyc2UgRGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCB0aW1lc3RhbXAgPSB2LmdldEZsb2F0NjQoMCwgIWxlKTtcbiAgICAgICAgbGV0IGxvY2FsVGltZU9mZnNldCA9IHYuZ2V0SW50MTYoOCwgIWxlKTtcbiAgICAgICAgdGltZXN0YW1wICs9IGxvY2FsVGltZU9mZnNldCAqIDYwICogMTAwMDsgIC8vIGdldCBVVEMgdGltZVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBuZXcgRGF0ZSh0aW1lc3RhbXApLFxuICAgICAgICAgICAgc2l6ZTogOCArIDJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VWYWx1ZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRGF0YSBub3QgZW5vdWdoIHdoZW4gcGFyc2UgVmFsdWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDE7XG4gICAgICAgIGxldCB0eXBlID0gdi5nZXRVaW50OCgwKTtcbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBsZXQgb2JqZWN0RW5kID0gZmFsc2U7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIE51bWJlcihEb3VibGUpIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2LmdldEZsb2F0NjQoMSwgIWxlKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTogeyAgLy8gQm9vbGVhbiB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGxldCBiID0gdi5nZXRVaW50OCgxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMjogeyAgLy8gU3RyaW5nIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFtZnN0ciA9IEFNRi5wYXJzZVN0cmluZyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYW1mc3RyLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhbWZzdHIuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMzogeyAvLyBPYmplY3QocykgdHlwZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWwgPSAwOyAgLy8gd29ya2Fyb3VuZCBmb3IgbWFsZm9ybWVkIE9iamVjdHMgd2hpY2ggaGFzIG1pc3NpbmcgU2NyaXB0RGF0YU9iamVjdEVuZFxuICAgICAgICAgICAgICAgICAgICBpZiAoKHYuZ2V0VWludDMyKGRhdGFTaXplIC0gNCwgIWxlKSAmIDB4MDBGRkZGRkYpID09PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IGRhdGFTaXplIC0gNCkgeyAgLy8gNCA9PT0gdHlwZShVSTgpICsgU2NyaXB0RGF0YU9iamVjdEVuZChVSTI0KVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFtZm9iaiA9IEFNRi5wYXJzZU9iamVjdChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG9mZnNldCwgZGF0YVNpemUgLSBvZmZzZXQgLSB0ZXJtaW5hbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1mb2JqLm9iamVjdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2FtZm9iai5kYXRhLm5hbWVdID0gYW1mb2JqLmRhdGEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYW1mb2JqLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8PSBkYXRhU2l6ZSAtIDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZXIgPSB2LmdldFVpbnQzMihvZmZzZXQgLSAxLCAhbGUpICYgMHgwMEZGRkZGRjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSA4OiB7IC8vIEVDTUEgYXJyYXkgdHlwZSAoTWl4ZWQgYXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OyAgLy8gRUNNQUFycmF5TGVuZ3RoKFVJMzIpXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IDA7ICAvLyB3b3JrYXJvdW5kIGZvciBtYWxmb3JtZWQgTWl4ZWRBcnJheXMgd2hpY2ggaGFzIG1pc3NpbmcgU2NyaXB0RGF0YU9iamVjdEVuZFxuICAgICAgICAgICAgICAgICAgICBpZiAoKHYuZ2V0VWludDMyKGRhdGFTaXplIC0gNCwgIWxlKSAmIDB4MDBGRkZGRkYpID09PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IGRhdGFTaXplIC0gOCkgeyAgLy8gOCA9PT0gdHlwZShVSTgpICsgRUNNQUFycmF5TGVuZ3RoKFVJMzIpICsgU2NyaXB0RGF0YVZhcmlhYmxlRW5kKFVJMjQpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW1mdmFyID0gQU1GLnBhcnNlVmFyaWFibGUoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyBvZmZzZXQsIGRhdGFTaXplIC0gb2Zmc2V0IC0gdGVybWluYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFtZnZhci5vYmplY3RFbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVthbWZ2YXIuZGF0YS5uYW1lXSA9IGFtZnZhci5kYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFtZnZhci5zaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPD0gZGF0YVNpemUgLSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VyID0gdi5nZXRVaW50MzIob2Zmc2V0IC0gMSwgIWxlKSAmIDB4MDBGRkZGRkY7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyID09PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgOTogIC8vIFNjcmlwdERhdGFPYmplY3RFbmRcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6IHsgIC8vIFN0cmljdCBhcnJheSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNjcmlwdERhdGFWYWx1ZVtuXS4gTk9URTogYWNjb3JkaW5nIHRvIHZpZGVvX2ZpbGVfZm9ybWF0X3NwZWNfdjEwXzEucGRmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHJpY3RBcnJheUxlbmd0aCA9IHYuZ2V0VWludDMyKDEsICFsZSk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmljdEFycmF5TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWwgPSBBTUYucGFyc2VWYWx1ZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG9mZnNldCwgZGF0YVNpemUgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUucHVzaCh2YWwuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdmFsLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMTE6IHsgIC8vIERhdGUgdHlwZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IEFNRi5wYXJzZURhdGUoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAxLCBkYXRhU2l6ZSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGUuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgMTI6IHsgIC8vIExvbmcgc3RyaW5nIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFtZkxvbmdTdHIgPSBBTUYucGFyc2VTdHJpbmcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAxLCBkYXRhU2l6ZSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFtZkxvbmdTdHIuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFtZkxvbmdTdHIuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbmQgc2tpcFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBkYXRhU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgTG9nLncoJ0FNRicsICdVbnN1cHBvcnRlZCBBTUYgdmFsdWUgdHlwZSAnICsgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lKCdBTUYnLCBlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHZhbHVlLFxuICAgICAgICAgICAgc2l6ZTogb2Zmc2V0LFxuICAgICAgICAgICAgb2JqZWN0RW5kOiBvYmplY3RFbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQU1GOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBEZW11eEVycm9ycyA9IHtcbiAgICBPSzogJ09LJyxcbiAgICBGT1JNQVRfRVJST1I6ICdGb3JtYXRFcnJvcicsXG4gICAgRk9STUFUX1VOU1VQUE9SVEVEOiAnRm9ybWF0VW5zdXBwb3J0ZWQnLFxuICAgIENPREVDX1VOU1VQUE9SVEVEOiAnQ29kZWNVbnN1cHBvcnRlZCdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERlbXV4RXJyb3JzOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG4vLyBFeHBvbmVudGlhbC1Hb2xvbWIgYnVmZmVyIGRlY29kZXJcbmNsYXNzIEV4cEdvbG9tYiB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1aW50OGFycmF5KSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ0V4cEdvbG9tYic7XG5cbiAgICAgICAgdGhpcy5fYnVmZmVyID0gdWludDhhcnJheTtcbiAgICAgICAgdGhpcy5fYnVmZmVyX2luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fdG90YWxfYnl0ZXMgPSB1aW50OGFycmF5LmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMuX3RvdGFsX2JpdHMgPSB1aW50OGFycmF5LmJ5dGVMZW5ndGggKiA4O1xuICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmQgPSAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gMDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSBudWxsO1xuICAgIH1cblxuICAgIF9maWxsQ3VycmVudFdvcmQoKSB7XG4gICAgICAgIGxldCBidWZmZXJfYnl0ZXNfbGVmdCA9IHRoaXMuX3RvdGFsX2J5dGVzIC0gdGhpcy5fYnVmZmVyX2luZGV4O1xuICAgICAgICBpZiAoYnVmZmVyX2J5dGVzX2xlZnQgPD0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0V4cEdvbG9tYjogX2ZpbGxDdXJyZW50V29yZCgpIGJ1dCBubyBieXRlcyBhdmFpbGFibGUnKTtcblxuICAgICAgICBsZXQgYnl0ZXNfcmVhZCA9IE1hdGgubWluKDQsIGJ1ZmZlcl9ieXRlc19sZWZ0KTtcbiAgICAgICAgbGV0IHdvcmQgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgd29yZC5zZXQodGhpcy5fYnVmZmVyLnN1YmFycmF5KHRoaXMuX2J1ZmZlcl9pbmRleCwgdGhpcy5fYnVmZmVyX2luZGV4ICsgYnl0ZXNfcmVhZCkpO1xuICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmQgPSBuZXcgRGF0YVZpZXcod29yZC5idWZmZXIpLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fYnVmZmVyX2luZGV4ICs9IGJ5dGVzX3JlYWQ7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSBieXRlc19yZWFkICogODtcbiAgICB9XG5cbiAgICByZWFkQml0cyhiaXRzKSB7XG4gICAgICAgIGlmIChiaXRzID4gMzIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdFeHBHb2xvbWI6IHJlYWRCaXRzKCkgYml0cyBleGNlZWRlZCBtYXggMzJiaXRzIScpO1xuXG4gICAgICAgIGlmIChiaXRzIDw9IHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9jdXJyZW50X3dvcmQgPj4+ICgzMiAtIGJpdHMpO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudF93b3JkIDw8PSBiaXRzO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdCAtPSBiaXRzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0ID8gdGhpcy5fY3VycmVudF93b3JkIDogMDtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID4+PiAoMzIgLSB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0KTtcbiAgICAgICAgbGV0IGJpdHNfbmVlZF9sZWZ0ID0gYml0cyAtIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQ7XG5cbiAgICAgICAgdGhpcy5fZmlsbEN1cnJlbnRXb3JkKCk7XG4gICAgICAgIGxldCBiaXRzX3JlYWRfbmV4dCA9IE1hdGgubWluKGJpdHNfbmVlZF9sZWZ0LCB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0KTtcblxuICAgICAgICBsZXQgcmVzdWx0MiA9IHRoaXMuX2N1cnJlbnRfd29yZCA+Pj4gKDMyIC0gYml0c19yZWFkX25leHQpO1xuICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmQgPDw9IGJpdHNfcmVhZF9uZXh0O1xuICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0IC09IGJpdHNfcmVhZF9uZXh0O1xuXG4gICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgYml0c19yZWFkX25leHQpIHwgcmVzdWx0MjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZWFkQm9vbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoMSkgPT09IDE7XG4gICAgfVxuXG4gICAgcmVhZEJ5dGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKDgpO1xuICAgIH1cblxuICAgIF9za2lwTGVhZGluZ1plcm8oKSB7XG4gICAgICAgIGxldCB6ZXJvX2NvdW50O1xuICAgICAgICBmb3IgKHplcm9fY291bnQgPSAwOyB6ZXJvX2NvdW50IDwgdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdDsgemVyb19jb3VudCsrKSB7XG4gICAgICAgICAgICBpZiAoMCAhPT0gKHRoaXMuX2N1cnJlbnRfd29yZCAmICgweDgwMDAwMDAwID4+PiB6ZXJvX2NvdW50KSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmQgPDw9IHplcm9fY291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdCAtPSB6ZXJvX2NvdW50O1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvX2NvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpbGxDdXJyZW50V29yZCgpO1xuICAgICAgICByZXR1cm4gemVyb19jb3VudCArIHRoaXMuX3NraXBMZWFkaW5nWmVybygpO1xuICAgIH1cblxuICAgIHJlYWRVRUcoKSB7ICAvLyB1bnNpZ25lZCBleHBvbmVudGlhbCBnb2xvbWJcbiAgICAgICAgbGV0IGxlYWRpbmdfemVyb3MgPSB0aGlzLl9za2lwTGVhZGluZ1plcm8oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHMobGVhZGluZ196ZXJvcyArIDEpIC0gMTtcbiAgICB9XG5cbiAgICByZWFkU0VHKCkgeyAgLy8gc2lnbmVkIGV4cG9uZW50aWFsIGdvbG9tYlxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlYWRVRUcoKTtcbiAgICAgICAgaWYgKHZhbHVlICYgMHgwMSkge1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSArIDEpID4+PiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xICogKHZhbHVlID4+PiAxKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHBHb2xvbWI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBBTUYgZnJvbSAnLi9hbWYtcGFyc2VyLmpzJztcbmltcG9ydCBTUFNQYXJzZXIgZnJvbSAnLi9zcHMtcGFyc2VyLmpzJztcbmltcG9ydCBEZW11eEVycm9ycyBmcm9tICcuL2RlbXV4LWVycm9ycy5qcyc7XG5pbXBvcnQgTWVkaWFJbmZvIGZyb20gJy4uL2NvcmUvbWVkaWEtaW5mby5qcyc7XG5pbXBvcnQge0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuZnVuY3Rpb24gU3dhcDE2KHNyYykge1xuICAgIHJldHVybiAoKChzcmMgPj4+IDgpICYgMHhGRikgfFxuICAgICAgICAgICAgKChzcmMgJiAweEZGKSA8PCA4KSk7XG59XG5cbmZ1bmN0aW9uIFN3YXAzMihzcmMpIHtcbiAgICByZXR1cm4gKCgoc3JjICYgMHhGRjAwMDAwMCkgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHNyYyAmIDB4MDBGRjAwMDApID4+PiA4KSAgfFxuICAgICAgICAgICAgKChzcmMgJiAweDAwMDBGRjAwKSA8PCA4KSAgIHxcbiAgICAgICAgICAgICgoc3JjICYgMHgwMDAwMDBGRikgPDwgMjQpKTtcbn1cblxuZnVuY3Rpb24gUmVhZEJpZzMyKGFycmF5LCBpbmRleCkge1xuICAgIHJldHVybiAoKGFycmF5W2luZGV4XSA8PCAyNCkgICAgIHxcbiAgICAgICAgICAgIChhcnJheVtpbmRleCArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgICAoYXJyYXlbaW5kZXggKyAyXSA8PCA4KSAgfFxuICAgICAgICAgICAgKGFycmF5W2luZGV4ICsgM10pKTtcbn1cblxuXG5jbGFzcyBGTFZEZW11eGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHByb2JlRGF0YSwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ0ZMVkRlbXV4ZXInO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25NZWRpYUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9vblRyYWNrTWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkRhdGFBdmFpbGFibGUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2RhdGFPZmZzZXQgPSBwcm9iZURhdGEuZGF0YU9mZnNldDtcbiAgICAgICAgdGhpcy5fZmlyc3RQYXJzZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5faGFzQXVkaW8gPSBwcm9iZURhdGEuaGFzQXVkaW9UcmFjaztcbiAgICAgICAgdGhpcy5faGFzVmlkZW8gPSBwcm9iZURhdGEuaGFzVmlkZW9UcmFjaztcblxuICAgICAgICB0aGlzLl9oYXNBdWRpb0ZsYWdPdmVycmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzVmlkZW9GbGFnT3ZlcnJpZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fYXVkaW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3ZpZGVvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX21lZGlhSW5mbyA9IG5ldyBNZWRpYUluZm8oKTtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc0F1ZGlvID0gdGhpcy5faGFzQXVkaW87XG4gICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNWaWRlbyA9IHRoaXMuX2hhc1ZpZGVvO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F1ZGlvTWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl92aWRlb01ldGFkYXRhID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9uYWx1TGVuZ3RoU2l6ZSA9IDQ7XG4gICAgICAgIHRoaXMuX3RpbWVzdGFtcEJhc2UgPSAwOyAgLy8gaW50MzIsIGluIG1pbGxpc2Vjb25kc1xuICAgICAgICB0aGlzLl90aW1lc2NhbGUgPSAxMDAwO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IDA7ICAvLyBpbnQzMiwgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIHRoaXMuX2R1cmF0aW9uT3ZlcnJpZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZSA9IHtcbiAgICAgICAgICAgIGZpeGVkOiB0cnVlLFxuICAgICAgICAgICAgZnBzOiAyMy45NzYsXG4gICAgICAgICAgICBmcHNfbnVtOiAyMzk3NixcbiAgICAgICAgICAgIGZwc19kZW46IDEwMDBcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9mbHZTb3VuZFJhdGVUYWJsZSA9IFs1NTAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwLCA0ODAwMF07XG5cbiAgICAgICAgdGhpcy5fbXBlZ1NhbXBsaW5nUmF0ZXMgPSBbXG4gICAgICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLFxuICAgICAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5fbXBlZ0F1ZGlvVjEwU2FtcGxlUmF0ZVRhYmxlID0gWzQ0MTAwLCA0ODAwMCwgMzIwMDAsIDBdO1xuICAgICAgICB0aGlzLl9tcGVnQXVkaW9WMjBTYW1wbGVSYXRlVGFibGUgPSBbMjIwNTAsIDI0MDAwLCAxNjAwMCwgMF07XG4gICAgICAgIHRoaXMuX21wZWdBdWRpb1YyNVNhbXBsZVJhdGVUYWJsZSA9IFsxMTAyNSwgMTIwMDAsIDgwMDAsICAwXTtcblxuICAgICAgICB0aGlzLl9tcGVnQXVkaW9MMUJpdFJhdGVUYWJsZSA9IFswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgLTFdO1xuICAgICAgICB0aGlzLl9tcGVnQXVkaW9MMkJpdFJhdGVUYWJsZSA9IFswLCAzMiwgNDgsIDU2LCAgNjQsICA4MCwgIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NCwgLTFdO1xuICAgICAgICB0aGlzLl9tcGVnQXVkaW9MM0JpdFJhdGVUYWJsZSA9IFswLCAzMiwgNDAsIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgLTFdO1xuXG4gICAgICAgIHRoaXMuX3ZpZGVvVHJhY2sgPSB7dHlwZTogJ3ZpZGVvJywgaWQ6IDEsIHNlcXVlbmNlTnVtYmVyOiAwLCBzYW1wbGVzOiBbXSwgbGVuZ3RoOiAwfTtcbiAgICAgICAgdGhpcy5fYXVkaW9UcmFjayA9IHt0eXBlOiAnYXVkaW8nLCBpZDogMiwgc2VxdWVuY2VOdW1iZXI6IDAsIHNhbXBsZXM6IFtdLCBsZW5ndGg6IDB9O1xuXG4gICAgICAgIHRoaXMuX2xpdHRsZUVuZGlhbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYnVmID0gbmV3IEFycmF5QnVmZmVyKDIpO1xuICAgICAgICAgICAgKG5ldyBEYXRhVmlldyhidWYpKS5zZXRJbnQxNigwLCAyNTYsIHRydWUpOyAgLy8gbGl0dGxlLWVuZGlhbiB3cml0ZVxuICAgICAgICAgICAgcmV0dXJuIChuZXcgSW50MTZBcnJheShidWYpKVswXSA9PT0gMjU2OyAgLy8gcGxhdGZvcm0tc3BlYyByZWFkLCBpZiBlcXVhbCB0aGVuIExFXG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9hdWRpb01ldGFkYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9NZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvVHJhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLl9hdWRpb1RyYWNrID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25NZWRpYUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9vblRyYWNrTWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkRhdGFBdmFpbGFibGUgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcm9iZShidWZmZXIpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBsZXQgbWlzbWF0Y2ggPSB7bWF0Y2g6IGZhbHNlfTtcblxuICAgICAgICBpZiAoZGF0YVswXSAhPT0gMHg0NiB8fCBkYXRhWzFdICE9PSAweDRDIHx8IGRhdGFbMl0gIT09IDB4NTYgfHwgZGF0YVszXSAhPT0gMHgwMSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc0F1ZGlvID0gKChkYXRhWzRdICYgNCkgPj4+IDIpICE9PSAwO1xuICAgICAgICBsZXQgaGFzVmlkZW8gPSAoZGF0YVs0XSAmIDEpICE9PSAwO1xuXG4gICAgICAgIGxldCBvZmZzZXQgPSBSZWFkQmlnMzIoZGF0YSwgNSk7XG5cbiAgICAgICAgaWYgKG9mZnNldCA8IDkpIHtcbiAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN1bWVkOiBvZmZzZXQsXG4gICAgICAgICAgICBkYXRhT2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgICBoYXNBdWRpb1RyYWNrOiBoYXNBdWRpbyxcbiAgICAgICAgICAgIGhhc1ZpZGVvVHJhY2s6IGhhc1ZpZGVvXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYmluZERhdGFTb3VyY2UobG9hZGVyKSB7XG4gICAgICAgIGxvYWRlci5vbkRhdGFBcnJpdmFsID0gdGhpcy5wYXJzZUNodW5rcy5iaW5kKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBwcm90b3R5cGU6IGZ1bmN0aW9uKHR5cGU6IHN0cmluZywgbWV0YWRhdGE6IGFueSk6IHZvaWRcbiAgICBnZXQgb25UcmFja01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25UcmFja01ldGFkYXRhO1xuICAgIH1cblxuICAgIHNldCBvblRyYWNrTWV0YWRhdGEoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25UcmFja01ldGFkYXRhID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gcHJvdG90eXBlOiBmdW5jdGlvbihtZWRpYUluZm86IE1lZGlhSW5mbyk6IHZvaWRcbiAgICBnZXQgb25NZWRpYUluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbk1lZGlhSW5mbztcbiAgICB9XG5cbiAgICBzZXQgb25NZWRpYUluZm8oY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25NZWRpYUluZm8gPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvLyBwcm90b3R5cGU6IGZ1bmN0aW9uKHR5cGU6IG51bWJlciwgaW5mbzogc3RyaW5nKTogdm9pZFxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcjtcbiAgICB9XG5cbiAgICBzZXQgb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gcHJvdG90eXBlOiBmdW5jdGlvbih2aWRlb1RyYWNrOiBhbnksIGF1ZGlvVHJhY2s6IGFueSk6IHZvaWRcbiAgICBnZXQgb25EYXRhQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25EYXRhQXZhaWxhYmxlO1xuICAgIH1cblxuICAgIHNldCBvbkRhdGFBdmFpbGFibGUoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25EYXRhQXZhaWxhYmxlID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gdGltZXN0YW1wIGJhc2UgZm9yIG91dHB1dCBzYW1wbGVzLCBtdXN0IGJlIGluIG1pbGxpc2Vjb25kc1xuICAgIGdldCB0aW1lc3RhbXBCYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGltZXN0YW1wQmFzZTtcbiAgICB9XG5cbiAgICBzZXQgdGltZXN0YW1wQmFzZShiYXNlKSB7XG4gICAgICAgIHRoaXMuX3RpbWVzdGFtcEJhc2UgPSBiYXNlO1xuICAgIH1cblxuICAgIGdldCBvdmVycmlkZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIEZvcmNlLW92ZXJyaWRlIG1lZGlhIGR1cmF0aW9uLiBNdXN0IGJlIGluIG1pbGxpc2Vjb25kcywgaW50MzJcbiAgICBzZXQgb3ZlcnJpZGVkRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5fZHVyYXRpb25PdmVycmlkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8uZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBGb3JjZS1vdmVycmlkZSBhdWRpbyB0cmFjayBwcmVzZW50IGZsYWcsIGJvb2xlYW5cbiAgICBzZXQgb3ZlcnJpZGVkSGFzQXVkaW8oaGFzQXVkaW8pIHtcbiAgICAgICAgdGhpcy5faGFzQXVkaW9GbGFnT3ZlcnJpZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faGFzQXVkaW8gPSBoYXNBdWRpbztcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc0F1ZGlvID0gaGFzQXVkaW87XG4gICAgfVxuXG4gICAgLy8gRm9yY2Utb3ZlcnJpZGUgdmlkZW8gdHJhY2sgcHJlc2VudCBmbGFnLCBib29sZWFuXG4gICAgc2V0IG92ZXJyaWRlZEhhc1ZpZGVvKGhhc1ZpZGVvKSB7XG4gICAgICAgIHRoaXMuX2hhc1ZpZGVvRmxhZ092ZXJyaWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2hhc1ZpZGVvID0gaGFzVmlkZW87XG4gICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNWaWRlbyA9IGhhc1ZpZGVvO1xuICAgIH1cblxuICAgIHJlc2V0TWVkaWFJbmZvKCkge1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8gPSBuZXcgTWVkaWFJbmZvKCk7XG4gICAgfVxuXG4gICAgX2lzSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0F1ZGlvICYmIHRoaXMuX2hhc1ZpZGVvKSB7ICAvLyBib3RoIGF1ZGlvICYgdmlkZW9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdWRpb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQgJiYgdGhpcy5fdmlkZW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9oYXNBdWRpbyAmJiAhdGhpcy5faGFzVmlkZW8pIHsgIC8vIGF1ZGlvIG9ubHlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdWRpb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9oYXNBdWRpbyAmJiB0aGlzLl9oYXNWaWRlbykgeyAgLy8gdmlkZW8gb25seVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZGVvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZnVuY3Rpb24gcGFyc2VDaHVua3MoY2h1bms6IEFycmF5QnVmZmVyLCBieXRlU3RhcnQ6IG51bWJlcik6IG51bWJlcjtcbiAgICBwYXJzZUNodW5rcyhjaHVuaywgYnl0ZVN0YXJ0KSB7XG4gICAgICAgIGlmICghdGhpcy5fb25FcnJvciB8fCAhdGhpcy5fb25NZWRpYUluZm8gfHwgIXRoaXMuX29uVHJhY2tNZXRhZGF0YSB8fCAhdGhpcy5fb25EYXRhQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdGbHY6IG9uRXJyb3IgJiBvbk1lZGlhSW5mbyAmIG9uVHJhY2tNZXRhZGF0YSAmIG9uRGF0YUF2YWlsYWJsZSBjYWxsYmFjayBtdXN0IGJlIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGxldCBsZSA9IHRoaXMuX2xpdHRsZUVuZGlhbjtcblxuICAgICAgICBpZiAoYnl0ZVN0YXJ0ID09PSAwKSB7ICAvLyBidWZmZXIgd2l0aCBGTFYgaGVhZGVyXG4gICAgICAgICAgICBpZiAoY2h1bmsuYnl0ZUxlbmd0aCA+IDEzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb2JlRGF0YSA9IEZMVkRlbXV4ZXIucHJvYmUoY2h1bmspO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHByb2JlRGF0YS5kYXRhT2Zmc2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9maXJzdFBhcnNlKSB7ICAvLyBoYW5kbGUgUHJldmlvdXNUYWdTaXplMCBiZWZvcmUgVGFnMVxuICAgICAgICAgICAgdGhpcy5fZmlyc3RQYXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGJ5dGVTdGFydCArIG9mZnNldCAhPT0gdGhpcy5fZGF0YU9mZnNldCkge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRmlyc3QgdGltZSBwYXJzaW5nIGJ1dCBjaHVuayBieXRlU3RhcnQgaW52YWxpZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoY2h1bmssIG9mZnNldCk7XG4gICAgICAgICAgICBsZXQgcHJldlRhZ1NpemUwID0gdi5nZXRVaW50MzIoMCwgIWxlKTtcbiAgICAgICAgICAgIGlmIChwcmV2VGFnU2l6ZTAgIT09IDApIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ1ByZXZUYWdTaXplMCAhPT0gMCAhISEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG9mZnNldCA8IGNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gdHJ1ZTtcblxuICAgICAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoY2h1bmssIG9mZnNldCk7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgKyAxMSArIDQgPiBjaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gZGF0YSBub3QgZW5vdWdoIGZvciBwYXJzaW5nIGFuIGZsdiB0YWdcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1R5cGUgPSB2LmdldFVpbnQ4KDApO1xuICAgICAgICAgICAgbGV0IGRhdGFTaXplID0gdi5nZXRVaW50MzIoMCwgIWxlKSAmIDB4MDBGRkZGRkY7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgKyAxMSArIGRhdGFTaXplICsgNCA+IGNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBkYXRhIG5vdCBlbm91Z2ggZm9yIHBhcnNpbmcgYWN0dWFsIGRhdGEgYm9keVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnVHlwZSAhPT0gOCAmJiB0YWdUeXBlICE9PSA5ICYmIHRhZ1R5cGUgIT09IDE4KSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBVbnN1cHBvcnRlZCB0YWcgdHlwZSAke3RhZ1R5cGV9LCBza2lwcGVkYCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgd2hvbGUgdGFnIChza2lwIGl0KVxuICAgICAgICAgICAgICAgIG9mZnNldCArPSAxMSArIGRhdGFTaXplICsgNDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRzMiA9IHYuZ2V0VWludDgoNCk7XG4gICAgICAgICAgICBsZXQgdHMxID0gdi5nZXRVaW50OCg1KTtcbiAgICAgICAgICAgIGxldCB0czAgPSB2LmdldFVpbnQ4KDYpO1xuICAgICAgICAgICAgbGV0IHRzMyA9IHYuZ2V0VWludDgoNyk7XG5cbiAgICAgICAgICAgIGxldCB0aW1lc3RhbXAgPSB0czAgfCAodHMxIDw8IDgpIHwgKHRzMiA8PCAxNikgfCAodHMzIDw8IDI0KTtcblxuICAgICAgICAgICAgbGV0IHN0cmVhbUlkID0gdi5nZXRVaW50MzIoNywgIWxlKSAmIDB4MDBGRkZGRkY7XG4gICAgICAgICAgICBpZiAoc3RyZWFtSWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ01lZXQgdGFnIHdoaWNoIGhhcyBTdHJlYW1JRCAhPSAwIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZGF0YU9mZnNldCA9IG9mZnNldCArIDExO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRhZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDg6ICAvLyBBdWRpb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZUF1ZGlvRGF0YShjaHVuaywgZGF0YU9mZnNldCwgZGF0YVNpemUsIHRpbWVzdGFtcCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTogIC8vIFZpZGVvXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlVmlkZW9EYXRhKGNodW5rLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSwgdGltZXN0YW1wLCBieXRlU3RhcnQgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4OiAgLy8gU2NyaXB0RGF0YU9iamVjdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVNjcmlwdERhdGEoY2h1bmssIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwcmV2VGFnU2l6ZSA9IHYuZ2V0VWludDMyKDExICsgZGF0YVNpemUsICFsZSk7XG4gICAgICAgICAgICBpZiAocHJldlRhZ1NpemUgIT09IDExICsgZGF0YVNpemUpIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgYEludmFsaWQgUHJldlRhZ1NpemUgJHtwcmV2VGFnU2l6ZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ICs9IDExICsgZGF0YVNpemUgKyA0OyAgLy8gdGFnQm9keSArIGRhdGFTaXplICsgcHJldlRhZ1NpemVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhcnNlZCBmcmFtZXMgdG8gY29uc3VtZXIgKHR5cGljYWxseSwgdGhlIHJlbXV4ZXIpXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3BhdGNoICYmICh0aGlzLl9hdWRpb1RyYWNrLmxlbmd0aCB8fCB0aGlzLl92aWRlb1RyYWNrLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGFBdmFpbGFibGUodGhpcy5fYXVkaW9UcmFjaywgdGhpcy5fdmlkZW9UcmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0OyAgLy8gY29uc3VtZWQgYnl0ZXMsIGp1c3QgZXF1YWxzIGxhdGVzdCBvZmZzZXQgaW5kZXhcbiAgICB9XG5cbiAgICBfcGFyc2VTY3JpcHREYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBsZXQgc2NyaXB0RGF0YSA9IEFNRi5wYXJzZVNjcmlwdERhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcblxuICAgICAgICBpZiAoc2NyaXB0RGF0YS5oYXNPd25Qcm9wZXJ0eSgnb25NZXRhRGF0YScpKSB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0RGF0YS5vbk1ldGFEYXRhID09IG51bGwgfHwgdHlwZW9mIHNjcmlwdERhdGEub25NZXRhRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ludmFsaWQgb25NZXRhRGF0YSBzdHJ1Y3R1cmUhJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdGb3VuZCBhbm90aGVyIG9uTWV0YURhdGEgdGFnIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBzY3JpcHREYXRhO1xuICAgICAgICAgICAgbGV0IG9uTWV0YURhdGEgPSB0aGlzLl9tZXRhZGF0YS5vbk1ldGFEYXRhO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEuaGFzQXVkaW8gPT09ICdib29sZWFuJykgeyAgLy8gaGFzQXVkaW9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGFzQXVkaW9GbGFnT3ZlcnJpZGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNBdWRpbyA9IG9uTWV0YURhdGEuaGFzQXVkaW87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNBdWRpbyA9IHRoaXMuX2hhc0F1ZGlvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5oYXNWaWRlbyA9PT0gJ2Jvb2xlYW4nKSB7ICAvLyBoYXNWaWRlb1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNWaWRlb0ZsYWdPdmVycmlkZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1ZpZGVvID0gb25NZXRhRGF0YS5oYXNWaWRlbztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc1ZpZGVvID0gdGhpcy5faGFzVmlkZW87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbk1ldGFEYXRhLmF1ZGlvZGF0YXJhdGUgPT09ICdudW1iZXInKSB7ICAvLyBhdWRpb2RhdGFyYXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmF1ZGlvRGF0YVJhdGUgPSBvbk1ldGFEYXRhLmF1ZGlvZGF0YXJhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEudmlkZW9kYXRhcmF0ZSA9PT0gJ251bWJlcicpIHsgIC8vIHZpZGVvZGF0YXJhdGVcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8udmlkZW9EYXRhUmF0ZSA9IG9uTWV0YURhdGEudmlkZW9kYXRhcmF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS53aWR0aCA9PT0gJ251bWJlcicpIHsgIC8vIHdpZHRoXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLndpZHRoID0gb25NZXRhRGF0YS53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5oZWlnaHQgPT09ICdudW1iZXInKSB7ICAvLyBoZWlnaHRcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGVpZ2h0ID0gb25NZXRhRGF0YS5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEuZHVyYXRpb24gPT09ICdudW1iZXInKSB7ICAvLyBkdXJhdGlvblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZHVyYXRpb25PdmVycmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gTWF0aC5mbG9vcihvbk1ldGFEYXRhLmR1cmF0aW9uICogdGhpcy5fdGltZXNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uZHVyYXRpb24gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbk1ldGFEYXRhLmZyYW1lcmF0ZSA9PT0gJ251bWJlcicpIHsgIC8vIGZyYW1lcmF0ZVxuICAgICAgICAgICAgICAgIGxldCBmcHNfbnVtID0gTWF0aC5mbG9vcihvbk1ldGFEYXRhLmZyYW1lcmF0ZSAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChmcHNfbnVtID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnBzID0gZnBzX251bSAvIDEwMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5maXhlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5mcHMgPSBmcHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5mcHNfbnVtID0gZnBzX251bTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmZXJlbmNlRnJhbWVSYXRlLmZwc19kZW4gPSAxMDAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uZnBzID0gZnBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5rZXlmcmFtZXMgPT09ICdvYmplY3QnKSB7ICAvLyBrZXlmcmFtZXNcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzS2V5ZnJhbWVzSW5kZXggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBrZXlmcmFtZXMgPSBvbk1ldGFEYXRhLmtleWZyYW1lcztcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8ua2V5ZnJhbWVzSW5kZXggPSB0aGlzLl9wYXJzZUtleWZyYW1lc0luZGV4KGtleWZyYW1lcyk7XG4gICAgICAgICAgICAgICAgb25NZXRhRGF0YS5rZXlmcmFtZXMgPSBudWxsOyAgLy8ga2V5ZnJhbWVzIGhhcyBiZWVuIGV4dHJhY3RlZCwgcmVtb3ZlIGl0XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNLZXlmcmFtZXNJbmRleCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5tZXRhZGF0YSA9IG9uTWV0YURhdGE7XG4gICAgICAgICAgICBMb2cudih0aGlzLlRBRywgJ1BhcnNlZCBvbk1ldGFEYXRhJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWVkaWFJbmZvLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTWVkaWFJbmZvKHRoaXMuX21lZGlhSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcGFyc2VLZXlmcmFtZXNJbmRleChrZXlmcmFtZXMpIHtcbiAgICAgICAgbGV0IHRpbWVzID0gW107XG4gICAgICAgIGxldCBmaWxlcG9zaXRpb25zID0gW107XG5cbiAgICAgICAgLy8gaWdub3JlIGZpcnN0IGtleWZyYW1lIHdoaWNoIGlzIGFjdHVhbGx5IEFWQyBTZXF1ZW5jZSBIZWFkZXIgKEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGtleWZyYW1lcy50aW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSB0aGlzLl90aW1lc3RhbXBCYXNlICsgTWF0aC5mbG9vcihrZXlmcmFtZXMudGltZXNbaV0gKiAxMDAwKTtcbiAgICAgICAgICAgIHRpbWVzLnB1c2godGltZSk7XG4gICAgICAgICAgICBmaWxlcG9zaXRpb25zLnB1c2goa2V5ZnJhbWVzLmZpbGVwb3NpdGlvbnNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVzOiB0aW1lcyxcbiAgICAgICAgICAgIGZpbGVwb3NpdGlvbnM6IGZpbGVwb3NpdGlvbnNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfcGFyc2VBdWRpb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplLCB0YWdUaW1lc3RhbXApIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDw9IDEpIHtcbiAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRmx2OiBJbnZhbGlkIGF1ZGlvIHBhY2tldCwgbWlzc2luZyBTb3VuZERhdGEgcGF5bG9hZCEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9oYXNBdWRpb0ZsYWdPdmVycmlkZWQgPT09IHRydWUgJiYgdGhpcy5faGFzQXVkaW8gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBJZiBoYXNBdWRpbzogZmFsc2UgaW5kaWNhdGVkIGV4cGxpY2l0bHkgaW4gTWVkaWFEYXRhU291cmNlLFxuICAgICAgICAgICAgLy8gSWdub3JlIGFsbCB0aGUgYXVkaW8gcGFja2V0c1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlID0gdGhpcy5fbGl0dGxlRW5kaWFuO1xuICAgICAgICBsZXQgdiA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuXG4gICAgICAgIGxldCBzb3VuZFNwZWMgPSB2LmdldFVpbnQ4KDApO1xuXG4gICAgICAgIGxldCBzb3VuZEZvcm1hdCA9IHNvdW5kU3BlYyA+Pj4gNDtcbiAgICAgICAgaWYgKHNvdW5kRm9ybWF0ICE9PSAyICYmIHNvdW5kRm9ybWF0ICE9PSAxMCkgeyAgLy8gTVAzIG9yIEFBQ1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5DT0RFQ19VTlNVUFBPUlRFRCwgJ0ZsdjogVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgaWR4OiAnICsgc291bmRGb3JtYXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNvdW5kUmF0ZSA9IDA7XG4gICAgICAgIGxldCBzb3VuZFJhdGVJbmRleCA9IChzb3VuZFNwZWMgJiAxMikgPj4+IDI7XG4gICAgICAgIGlmIChzb3VuZFJhdGVJbmRleCA+PSAwICYmIHNvdW5kUmF0ZUluZGV4IDw9IDQpIHtcbiAgICAgICAgICAgIHNvdW5kUmF0ZSA9IHRoaXMuX2ZsdlNvdW5kUmF0ZVRhYmxlW3NvdW5kUmF0ZUluZGV4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCAnRmx2OiBJbnZhbGlkIGF1ZGlvIHNhbXBsZSByYXRlIGlkeDogJyArIHNvdW5kUmF0ZUluZGV4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3VuZFNpemUgPSAoc291bmRTcGVjICYgMikgPj4+IDE7ICAvLyB1bnVzZWRcbiAgICAgICAgbGV0IHNvdW5kVHlwZSA9IChzb3VuZFNwZWMgJiAxKTtcblxuXG4gICAgICAgIGxldCBtZXRhID0gdGhpcy5fYXVkaW9NZXRhZGF0YTtcbiAgICAgICAgbGV0IHRyYWNrID0gdGhpcy5fYXVkaW9UcmFjaztcblxuICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oYXNBdWRpbyA9PT0gZmFsc2UgJiYgdGhpcy5faGFzQXVkaW9GbGFnT3ZlcnJpZGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzQXVkaW8gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbml0aWFsIG1ldGFkYXRhXG4gICAgICAgICAgICBtZXRhID0gdGhpcy5fYXVkaW9NZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgbWV0YS50eXBlID0gJ2F1ZGlvJztcbiAgICAgICAgICAgIG1ldGEuaWQgPSB0cmFjay5pZDtcbiAgICAgICAgICAgIG1ldGEudGltZXNjYWxlID0gdGhpcy5fdGltZXNjYWxlO1xuICAgICAgICAgICAgbWV0YS5kdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICAgICAgICAgICAgbWV0YS5hdWRpb1NhbXBsZVJhdGUgPSBzb3VuZFJhdGU7XG4gICAgICAgICAgICBtZXRhLmNoYW5uZWxDb3VudCA9IChzb3VuZFR5cGUgPT09IDAgPyAxIDogMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291bmRGb3JtYXQgPT09IDEwKSB7ICAvLyBBQUNcbiAgICAgICAgICAgIGxldCBhYWNEYXRhID0gdGhpcy5fcGFyc2VBQUNBdWRpb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAxLCBkYXRhU2l6ZSAtIDEpO1xuICAgICAgICAgICAgaWYgKGFhY0RhdGEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWFjRGF0YS5wYWNrZXRUeXBlID09PSAwKSB7ICAvLyBBQUMgc2VxdWVuY2UgaGVhZGVyIChBdWRpb1NwZWNpZmljQ29uZmlnKVxuICAgICAgICAgICAgICAgIGlmIChtZXRhLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZvdW5kIGFub3RoZXIgQXVkaW9TcGVjaWZpY0NvbmZpZyEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1pc2MgPSBhYWNEYXRhLmRhdGE7XG4gICAgICAgICAgICAgICAgbWV0YS5hdWRpb1NhbXBsZVJhdGUgPSBtaXNjLnNhbXBsaW5nUmF0ZTtcbiAgICAgICAgICAgICAgICBtZXRhLmNoYW5uZWxDb3VudCA9IG1pc2MuY2hhbm5lbENvdW50O1xuICAgICAgICAgICAgICAgIG1ldGEuY29kZWMgPSBtaXNjLmNvZGVjO1xuICAgICAgICAgICAgICAgIG1ldGEub3JpZ2luYWxDb2RlYyA9IG1pc2Mub3JpZ2luYWxDb2RlYztcbiAgICAgICAgICAgICAgICBtZXRhLmNvbmZpZyA9IG1pc2MuY29uZmlnO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkZWNvZGUgcmVzdWx0IG9mIGFuIGFhYyBzYW1wbGUgaXMgMTAyNCBQQ00gc2FtcGxlc1xuICAgICAgICAgICAgICAgIG1ldGEucmVmU2FtcGxlRHVyYXRpb24gPSAxMDI0IC8gbWV0YS5hdWRpb1NhbXBsZVJhdGUgKiBtZXRhLnRpbWVzY2FsZTtcbiAgICAgICAgICAgICAgICBMb2cudih0aGlzLlRBRywgJ1BhcnNlZCBBdWRpb1NwZWNpZmljQ29uZmlnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9uLWluaXRpYWwgbWV0YWRhdGEsIGZvcmNlIGRpc3BhdGNoIChvciBmbHVzaCkgcGFyc2VkIGZyYW1lcyB0byByZW11eGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwYXRjaCAmJiAodGhpcy5fYXVkaW9UcmFjay5sZW5ndGggfHwgdGhpcy5fdmlkZW9UcmFjay5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGFBdmFpbGFibGUodGhpcy5fYXVkaW9UcmFjaywgdGhpcy5fdmlkZW9UcmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdWRpb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGVuIG5vdGlmeSBuZXcgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uVHJhY2tNZXRhZGF0YSgnYXVkaW8nLCBtZXRhKTtcblxuICAgICAgICAgICAgICAgIGxldCBtaSA9IHRoaXMuX21lZGlhSW5mbztcbiAgICAgICAgICAgICAgICBtaS5hdWRpb0NvZGVjID0gbWV0YS5vcmlnaW5hbENvZGVjO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvU2FtcGxlUmF0ZSA9IG1ldGEuYXVkaW9TYW1wbGVSYXRlO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvQ2hhbm5lbENvdW50ID0gbWV0YS5jaGFubmVsQ291bnQ7XG4gICAgICAgICAgICAgICAgaWYgKG1pLmhhc1ZpZGVvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaS52aWRlb0NvZGVjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pLm1pbWVUeXBlID0gJ3ZpZGVvL3gtZmx2OyBjb2RlY3M9XCInICsgbWkudmlkZW9Db2RlYyArICcsJyArIG1pLmF1ZGlvQ29kZWMgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWkubWltZVR5cGUgPSAndmlkZW8veC1mbHY7IGNvZGVjcz1cIicgKyBtaS5hdWRpb0NvZGVjICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1pLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyhtaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhYWNEYXRhLnBhY2tldFR5cGUgPT09IDEpIHsgIC8vIEFBQyByYXcgZnJhbWUgZGF0YVxuICAgICAgICAgICAgICAgIGxldCBkdHMgPSB0aGlzLl90aW1lc3RhbXBCYXNlICsgdGFnVGltZXN0YW1wO1xuICAgICAgICAgICAgICAgIGxldCBhYWNTYW1wbGUgPSB7dW5pdDogYWFjRGF0YS5kYXRhLCBsZW5ndGg6IGFhY0RhdGEuZGF0YS5ieXRlTGVuZ3RoLCBkdHM6IGR0cywgcHRzOiBkdHN9O1xuICAgICAgICAgICAgICAgIHRyYWNrLnNhbXBsZXMucHVzaChhYWNTYW1wbGUpO1xuICAgICAgICAgICAgICAgIHRyYWNrLmxlbmd0aCArPSBhYWNEYXRhLmRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuZSh0aGlzLlRBRywgYEZsdjogVW5zdXBwb3J0ZWQgQUFDIGRhdGEgdHlwZSAke2FhY0RhdGEucGFja2V0VHlwZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzb3VuZEZvcm1hdCA9PT0gMikgeyAgLy8gTVAzXG4gICAgICAgICAgICBpZiAoIW1ldGEuY29kZWMpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIG1ldGFkYXRhIGZvciBtcDMgYXVkaW8gdHJhY2ssIGV4dHJhY3QgaW5mbyBmcm9tIGZyYW1lIGhlYWRlclxuICAgICAgICAgICAgICAgIGxldCBtaXNjID0gdGhpcy5fcGFyc2VNUDNBdWRpb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAxLCBkYXRhU2l6ZSAtIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChtaXNjID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1ldGEuYXVkaW9TYW1wbGVSYXRlID0gbWlzYy5zYW1wbGluZ1JhdGU7XG4gICAgICAgICAgICAgICAgbWV0YS5jaGFubmVsQ291bnQgPSBtaXNjLmNoYW5uZWxDb3VudDtcbiAgICAgICAgICAgICAgICBtZXRhLmNvZGVjID0gbWlzYy5jb2RlYztcbiAgICAgICAgICAgICAgICBtZXRhLm9yaWdpbmFsQ29kZWMgPSBtaXNjLm9yaWdpbmFsQ29kZWM7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRlY29kZSByZXN1bHQgb2YgYW4gbXAzIHNhbXBsZSBpcyAxMTUyIFBDTSBzYW1wbGVzXG4gICAgICAgICAgICAgICAgbWV0YS5yZWZTYW1wbGVEdXJhdGlvbiA9IDExNTIgLyBtZXRhLmF1ZGlvU2FtcGxlUmF0ZSAqIG1ldGEudGltZXNjYWxlO1xuICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCAnUGFyc2VkIE1QRUcgQXVkaW8gRnJhbWUgSGVhZGVyJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9hdWRpb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uVHJhY2tNZXRhZGF0YSgnYXVkaW8nLCBtZXRhKTtcblxuICAgICAgICAgICAgICAgIGxldCBtaSA9IHRoaXMuX21lZGlhSW5mbztcbiAgICAgICAgICAgICAgICBtaS5hdWRpb0NvZGVjID0gbWV0YS5jb2RlYztcbiAgICAgICAgICAgICAgICBtaS5hdWRpb1NhbXBsZVJhdGUgPSBtZXRhLmF1ZGlvU2FtcGxlUmF0ZTtcbiAgICAgICAgICAgICAgICBtaS5hdWRpb0NoYW5uZWxDb3VudCA9IG1ldGEuY2hhbm5lbENvdW50O1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvRGF0YVJhdGUgPSBtaXNjLmJpdFJhdGU7XG4gICAgICAgICAgICAgICAgaWYgKG1pLmhhc1ZpZGVvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaS52aWRlb0NvZGVjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pLm1pbWVUeXBlID0gJ3ZpZGVvL3gtZmx2OyBjb2RlY3M9XCInICsgbWkudmlkZW9Db2RlYyArICcsJyArIG1pLmF1ZGlvQ29kZWMgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWkubWltZVR5cGUgPSAndmlkZW8veC1mbHY7IGNvZGVjcz1cIicgKyBtaS5hdWRpb0NvZGVjICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1pLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyhtaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGlzIHBhY2tldCBpcyBhbHdheXMgYSB2YWxpZCBhdWRpbyBwYWNrZXQsIGV4dHJhY3QgaXRcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5fcGFyc2VNUDNBdWRpb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAxLCBkYXRhU2l6ZSAtIDEsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChkYXRhID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkdHMgPSB0aGlzLl90aW1lc3RhbXBCYXNlICsgdGFnVGltZXN0YW1wO1xuICAgICAgICAgICAgbGV0IG1wM1NhbXBsZSA9IHt1bml0OiBkYXRhLCBsZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCwgZHRzOiBkdHMsIHB0czogZHRzfTtcbiAgICAgICAgICAgIHRyYWNrLnNhbXBsZXMucHVzaChtcDNTYW1wbGUpO1xuICAgICAgICAgICAgdHJhY2subGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3BhcnNlQUFDQXVkaW9EYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPD0gMSkge1xuICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdGbHY6IEludmFsaWQgQUFDIHBhY2tldCwgbWlzc2luZyBBQUNQYWNrZXRUeXBlIG9yL2FuZCBEYXRhIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgICAgICBsZXQgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuXG4gICAgICAgIHJlc3VsdC5wYWNrZXRUeXBlID0gYXJyYXlbMF07XG5cbiAgICAgICAgaWYgKGFycmF5WzBdID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IHRoaXMuX3BhcnNlQUFDQXVkaW9TcGVjaWZpY0NvbmZpZyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGFycmF5LnN1YmFycmF5KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfcGFyc2VBQUNBdWRpb1NwZWNpZmljQ29uZmlnKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBsZXQgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuICAgICAgICBsZXQgY29uZmlnID0gbnVsbDtcblxuICAgICAgICAvKiBBdWRpbyBPYmplY3QgVHlwZTpcbiAgICAgICAgICAgMDogTnVsbFxuICAgICAgICAgICAxOiBBQUMgTWFpblxuICAgICAgICAgICAyOiBBQUMgTENcbiAgICAgICAgICAgMzogQUFDIFNTUiAoU2NhbGFibGUgU2FtcGxlIFJhdGUpXG4gICAgICAgICAgIDQ6IEFBQyBMVFAgKExvbmcgVGVybSBQcmVkaWN0aW9uKVxuICAgICAgICAgICA1OiBIRS1BQUMgLyBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pXG4gICAgICAgICAgIDY6IEFBQyBTY2FsYWJsZVxuICAgICAgICAqL1xuXG4gICAgICAgIGxldCBhdWRpb09iamVjdFR5cGUgPSAwO1xuICAgICAgICBsZXQgb3JpZ2luYWxBdWRpb09iamVjdFR5cGUgPSAwO1xuICAgICAgICBsZXQgYXVkaW9FeHRlbnNpb25PYmplY3RUeXBlID0gbnVsbDtcbiAgICAgICAgbGV0IHNhbXBsaW5nSW5kZXggPSAwO1xuICAgICAgICBsZXQgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IG51bGw7XG5cbiAgICAgICAgLy8gNSBiaXRzXG4gICAgICAgIGF1ZGlvT2JqZWN0VHlwZSA9IG9yaWdpbmFsQXVkaW9PYmplY3RUeXBlID0gYXJyYXlbMF0gPj4+IDM7XG4gICAgICAgIC8vIDQgYml0c1xuICAgICAgICBzYW1wbGluZ0luZGV4ID0gKChhcnJheVswXSAmIDB4MDcpIDw8IDEpIHwgKGFycmF5WzFdID4+PiA3KTtcbiAgICAgICAgaWYgKHNhbXBsaW5nSW5kZXggPCAwIHx8IHNhbXBsaW5nSW5kZXggPj0gdGhpcy5fbXBlZ1NhbXBsaW5nUmF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKERlbXV4RXJyb3JzLkZPUk1BVF9FUlJPUiwgJ0ZsdjogQUFDIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4IScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNhbXBsaW5nRnJlcXVlbmNlID0gdGhpcy5fbXBlZ1NhbXBsaW5nUmF0ZXNbc2FtcGxpbmdJbmRleF07XG5cbiAgICAgICAgLy8gNCBiaXRzXG4gICAgICAgIGxldCBjaGFubmVsQ29uZmlnID0gKGFycmF5WzFdICYgMHg3OCkgPj4+IDM7XG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnIDwgMCB8fCBjaGFubmVsQ29uZmlnID49IDgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCAnRmx2OiBBQUMgaW52YWxpZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdWRpb09iamVjdFR5cGUgPT09IDUpIHsgIC8vIEhFLUFBQz9cbiAgICAgICAgICAgIC8vIDQgYml0c1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9ICgoYXJyYXlbMV0gJiAweDA3KSA8PCAxKSB8IChhcnJheVsyXSA+Pj4gNyk7XG4gICAgICAgICAgICAvLyA1IGJpdHNcbiAgICAgICAgICAgIGF1ZGlvRXh0ZW5zaW9uT2JqZWN0VHlwZSA9IChhcnJheVsyXSAmIDB4N0MpID4+PiAyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd29ya2Fyb3VuZHMgZm9yIHZhcmlvdXMgYnJvd3NlcnNcbiAgICAgICAgbGV0IHVzZXJBZ2VudCA9IHNlbGYubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICh1c2VyQWdlbnQuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gZmlyZWZveDogdXNlIFNCUiAoSEUtQUFDKSBpZiBmcmVxIGxlc3MgdGhhbiAyNGtIelxuICAgICAgICAgICAgaWYgKHNhbXBsaW5nSW5kZXggPj0gNikge1xuICAgICAgICAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSA9IDU7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gbmV3IEFycmF5KDQpO1xuICAgICAgICAgICAgICAgIGV4dGVuc2lvblNhbXBsaW5nSW5kZXggPSBzYW1wbGluZ0luZGV4IC0gMztcbiAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB1c2UgTEMtQUFDXG4gICAgICAgICAgICAgICAgYXVkaW9PYmplY3RUeXBlID0gMjtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgQXJyYXkoMik7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IHNhbXBsaW5nSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50LmluZGV4T2YoJ2FuZHJvaWQnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGFuZHJvaWQ6IGFsd2F5cyB1c2UgTEMtQUFDXG4gICAgICAgICAgICBhdWRpb09iamVjdFR5cGUgPSAyO1xuICAgICAgICAgICAgY29uZmlnID0gbmV3IEFycmF5KDIpO1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IHNhbXBsaW5nSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmb3Igb3RoZXIgYnJvd3NlcnMsIGUuZy4gY2hyb21lLi4uXG4gICAgICAgICAgICAvLyBBbHdheXMgdXNlIEhFLUFBQyB0byBtYWtlIGl0IGVhc2llciB0byBzd2l0Y2ggYWFjIGNvZGVjIHByb2ZpbGVcbiAgICAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSA9IDU7XG4gICAgICAgICAgICBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gc2FtcGxpbmdJbmRleDtcbiAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBBcnJheSg0KTtcblxuICAgICAgICAgICAgaWYgKHNhbXBsaW5nSW5kZXggPj0gNikge1xuICAgICAgICAgICAgICAgIGV4dGVuc2lvblNhbXBsaW5nSW5kZXggPSBzYW1wbGluZ0luZGV4IC0gMztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvbmZpZyA9PT0gMSkgeyAgLy8gTW9ubyBjaGFubmVsXG4gICAgICAgICAgICAgICAgYXVkaW9PYmplY3RUeXBlID0gMjtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgQXJyYXkoMik7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IHNhbXBsaW5nSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdbMF0gID0gYXVkaW9PYmplY3RUeXBlIDw8IDM7XG4gICAgICAgIGNvbmZpZ1swXSB8PSAoc2FtcGxpbmdJbmRleCAmIDB4MEYpID4+PiAxO1xuICAgICAgICBjb25maWdbMV0gID0gKHNhbXBsaW5nSW5kZXggJiAweDBGKSA8PCA3O1xuICAgICAgICBjb25maWdbMV0gfD0gKGNoYW5uZWxDb25maWcgJiAweDBGKSA8PCAzO1xuICAgICAgICBpZiAoYXVkaW9PYmplY3RUeXBlID09PSA1KSB7XG4gICAgICAgICAgICBjb25maWdbMV0gfD0gKChleHRlbnNpb25TYW1wbGluZ0luZGV4ICYgMHgwRikgPj4+IDEpO1xuICAgICAgICAgICAgY29uZmlnWzJdICA9IChleHRlbnNpb25TYW1wbGluZ0luZGV4ICYgMHgwMSkgPDwgNztcbiAgICAgICAgICAgIC8vIGV4dGVuZGVkIGF1ZGlvIG9iamVjdCB0eXBlOiBmb3JjZSB0byAyIChMQy1BQUMpXG4gICAgICAgICAgICBjb25maWdbMl0gfD0gKDIgPDwgMik7XG4gICAgICAgICAgICBjb25maWdbM10gID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgIHNhbXBsaW5nUmF0ZTogc2FtcGxpbmdGcmVxdWVuY2UsXG4gICAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb25maWcsXG4gICAgICAgICAgICBjb2RlYzogJ21wNGEuNDAuJyArIGF1ZGlvT2JqZWN0VHlwZSxcbiAgICAgICAgICAgIG9yaWdpbmFsQ29kZWM6ICdtcDRhLjQwLicgKyBvcmlnaW5hbEF1ZGlvT2JqZWN0VHlwZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9wYXJzZU1QM0F1ZGlvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUsIHJlcXVlc3RIZWFkZXIpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgNCkge1xuICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdGbHY6IEludmFsaWQgTVAzIHBhY2tldCwgaGVhZGVyIG1pc3NpbmchJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0SGVhZGVyKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlbMF0gIT09IDB4RkYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmVyID0gKGFycmF5WzFdID4+PiAzKSAmIDB4MDM7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSAoYXJyYXlbMV0gJiAweDA2KSA+PiAxO1xuXG4gICAgICAgICAgICBsZXQgYml0cmF0ZV9pbmRleCA9IChhcnJheVsyXSAmIDB4RjApID4+PiA0O1xuICAgICAgICAgICAgbGV0IHNhbXBsaW5nX2ZyZXFfaW5kZXggPSAoYXJyYXlbMl0gJiAweDBDKSA+Pj4gMjtcblxuICAgICAgICAgICAgbGV0IGNoYW5uZWxfbW9kZSA9IChhcnJheVszXSA+Pj4gNikgJiAweDAzO1xuICAgICAgICAgICAgbGV0IGNoYW5uZWxfY291bnQgPSBjaGFubmVsX21vZGUgIT09IDMgPyAyIDogMTtcblxuICAgICAgICAgICAgbGV0IHNhbXBsZV9yYXRlID0gMDtcbiAgICAgICAgICAgIGxldCBiaXRfcmF0ZSA9IDA7XG4gICAgICAgICAgICBsZXQgb2JqZWN0X3R5cGUgPSAzNDsgIC8vIExheWVyLTMsIGxpc3RlZCBpbiBNUEVHLTQgQXVkaW8gT2JqZWN0IFR5cGVzXG5cbiAgICAgICAgICAgIGxldCBjb2RlYyA9ICdtcDMnO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHZlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIE1QRUcgMi41XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gdGhpcy5fbXBlZ0F1ZGlvVjI1U2FtcGxlUmF0ZVRhYmxlW3NhbXBsaW5nX2ZyZXFfaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6ICAvLyBNUEVHIDJcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSB0aGlzLl9tcGVnQXVkaW9WMjBTYW1wbGVSYXRlVGFibGVbc2FtcGxpbmdfZnJlcV9pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzogIC8vIE1QRUcgMVxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IHRoaXMuX21wZWdBdWRpb1YxMFNhbXBsZVJhdGVUYWJsZVtzYW1wbGluZ19mcmVxX2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBMYXllciAzXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlID0gMzQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiaXRyYXRlX2luZGV4IDwgdGhpcy5fbXBlZ0F1ZGlvTDNCaXRSYXRlVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaXRfcmF0ZSA9IHRoaXMuX21wZWdBdWRpb0wzQml0UmF0ZVRhYmxlW2JpdHJhdGVfaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjogIC8vIExheWVyIDJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUgPSAzMztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHJhdGVfaW5kZXggPCB0aGlzLl9tcGVnQXVkaW9MMkJpdFJhdGVUYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9yYXRlID0gdGhpcy5fbXBlZ0F1ZGlvTDJCaXRSYXRlVGFibGVbYml0cmF0ZV9pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOiAgLy8gTGF5ZXIgMVxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSA9IDMyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYml0cmF0ZV9pbmRleCA8IHRoaXMuX21wZWdBdWRpb0wxQml0UmF0ZVRhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYml0X3JhdGUgPSB0aGlzLl9tcGVnQXVkaW9MMUJpdFJhdGVUYWJsZVtiaXRyYXRlX2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGJpdFJhdGU6IGJpdF9yYXRlLFxuICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZTogc2FtcGxlX3JhdGUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsX2NvdW50LFxuICAgICAgICAgICAgICAgIGNvZGVjOiBjb2RlYyxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENvZGVjOiBjb2RlY1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfcGFyc2VWaWRlb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplLCB0YWdUaW1lc3RhbXAsIHRhZ1Bvc2l0aW9uKSB7XG4gICAgICAgIGlmIChkYXRhU2l6ZSA8PSAxKSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZsdjogSW52YWxpZCB2aWRlbyBwYWNrZXQsIG1pc3NpbmcgVmlkZW9EYXRhIHBheWxvYWQhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzVmlkZW9GbGFnT3ZlcnJpZGVkID09PSB0cnVlICYmIHRoaXMuX2hhc1ZpZGVvID09PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gSWYgaGFzVmlkZW86IGZhbHNlIGluZGljYXRlZCBleHBsaWNpdGx5IGluIE1lZGlhRGF0YVNvdXJjZSxcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgdGhlIHZpZGVvIHBhY2tldHNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcGVjID0gKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkpWzBdO1xuXG4gICAgICAgIGxldCBmcmFtZVR5cGUgPSAoc3BlYyAmIDI0MCkgPj4+IDQ7XG4gICAgICAgIGxldCBjb2RlY0lkID0gc3BlYyAmIDE1O1xuXG4gICAgICAgIGlmIChjb2RlY0lkICE9PSA3KSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKERlbXV4RXJyb3JzLkNPREVDX1VOU1VQUE9SVEVELCBgRmx2OiBVbnN1cHBvcnRlZCBjb2RlYyBpbiB2aWRlbyBmcmFtZTogJHtjb2RlY0lkfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGFyc2VBVkNWaWRlb1BhY2tldChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSwgdGFnVGltZXN0YW1wLCB0YWdQb3NpdGlvbiwgZnJhbWVUeXBlKTtcbiAgICB9XG5cbiAgICBfcGFyc2VBVkNWaWRlb1BhY2tldChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUsIHRhZ1RpbWVzdGFtcCwgdGFnUG9zaXRpb24sIGZyYW1lVHlwZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCA0KSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZsdjogSW52YWxpZCBBVkMgcGFja2V0LCBtaXNzaW5nIEFWQ1BhY2tldFR5cGUgb3IvYW5kIENvbXBvc2l0aW9uVGltZScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlID0gdGhpcy5fbGl0dGxlRW5kaWFuO1xuICAgICAgICBsZXQgdiA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuXG4gICAgICAgIGxldCBwYWNrZXRUeXBlID0gdi5nZXRVaW50OCgwKTtcbiAgICAgICAgbGV0IGN0c191bnNpZ25lZCA9IHYuZ2V0VWludDMyKDAsICFsZSkgJiAweDAwRkZGRkZGO1xuICAgICAgICBsZXQgY3RzID0gKGN0c191bnNpZ25lZCA8PCA4KSA+PiA4OyAgLy8gY29udmVydCB0byAyNC1iaXQgc2lnbmVkIGludFxuXG4gICAgICAgIGlmIChwYWNrZXRUeXBlID09PSAwKSB7ICAvLyBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZFxuICAgICAgICAgICAgdGhpcy5fcGFyc2VBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDQsIGRhdGFTaXplIC0gNCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFja2V0VHlwZSA9PT0gMSkgeyAgLy8gT25lIG9yIG1vcmUgTmFsdXNcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlQVZDVmlkZW9EYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgNCwgZGF0YVNpemUgLSA0LCB0YWdUaW1lc3RhbXAsIHRhZ1Bvc2l0aW9uLCBmcmFtZVR5cGUsIGN0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFja2V0VHlwZSA9PT0gMikge1xuICAgICAgICAgICAgLy8gZW1wdHksIEFWQyBlbmQgb2Ygc2VxdWVuY2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCBgRmx2OiBJbnZhbGlkIHZpZGVvIHBhY2tldCB0eXBlICR7cGFja2V0VHlwZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wYXJzZUFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCA3KSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZsdjogSW52YWxpZCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCwgbGFjayBvZiBkYXRhIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1ldGEgPSB0aGlzLl92aWRlb01ldGFkYXRhO1xuICAgICAgICBsZXQgdHJhY2sgPSB0aGlzLl92aWRlb1RyYWNrO1xuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faGFzVmlkZW8gPT09IGZhbHNlICYmIHRoaXMuX2hhc1ZpZGVvRmxhZ092ZXJyaWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNWaWRlbyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc1ZpZGVvID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbWV0YSA9IHRoaXMuX3ZpZGVvTWV0YWRhdGEgPSB7fTtcbiAgICAgICAgICAgIG1ldGEudHlwZSA9ICd2aWRlbyc7XG4gICAgICAgICAgICBtZXRhLmlkID0gdHJhY2suaWQ7XG4gICAgICAgICAgICBtZXRhLnRpbWVzY2FsZSA9IHRoaXMuX3RpbWVzY2FsZTtcbiAgICAgICAgICAgIG1ldGEuZHVyYXRpb24gPSB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YS5hdmNjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRm91bmQgYW5vdGhlciBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ZXJzaW9uID0gdi5nZXRVaW50OCgwKTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uXG4gICAgICAgIGxldCBhdmNQcm9maWxlID0gdi5nZXRVaW50OCgxKTsgIC8vIGF2Y1Byb2ZpbGVJbmRpY2F0aW9uXG4gICAgICAgIGxldCBwcm9maWxlQ29tcGF0aWJpbGl0eSA9IHYuZ2V0VWludDgoMik7ICAvLyBwcm9maWxlX2NvbXBhdGliaWxpdHlcbiAgICAgICAgbGV0IGF2Y0xldmVsID0gdi5nZXRVaW50OCgzKTsgIC8vIEFWQ0xldmVsSW5kaWNhdGlvblxuXG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSAxIHx8IGF2Y1Byb2ZpbGUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCAnRmx2OiBJbnZhbGlkIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9uYWx1TGVuZ3RoU2l6ZSA9ICh2LmdldFVpbnQ4KDQpICYgMykgKyAxOyAgLy8gbGVuZ3RoU2l6ZU1pbnVzT25lXG4gICAgICAgIGlmICh0aGlzLl9uYWx1TGVuZ3RoU2l6ZSAhPT0gMyAmJiB0aGlzLl9uYWx1TGVuZ3RoU2l6ZSAhPT0gNCkgeyAgLy8gaG9seSBzaGl0ISEhXG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKERlbXV4RXJyb3JzLkZPUk1BVF9FUlJPUiwgYEZsdjogU3RyYW5nZSBOYWx1TGVuZ3RoU2l6ZU1pbnVzT25lOiAke3RoaXMuX25hbHVMZW5ndGhTaXplIC0gMX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcHNDb3VudCA9IHYuZ2V0VWludDgoNSkgJiAzMTsgIC8vIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzXG4gICAgICAgIGlmIChzcHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsICdGbHY6IEludmFsaWQgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6IE5vIFNQUycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHNwc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBGbHY6IFN0cmFuZ2UgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6IFNQUyBDb3VudCA9ICR7c3BzQ291bnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2Zmc2V0ID0gNjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB2LmdldFVpbnQxNihvZmZzZXQsICFsZSk7ICAvLyBzZXF1ZW5jZVBhcmFtZXRlclNldExlbmd0aFxuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgICAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTm90aWNlOiBOYWx1IHdpdGhvdXQgc3RhcnRjb2RlIGhlYWRlciAoMDAgMDAgMDAgMDEpXG4gICAgICAgICAgICBsZXQgc3BzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyBvZmZzZXQsIGxlbik7XG4gICAgICAgICAgICBvZmZzZXQgKz0gbGVuO1xuXG4gICAgICAgICAgICBsZXQgY29uZmlnID0gU1BTUGFyc2VyLnBhcnNlU1BTKHNwcyk7XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvdGhlciBzcHMncyBjb25maWdcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbWV0YS5jb2RlY1dpZHRoID0gY29uZmlnLmNvZGVjX3NpemUud2lkdGg7XG4gICAgICAgICAgICBtZXRhLmNvZGVjSGVpZ2h0ID0gY29uZmlnLmNvZGVjX3NpemUuaGVpZ2h0O1xuICAgICAgICAgICAgbWV0YS5wcmVzZW50V2lkdGggPSBjb25maWcucHJlc2VudF9zaXplLndpZHRoO1xuICAgICAgICAgICAgbWV0YS5wcmVzZW50SGVpZ2h0ID0gY29uZmlnLnByZXNlbnRfc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIG1ldGEucHJvZmlsZSA9IGNvbmZpZy5wcm9maWxlX3N0cmluZztcbiAgICAgICAgICAgIG1ldGEubGV2ZWwgPSBjb25maWcubGV2ZWxfc3RyaW5nO1xuICAgICAgICAgICAgbWV0YS5iaXREZXB0aCA9IGNvbmZpZy5iaXRfZGVwdGg7XG4gICAgICAgICAgICBtZXRhLmNocm9tYUZvcm1hdCA9IGNvbmZpZy5jaHJvbWFfZm9ybWF0O1xuICAgICAgICAgICAgbWV0YS5zYXJSYXRpbyA9IGNvbmZpZy5zYXJfcmF0aW87XG4gICAgICAgICAgICBtZXRhLmZyYW1lUmF0ZSA9IGNvbmZpZy5mcmFtZV9yYXRlO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLmZyYW1lX3JhdGUuZml4ZWQgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLmZyYW1lX3JhdGUuZnBzX251bSA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIGNvbmZpZy5mcmFtZV9yYXRlLmZwc19kZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBtZXRhLmZyYW1lUmF0ZSA9IHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZwc19kZW4gPSBtZXRhLmZyYW1lUmF0ZS5mcHNfZGVuO1xuICAgICAgICAgICAgbGV0IGZwc19udW0gPSBtZXRhLmZyYW1lUmF0ZS5mcHNfbnVtO1xuICAgICAgICAgICAgbWV0YS5yZWZTYW1wbGVEdXJhdGlvbiA9IG1ldGEudGltZXNjYWxlICogKGZwc19kZW4gLyBmcHNfbnVtKTtcblxuICAgICAgICAgICAgbGV0IGNvZGVjQXJyYXkgPSBzcHMuc3ViYXJyYXkoMSwgNCk7XG4gICAgICAgICAgICBsZXQgY29kZWNTdHJpbmcgPSAnYXZjMS4nO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaCA9IGNvZGVjQXJyYXlbal0udG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgIGlmIChoLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgaCA9ICcwJyArIGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGVjU3RyaW5nICs9IGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXRhLmNvZGVjID0gY29kZWNTdHJpbmc7XG5cbiAgICAgICAgICAgIGxldCBtaSA9IHRoaXMuX21lZGlhSW5mbztcbiAgICAgICAgICAgIG1pLndpZHRoID0gbWV0YS5jb2RlY1dpZHRoO1xuICAgICAgICAgICAgbWkuaGVpZ2h0ID0gbWV0YS5jb2RlY0hlaWdodDtcbiAgICAgICAgICAgIG1pLmZwcyA9IG1ldGEuZnJhbWVSYXRlLmZwcztcbiAgICAgICAgICAgIG1pLnByb2ZpbGUgPSBtZXRhLnByb2ZpbGU7XG4gICAgICAgICAgICBtaS5sZXZlbCA9IG1ldGEubGV2ZWw7XG4gICAgICAgICAgICBtaS5yZWZGcmFtZXMgPSBjb25maWcucmVmX2ZyYW1lcztcbiAgICAgICAgICAgIG1pLmNocm9tYUZvcm1hdCA9IGNvbmZpZy5jaHJvbWFfZm9ybWF0X3N0cmluZztcbiAgICAgICAgICAgIG1pLnNhck51bSA9IG1ldGEuc2FyUmF0aW8ud2lkdGg7XG4gICAgICAgICAgICBtaS5zYXJEZW4gPSBtZXRhLnNhclJhdGlvLmhlaWdodDtcbiAgICAgICAgICAgIG1pLnZpZGVvQ29kZWMgPSBjb2RlY1N0cmluZztcblxuICAgICAgICAgICAgaWYgKG1pLmhhc0F1ZGlvKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pLmF1ZGlvQ29kZWMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBtaS5taW1lVHlwZSA9ICd2aWRlby94LWZsdjsgY29kZWNzPVwiJyArIG1pLnZpZGVvQ29kZWMgKyAnLCcgKyBtaS5hdWRpb0NvZGVjICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pLm1pbWVUeXBlID0gJ3ZpZGVvL3gtZmx2OyBjb2RlY3M9XCInICsgbWkudmlkZW9Db2RlYyArICdcIic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWkuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25NZWRpYUluZm8obWkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBwc0NvdW50ID0gdi5nZXRVaW50OChvZmZzZXQpOyAgLy8gbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0c1xuICAgICAgICBpZiAocHBzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCAnRmx2OiBJbnZhbGlkIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkOiBObyBQUFMnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChwcHNDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCBgRmx2OiBTdHJhbmdlIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkOiBQUFMgQ291bnQgPSAke3Bwc0NvdW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0Kys7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcHNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdi5nZXRVaW50MTYob2Zmc2V0LCAhbGUpOyAgLy8gcGljdHVyZVBhcmFtZXRlclNldExlbmd0aFxuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgICAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcHBzIGlzIHVzZWxlc3MgZm9yIGV4dHJhY3RpbmcgdmlkZW8gaW5mb3JtYXRpb25cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW47XG4gICAgICAgIH1cblxuICAgICAgICBtZXRhLmF2Y2MgPSBuZXcgVWludDhBcnJheShkYXRhU2l6ZSk7XG4gICAgICAgIG1ldGEuYXZjYy5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSwgMCk7XG4gICAgICAgIExvZy52KHRoaXMuVEFHLCAnUGFyc2VkIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCgpKSB7XG4gICAgICAgICAgICAvLyBmbHVzaCBwYXJzZWQgZnJhbWVzXG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcGF0Y2ggJiYgKHRoaXMuX2F1ZGlvVHJhY2subGVuZ3RoIHx8IHRoaXMuX3ZpZGVvVHJhY2subGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRGF0YUF2YWlsYWJsZSh0aGlzLl9hdWRpb1RyYWNrLCB0aGlzLl92aWRlb1RyYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90aWZ5IG5ldyBtZXRhZGF0YVxuICAgICAgICB0aGlzLl9kaXNwYXRjaCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vblRyYWNrTWV0YWRhdGEoJ3ZpZGVvJywgbWV0YSk7XG4gICAgfVxuXG4gICAgX3BhcnNlQVZDVmlkZW9EYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSwgdGFnVGltZXN0YW1wLCB0YWdQb3NpdGlvbiwgZnJhbWVUeXBlLCBjdHMpIHtcbiAgICAgICAgbGV0IGxlID0gdGhpcy5fbGl0dGxlRW5kaWFuO1xuICAgICAgICBsZXQgdiA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuXG4gICAgICAgIGxldCB1bml0cyA9IFtdLCBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCBsZW5ndGhTaXplID0gdGhpcy5fbmFsdUxlbmd0aFNpemU7XG4gICAgICAgIGxldCBkdHMgPSB0aGlzLl90aW1lc3RhbXBCYXNlICsgdGFnVGltZXN0YW1wO1xuICAgICAgICBsZXQga2V5ZnJhbWUgPSAoZnJhbWVUeXBlID09PSAxKTsgIC8vIGZyb20gRkxWIEZyYW1lIFR5cGUgY29uc3RhbnRzXG5cbiAgICAgICAgd2hpbGUgKG9mZnNldCA8IGRhdGFTaXplKSB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+PSBkYXRhU2l6ZSkge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCBgTWFsZm9ybWVkIE5hbHUgbmVhciB0aW1lc3RhbXAgJHtkdHN9LCBvZmZzZXQgPSAke29mZnNldH0sIGRhdGFTaXplID0gJHtkYXRhU2l6ZX1gKTtcbiAgICAgICAgICAgICAgICBicmVhazsgIC8vIGRhdGEgbm90IGVub3VnaCBmb3IgbmV4dCBOYWx1XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOYWx1IHdpdGggbGVuZ3RoLWhlYWRlciAoQVZDMSlcbiAgICAgICAgICAgIGxldCBuYWx1U2l6ZSA9IHYuZ2V0VWludDMyKG9mZnNldCwgIWxlKTsgIC8vIEJpZy1FbmRpYW4gcmVhZFxuICAgICAgICAgICAgaWYgKGxlbmd0aFNpemUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBuYWx1U2l6ZSA+Pj49IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFsdVNpemUgPiBkYXRhU2l6ZSAtIGxlbmd0aFNpemUpIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgYE1hbGZvcm1lZCBOYWx1cyBuZWFyIHRpbWVzdGFtcCAke2R0c30sIE5hbHVTaXplID4gRGF0YVNpemUhYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdW5pdFR5cGUgPSB2LmdldFVpbnQ4KG9mZnNldCArIGxlbmd0aFNpemUpICYgMHgxRjtcblxuICAgICAgICAgICAgaWYgKHVuaXRUeXBlID09PSA1KSB7ICAvLyBJRFJcbiAgICAgICAgICAgICAgICBrZXlmcmFtZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aFNpemUgKyBuYWx1U2l6ZSk7XG4gICAgICAgICAgICBsZXQgdW5pdCA9IHt0eXBlOiB1bml0VHlwZSwgZGF0YTogZGF0YX07XG4gICAgICAgICAgICB1bml0cy5wdXNoKHVuaXQpO1xuICAgICAgICAgICAgbGVuZ3RoICs9IGRhdGEuYnl0ZUxlbmd0aDtcblxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aFNpemUgKyBuYWx1U2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bml0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB0cmFjayA9IHRoaXMuX3ZpZGVvVHJhY2s7XG4gICAgICAgICAgICBsZXQgYXZjU2FtcGxlID0ge1xuICAgICAgICAgICAgICAgIHVuaXRzOiB1bml0cyxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgICAgICAgICBpc0tleWZyYW1lOiBrZXlmcmFtZSxcbiAgICAgICAgICAgICAgICBkdHM6IGR0cyxcbiAgICAgICAgICAgICAgICBjdHM6IGN0cyxcbiAgICAgICAgICAgICAgICBwdHM6IChkdHMgKyBjdHMpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGtleWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgYXZjU2FtcGxlLmZpbGVwb3NpdGlvbiA9IHRhZ1Bvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2suc2FtcGxlcy5wdXNoKGF2Y1NhbXBsZSk7XG4gICAgICAgICAgICB0cmFjay5sZW5ndGggKz0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZMVkRlbXV4ZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFeHBHb2xvbWIgZnJvbSAnLi9leHAtZ29sb21iLmpzJztcblxuY2xhc3MgU1BTUGFyc2VyIHtcblxuICAgIHN0YXRpYyBfZWJzcDJyYnNwKHVpbnQ4YXJyYXkpIHtcbiAgICAgICAgbGV0IHNyYyA9IHVpbnQ4YXJyYXk7XG4gICAgICAgIGxldCBzcmNfbGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7XG4gICAgICAgIGxldCBkc3QgPSBuZXcgVWludDhBcnJheShzcmNfbGVuZ3RoKTtcbiAgICAgICAgbGV0IGRzdF9pZHggPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gVW5lc2NhcGU6IFNraXAgMHgwMyBhZnRlciAwMCAwMFxuICAgICAgICAgICAgICAgIGlmIChzcmNbaV0gPT09IDB4MDMgJiYgc3JjW2kgLSAxXSA9PT0gMHgwMCAmJiBzcmNbaSAtIDJdID09PSAweDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRzdFtkc3RfaWR4XSA9IHNyY1tpXTtcbiAgICAgICAgICAgIGRzdF9pZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkc3QuYnVmZmVyLCAwLCBkc3RfaWR4KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VTUFModWludDhhcnJheSkge1xuICAgICAgICBsZXQgcmJzcCA9IFNQU1BhcnNlci5fZWJzcDJyYnNwKHVpbnQ4YXJyYXkpO1xuICAgICAgICBsZXQgZ2IgPSBuZXcgRXhwR29sb21iKHJic3ApO1xuXG4gICAgICAgIGdiLnJlYWRCeXRlKCk7XG4gICAgICAgIGxldCBwcm9maWxlX2lkYyA9IGdiLnJlYWRCeXRlKCk7ICAvLyBwcm9maWxlX2lkY1xuICAgICAgICBnYi5yZWFkQnl0ZSgpOyAgLy8gY29uc3RyYWludF9zZXRfZmxhZ3NbNV0gKyByZXNlcnZlZF96ZXJvWzNdXG4gICAgICAgIGxldCBsZXZlbF9pZGMgPSBnYi5yZWFkQnl0ZSgpOyAgLy8gbGV2ZWxfaWRjXG4gICAgICAgIGdiLnJlYWRVRUcoKTsgIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkXG5cbiAgICAgICAgbGV0IHByb2ZpbGVfc3RyaW5nID0gU1BTUGFyc2VyLmdldFByb2ZpbGVTdHJpbmcocHJvZmlsZV9pZGMpO1xuICAgICAgICBsZXQgbGV2ZWxfc3RyaW5nID0gU1BTUGFyc2VyLmdldExldmVsU3RyaW5nKGxldmVsX2lkYyk7XG4gICAgICAgIGxldCBjaHJvbWFfZm9ybWF0X2lkYyA9IDE7XG4gICAgICAgIGxldCBjaHJvbWFfZm9ybWF0ID0gNDIwO1xuICAgICAgICBsZXQgY2hyb21hX2Zvcm1hdF90YWJsZSA9IFswLCA0MjAsIDQyMiwgNDQ0XTtcbiAgICAgICAgbGV0IGJpdF9kZXB0aCA9IDg7XG5cbiAgICAgICAgaWYgKHByb2ZpbGVfaWRjID09PSAxMDAgfHwgcHJvZmlsZV9pZGMgPT09IDExMCB8fCBwcm9maWxlX2lkYyA9PT0gMTIyIHx8XG4gICAgICAgICAgICBwcm9maWxlX2lkYyA9PT0gMjQ0IHx8IHByb2ZpbGVfaWRjID09PSA0NCB8fCBwcm9maWxlX2lkYyA9PT0gODMgfHxcbiAgICAgICAgICAgIHByb2ZpbGVfaWRjID09PSA4NiB8fCBwcm9maWxlX2lkYyA9PT0gMTE4IHx8IHByb2ZpbGVfaWRjID09PSAxMjggfHxcbiAgICAgICAgICAgIHByb2ZpbGVfaWRjID09PSAxMzggfHwgcHJvZmlsZV9pZGMgPT09IDE0NCkge1xuXG4gICAgICAgICAgICBjaHJvbWFfZm9ybWF0X2lkYyA9IGdiLnJlYWRVRUcoKTtcbiAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PT0gMykge1xuICAgICAgICAgICAgICAgIGdiLnJlYWRCaXRzKDEpOyAgLy8gc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAzKSB7XG4gICAgICAgICAgICAgICAgY2hyb21hX2Zvcm1hdCA9IGNocm9tYV9mb3JtYXRfdGFibGVbY2hyb21hX2Zvcm1hdF9pZGNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBiaXRfZGVwdGggPSBnYi5yZWFkVUVHKCkgKyA4OyAgLy8gYml0X2RlcHRoX2x1bWFfbWludXM4XG4gICAgICAgICAgICBnYi5yZWFkVUVHKCk7ICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOFxuICAgICAgICAgICAgZ2IucmVhZEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWdcbiAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnXG4gICAgICAgICAgICAgICAgbGV0IHNjYWxpbmdfbGlzdF9jb3VudCA9IChjaHJvbWFfZm9ybWF0X2lkYyAhPT0gMykgPyA4IDogMTI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FsaW5nX2xpc3RfY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2IucmVhZEJvb2woKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQU1BhcnNlci5fc2tpcFNjYWxpbmdMaXN0KGdiLCAxNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQU1BhcnNlci5fc2tpcFNjYWxpbmdMaXN0KGdiLCA2NCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2IucmVhZFVFRygpOyAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNFxuICAgICAgICBsZXQgcGljX29yZGVyX2NudF90eXBlID0gZ2IucmVhZFVFRygpO1xuICAgICAgICBpZiAocGljX29yZGVyX2NudF90eXBlID09PSAwKSB7XG4gICAgICAgICAgICBnYi5yZWFkVUVHKCk7ICAvLyBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51c180XG4gICAgICAgIH0gZWxzZSBpZiAocGljX29yZGVyX2NudF90eXBlID09PSAxKSB7XG4gICAgICAgICAgICBnYi5yZWFkQml0cygxKTsgIC8vIGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnXG4gICAgICAgICAgICBnYi5yZWFkU0VHKCk7ICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljXG4gICAgICAgICAgICBnYi5yZWFkU0VHKCk7ICAvLyBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGRcbiAgICAgICAgICAgIGxldCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlID0gZ2IucmVhZFVFRygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBnYi5yZWFkU0VHKCk7ICAvLyBvZmZzZXRfZm9yX3JlZl9mcmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZWZfZnJhbWVzID0gZ2IucmVhZFVFRygpOyAgLy8gbWF4X251bV9yZWZfZnJhbWVzXG4gICAgICAgIGdiLnJlYWRCaXRzKDEpOyAgLy8gZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnXG5cbiAgICAgICAgbGV0IHBpY193aWR0aF9pbl9tYnNfbWludXMxID0gZ2IucmVhZFVFRygpO1xuICAgICAgICBsZXQgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gZ2IucmVhZFVFRygpO1xuXG4gICAgICAgIGxldCBmcmFtZV9tYnNfb25seV9mbGFnID0gZ2IucmVhZEJpdHMoMSk7XG4gICAgICAgIGlmIChmcmFtZV9tYnNfb25seV9mbGFnID09PSAwKSB7XG4gICAgICAgICAgICBnYi5yZWFkQml0cygxKTsgIC8vIG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWdcbiAgICAgICAgfVxuICAgICAgICBnYi5yZWFkQml0cygxKTsgIC8vIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWdcblxuICAgICAgICBsZXQgZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7XG4gICAgICAgIGxldCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IDA7XG4gICAgICAgIGxldCBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwO1xuICAgICAgICBsZXQgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDtcblxuICAgICAgICBsZXQgZnJhbWVfY3JvcHBpbmdfZmxhZyA9IGdiLnJlYWRCb29sKCk7XG4gICAgICAgIGlmIChmcmFtZV9jcm9wcGluZ19mbGFnKSB7XG4gICAgICAgICAgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gZ2IucmVhZFVFRygpO1xuICAgICAgICAgICAgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgICAgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgICAgICBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2FyX3dpZHRoID0gMSwgc2FyX2hlaWdodCA9IDE7XG4gICAgICAgIGxldCBmcHMgPSAwLCBmcHNfZml4ZWQgPSB0cnVlLCBmcHNfbnVtID0gMCwgZnBzX2RlbiA9IDA7XG5cbiAgICAgICAgbGV0IHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdiLnJlYWRCb29sKCk7XG4gICAgICAgIGlmICh2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHtcbiAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICBsZXQgYXNwZWN0X3JhdGlvX2lkYyA9IGdiLnJlYWRCeXRlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHNhcl93X3RhYmxlID0gWzEsIDEyLCAxMCwgMTYsIDQwLCAyNCwgMjAsIDMyLCA4MCwgMTgsIDE1LCA2NCwgMTYwLCA0LCAzLCAyXTtcbiAgICAgICAgICAgICAgICBsZXQgc2FyX2hfdGFibGUgPSBbMSwgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDMzLCAgOTksIDMsIDIsIDFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPiAwICYmIGFzcGVjdF9yYXRpb19pZGMgPCAxNikge1xuICAgICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBzYXJfd190YWJsZVthc3BlY3RfcmF0aW9faWRjIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNhcl9oZWlnaHQgPSBzYXJfaF90YWJsZVthc3BlY3RfcmF0aW9faWRjIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhc3BlY3RfcmF0aW9faWRjID09PSAyNTUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0gZ2IucmVhZEJ5dGUoKSA8PCA4IHwgZ2IucmVhZEJ5dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGdiLnJlYWRCeXRlKCkgPDwgOCB8IGdiLnJlYWRCeXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ2IucmVhZEJvb2woKSkgeyAgLy8gb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICBnYi5yZWFkQm9vbCgpOyAgLy8gb3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdiLnJlYWRCb29sKCkpIHsgIC8vIHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgIGdiLnJlYWRCaXRzKDQpOyAgLy8gdmlkZW9fZm9ybWF0ICYgdmlkZW9fZnVsbF9yYW5nZV9mbGFnXG4gICAgICAgICAgICAgICAgaWYgKGdiLnJlYWRCb29sKCkpIHsgIC8vIGNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICAgICAgZ2IucmVhZEJpdHMoMjQpOyAgLy8gY29sb3VyX3ByaW1hcmllcyAmIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyAmIG1hdHJpeF9jb2VmZmljaWVudHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2IucmVhZEJvb2woKSkgeyAgLy8gY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgIGdiLnJlYWRVRUcoKTsgIC8vIGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfdG9wX2ZpZWxkXG4gICAgICAgICAgICAgICAgZ2IucmVhZFVFRygpOyAgLy8gY2hyb21hX3NhbXBsZV9sb2NfdHlwZV9ib3R0b21fZmllbGRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyB0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICBsZXQgbnVtX3VuaXRzX2luX3RpY2sgPSBnYi5yZWFkQml0cygzMik7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVfc2NhbGUgPSBnYi5yZWFkQml0cygzMik7XG4gICAgICAgICAgICAgICAgZnBzX2ZpeGVkID0gZ2IucmVhZEJvb2woKTsgIC8vIGZpeGVkX2ZyYW1lX3JhdGVfZmxhZ1xuXG4gICAgICAgICAgICAgICAgZnBzX251bSA9IHRpbWVfc2NhbGU7XG4gICAgICAgICAgICAgICAgZnBzX2RlbiA9IG51bV91bml0c19pbl90aWNrICogMjtcbiAgICAgICAgICAgICAgICBmcHMgPSBmcHNfbnVtIC8gZnBzX2RlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzYXJTY2FsZSA9IDE7XG4gICAgICAgIGlmIChzYXJfd2lkdGggIT09IDEgfHwgc2FyX2hlaWdodCAhPT0gMSkge1xuICAgICAgICAgICAgc2FyU2NhbGUgPSBzYXJfd2lkdGggLyBzYXJfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyb3BfdW5pdF94ID0gMCwgY3JvcF91bml0X3kgPSAwO1xuICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT09IDApIHtcbiAgICAgICAgICAgIGNyb3BfdW5pdF94ID0gMTtcbiAgICAgICAgICAgIGNyb3BfdW5pdF95ID0gMiAtIGZyYW1lX21ic19vbmx5X2ZsYWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3ViX3djID0gKGNocm9tYV9mb3JtYXRfaWRjID09PSAzKSA/IDEgOiAyO1xuICAgICAgICAgICAgbGV0IHN1Yl9oYyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PT0gMSkgPyAyIDogMTtcbiAgICAgICAgICAgIGNyb3BfdW5pdF94ID0gc3ViX3djO1xuICAgICAgICAgICAgY3JvcF91bml0X3kgPSBzdWJfaGMgKiAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGVjX3dpZHRoID0gKHBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMSkgKiAxNjtcbiAgICAgICAgbGV0IGNvZGVjX2hlaWdodCA9ICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykgKiAoKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpICogMTYpO1xuXG4gICAgICAgIGNvZGVjX3dpZHRoIC09IChmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ICsgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpICogY3JvcF91bml0X3g7XG4gICAgICAgIGNvZGVjX2hlaWdodCAtPSAoZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ICsgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSAqIGNyb3BfdW5pdF95O1xuXG4gICAgICAgIGxldCBwcmVzZW50X3dpZHRoID0gTWF0aC5jZWlsKGNvZGVjX3dpZHRoICogc2FyU2NhbGUpO1xuXG4gICAgICAgIGdiLmRlc3Ryb3koKTtcbiAgICAgICAgZ2IgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm9maWxlX3N0cmluZzogcHJvZmlsZV9zdHJpbmcsICAvLyBiYXNlbGluZSwgaGlnaCwgaGlnaDEwLCAuLi5cbiAgICAgICAgICAgIGxldmVsX3N0cmluZzogbGV2ZWxfc3RyaW5nLCAgLy8gMywgMy4xLCA0LCA0LjEsIDUsIDUuMSwgLi4uXG4gICAgICAgICAgICBiaXRfZGVwdGg6IGJpdF9kZXB0aCwgIC8vIDhiaXQsIDEwYml0LCAuLi5cbiAgICAgICAgICAgIHJlZl9mcmFtZXM6IHJlZl9mcmFtZXMsXG4gICAgICAgICAgICBjaHJvbWFfZm9ybWF0OiBjaHJvbWFfZm9ybWF0LCAgLy8gNDoyOjAsIDQ6MjoyLCAuLi5cbiAgICAgICAgICAgIGNocm9tYV9mb3JtYXRfc3RyaW5nOiBTUFNQYXJzZXIuZ2V0Q2hyb21hRm9ybWF0U3RyaW5nKGNocm9tYV9mb3JtYXQpLFxuXG4gICAgICAgICAgICBmcmFtZV9yYXRlOiB7XG4gICAgICAgICAgICAgICAgZml4ZWQ6IGZwc19maXhlZCxcbiAgICAgICAgICAgICAgICBmcHM6IGZwcyxcbiAgICAgICAgICAgICAgICBmcHNfZGVuOiBmcHNfZGVuLFxuICAgICAgICAgICAgICAgIGZwc19udW06IGZwc19udW1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNhcl9yYXRpbzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBzYXJfd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBzYXJfaGVpZ2h0XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjb2RlY19zaXplOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGNvZGVjX3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogY29kZWNfaGVpZ2h0XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwcmVzZW50X3NpemU6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogcHJlc2VudF93aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvZGVjX2hlaWdodFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBfc2tpcFNjYWxpbmdMaXN0KGdiLCBjb3VudCkge1xuICAgICAgICBsZXQgbGFzdF9zY2FsZSA9IDgsIG5leHRfc2NhbGUgPSA4O1xuICAgICAgICBsZXQgZGVsdGFfc2NhbGUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZXh0X3NjYWxlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc2NhbGUgPSBnYi5yZWFkU0VHKCk7XG4gICAgICAgICAgICAgICAgbmV4dF9zY2FsZSA9IChsYXN0X3NjYWxlICsgZGVsdGFfc2NhbGUgKyAyNTYpICUgMjU2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdF9zY2FsZSA9IChuZXh0X3NjYWxlID09PSAwKSA/IGxhc3Rfc2NhbGUgOiBuZXh0X3NjYWxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFByb2ZpbGVTdHJpbmcocHJvZmlsZV9pZGMpIHtcbiAgICAgICAgc3dpdGNoIChwcm9maWxlX2lkYykge1xuICAgICAgICAgICAgY2FzZSA2NjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0Jhc2VsaW5lJztcbiAgICAgICAgICAgIGNhc2UgNzc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdNYWluJztcbiAgICAgICAgICAgIGNhc2UgODg6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdFeHRlbmRlZCc7XG4gICAgICAgICAgICBjYXNlIDEwMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0hpZ2gnO1xuICAgICAgICAgICAgY2FzZSAxMTA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdIaWdoMTAnO1xuICAgICAgICAgICAgY2FzZSAxMjI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdIaWdoNDIyJztcbiAgICAgICAgICAgIGNhc2UgMjQ0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnSGlnaDQ0NCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnVW5rbm93bic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TGV2ZWxTdHJpbmcobGV2ZWxfaWRjKSB7XG4gICAgICAgIHJldHVybiAobGV2ZWxfaWRjIC8gMTApLnRvRml4ZWQoMSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldENocm9tYUZvcm1hdFN0cmluZyhjaHJvbWEpIHtcbiAgICAgICAgc3dpdGNoIChjaHJvbWEpIHtcbiAgICAgICAgICAgIGNhc2UgNDIwOlxuICAgICAgICAgICAgICAgIHJldHVybiAnNDoyOjAnO1xuICAgICAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICc0OjI6Mic7XG4gICAgICAgICAgICBjYXNlIDQ0NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzQ6NDo0JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbmtub3duJztcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTUFNQYXJzZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBQb2x5ZmlsbCBmcm9tICcuL3V0aWxzL3BvbHlmaWxsLmpzJztcbmltcG9ydCBGZWF0dXJlcyBmcm9tICcuL2NvcmUvZmVhdHVyZXMuanMnO1xuaW1wb3J0IEZsdlBsYXllciBmcm9tICcuL3BsYXllci9mbHYtcGxheWVyLmpzJztcbmltcG9ydCBOYXRpdmVQbGF5ZXIgZnJvbSAnLi9wbGF5ZXIvbmF0aXZlLXBsYXllci5qcyc7XG5pbXBvcnQgUGxheWVyRXZlbnRzIGZyb20gJy4vcGxheWVyL3BsYXllci1ldmVudHMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBFcnJvckRldGFpbHN9IGZyb20gJy4vcGxheWVyL3BsYXllci1lcnJvcnMuanMnO1xuaW1wb3J0IExvZ2dpbmdDb250cm9sIGZyb20gJy4vdXRpbHMvbG9nZ2luZy1jb250cm9sLmpzJztcbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIGhlcmUgYXJlIGFsbCB0aGUgaW50ZXJmYWNlc1xuXG4vLyBpbnN0YWxsIHBvbHlmaWxsc1xuUG9seWZpbGwuaW5zdGFsbCgpO1xuXG5cbi8vIGZhY3RvcnkgbWV0aG9kXG5mdW5jdGlvbiBjcmVhdGVQbGF5ZXIobWVkaWFEYXRhU291cmNlLCBvcHRpb25hbENvbmZpZykge1xuICAgIGxldCBtZHMgPSBtZWRpYURhdGFTb3VyY2U7XG4gICAgaWYgKG1kcyA9PSBudWxsIHx8IHR5cGVvZiBtZHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ01lZGlhRGF0YVNvdXJjZSBtdXN0IGJlIGFuIGphdmFzY3JpcHQgb2JqZWN0IScpO1xuICAgIH1cblxuICAgIGlmICghbWRzLmhhc093blByb3BlcnR5KCd0eXBlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTWVkaWFEYXRhU291cmNlIG11c3QgaGFzIHR5cGUgZmllbGQgdG8gaW5kaWNhdGUgdmlkZW8gZmlsZSB0eXBlIScpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWRzLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZmx2JzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmx2UGxheWVyKG1kcywgb3B0aW9uYWxDb25maWcpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVQbGF5ZXIobWRzLCBvcHRpb25hbENvbmZpZyk7XG4gICAgfVxufVxuXG5cbi8vIGZlYXR1cmUgZGV0ZWN0aW9uXG5mdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gRmVhdHVyZXMuc3VwcG9ydE1TRUgyNjRQbGF5YmFjaygpO1xufVxuXG5mdW5jdGlvbiBnZXRGZWF0dXJlTGlzdCgpIHtcbiAgICByZXR1cm4gRmVhdHVyZXMuZ2V0RmVhdHVyZUxpc3QoKTtcbn1cblxuXG4vLyBpbnRlcmZhY2VzXG5sZXQgZmx2anMgPSB7fTtcblxuZmx2anMuY3JlYXRlUGxheWVyID0gY3JlYXRlUGxheWVyO1xuZmx2anMuaXNTdXBwb3J0ZWQgPSBpc1N1cHBvcnRlZDtcbmZsdmpzLmdldEZlYXR1cmVMaXN0ID0gZ2V0RmVhdHVyZUxpc3Q7XG5cbmZsdmpzLkV2ZW50cyA9IFBsYXllckV2ZW50cztcbmZsdmpzLkVycm9yVHlwZXMgPSBFcnJvclR5cGVzO1xuZmx2anMuRXJyb3JEZXRhaWxzID0gRXJyb3JEZXRhaWxzO1xuXG5mbHZqcy5GbHZQbGF5ZXIgPSBGbHZQbGF5ZXI7XG5mbHZqcy5OYXRpdmVQbGF5ZXIgPSBOYXRpdmVQbGF5ZXI7XG5mbHZqcy5Mb2dnaW5nQ29udHJvbCA9IExvZ2dpbmdDb250cm9sO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZmx2anMsICd2ZXJzaW9uJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHJlcGxhY2VkIGJ5IGJyb3dzZXJpZnktdmVyc2lvbmlmeSB0cmFuc2Zvcm1cbiAgICAgICAgcmV0dXJuICdfX1ZFUlNJT05fXyc7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZsdmpzOyIsIi8vIGVudHJ5L2luZGV4IGZpbGVcblxuLy8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggYnJvd3NlcmlmeSdzIHVtZCB3cmFwcGVyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmx2LmpzJykuZGVmYXVsdDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgQnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCB7QmFzZUxvYWRlciwgTG9hZGVyU3RhdHVzLCBMb2FkZXJFcnJvcnN9IGZyb20gJy4vbG9hZGVyLmpzJztcbmltcG9ydCB7UnVudGltZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLyogZmV0Y2ggKyBzdHJlYW0gSU8gbG9hZGVyLiBDdXJyZW50bHkgd29ya2luZyBvbiBjaHJvbWUgNDMrLlxuICogZmV0Y2ggcHJvdmlkZXMgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUgaHR0cCBBUEkgdG8gWE1MSHR0cFJlcXVlc3RcbiAqXG4gKiBmZXRjaCBzcGVjICAgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvXG4gKiBzdHJlYW0gc3BlYyAgaHR0cHM6Ly9zdHJlYW1zLnNwZWMud2hhdHdnLm9yZy9cbiAqL1xuY2xhc3MgRmV0Y2hTdHJlYW1Mb2FkZXIgZXh0ZW5kcyBCYXNlTG9hZGVyIHtcblxuICAgIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGZldGNoICsgc3RyZWFtIGlzIGJyb2tlbiBvbiBNaWNyb3NvZnQgRWRnZS4gRGlzYWJsZSBiZWZvcmUgYnVpbGQgMTUwNDguXG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODE5NjkwNy9cbiAgICAgICAgICAgIC8vIEZpeGVkIGluIEphbiAxMCwgMjAxNy4gQnVpbGQgMTUwNDgrIHJlbW92ZWQgZnJvbSBibGFja2xpc3QuXG4gICAgICAgICAgICBsZXQgaXNXb3JrV2VsbEVkZ2UgPSBCcm93c2VyLm1zZWRnZSAmJiBCcm93c2VyLnZlcnNpb24ubWlub3IgPj0gMTUwNDg7XG4gICAgICAgICAgICBsZXQgYnJvd3Nlck5vdEJsYWNrbGlzdGVkID0gQnJvd3Nlci5tc2VkZ2UgPyBpc1dvcmtXZWxsRWRnZSA6IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gKHNlbGYuZmV0Y2ggJiYgc2VsZi5SZWFkYWJsZVN0cmVhbSAmJiBicm93c2VyTm90QmxhY2tsaXN0ZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihzZWVrSGFuZGxlciwgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCdmZXRjaC1zdHJlYW0tbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ0ZldGNoU3RyZWFtTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSByYW5nZTtcblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMICYmIGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZVVSTCA9IGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWVrQ29uZmlnID0gdGhpcy5fc2Vla0hhbmRsZXIuZ2V0Q29uZmlnKHNvdXJjZVVSTCwgcmFuZ2UpO1xuXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IHNlbGYuSGVhZGVycygpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vla0NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGNvbmZpZ0hlYWRlcnMgPSBzZWVrQ29uZmlnLmhlYWRlcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29uZmlnSGVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWdIZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCBjb25maWdIZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgIGNhY2hlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb2xpY3kgb2YgRmV0Y2ggQVBJIGluIHRoZSB3aGF0d2cgc3RhbmRhcmRcbiAgICAgICAgICAgIC8vIFNhZmFyaSBpbmNvcnJlY3RseSBpbmRpY2F0ZXMgJ25vLXJlZmVycmVyJyBhcyBkZWZhdWx0IHBvbGljeSwgZnVjayBpdFxuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBjb3JzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoZGF0YVNvdXJjZS5jb3JzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gbm8tY29ycyBtZWFucyAnZGlzcmVnYXJkIGNvcnMgcG9saWN5Jywgd2hpY2ggY2FuIG9ubHkgYmUgdXNlZCBpbiBTZXJ2aWNlV29ya2VyXG4gICAgICAgICAgICBwYXJhbXMubW9kZSA9ICdzYW1lLW9yaWdpbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aXRoQ3JlZGVudGlhbHMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoZGF0YVNvdXJjZS53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIHBhcmFtcy5jcmVkZW50aWFscyA9ICdpbmNsdWRlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlZmVycmVyUG9saWN5IGZyb20gY29uZmlnXG4gICAgICAgIGlmIChkYXRhU291cmNlLnJlZmVycmVyUG9saWN5KSB7XG4gICAgICAgICAgICBwYXJhbXMucmVmZXJyZXJQb2xpY3kgPSBkYXRhU291cmNlLnJlZmVycmVyUG9saWN5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb25uZWN0aW5nO1xuICAgICAgICBzZWxmLmZldGNoKHNlZWtDb25maWcudXJsLCBwYXJhbXMpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RBYm9ydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rSWRsZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzLm9rICYmIChyZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDw9IDI5OSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLnVybCAhPT0gc2Vla0NvbmZpZy51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uVVJMUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdGVkVVJMID0gdGhpcy5fc2Vla0hhbmRsZXIucmVtb3ZlVVJMUGFyYW1ldGVycyhyZXMudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVVJMUmVkaXJlY3QocmVkaXJlY3RlZFVSTCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbGVuZ3RoSGVhZGVyID0gcmVzLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGhIZWFkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQobGVuZ3RoSGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duKHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B1bXAuY2FsbCh0aGlzLCByZXMuYm9keS5nZXRSZWFkZXIoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihMb2FkZXJFcnJvcnMuSFRUUF9TVEFUVVNfQ09ERV9JTlZBTElELCB7Y29kZTogcmVzLnN0YXR1cywgbXNnOiByZXMuc3RhdHVzVGV4dH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdGZXRjaFN0cmVhbUxvYWRlcjogSHR0cCBjb2RlIGludmFsaWQsICcgKyByZXMuc3RhdHVzICsgJyAnICsgcmVzLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkVYQ0VQVElPTiwge2NvZGU6IC0xLCBtc2c6IGUubWVzc2FnZX0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfcHVtcChyZWFkZXIpIHsgIC8vIFJlYWRhYmxlU3RyZWFtUmVhZGVyXG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNvbXBsZXRlKHRoaXMuX3JhbmdlLmZyb20sIHRoaXMuX3JhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RBYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcblxuICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IHJlc3VsdC52YWx1ZS5idWZmZXI7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVTdGFydCA9IHRoaXMuX3JhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uRGF0YUFycml2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcHVtcChyZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gMTEgJiYgQnJvd3Nlci5tc2VkZ2UpIHsgIC8vIEludmFsaWRTdGF0ZUVycm9yIG9uIE1pY3Jvc29mdCBFZGdlXG4gICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZDogRWRnZSBtYXkgdGhyb3cgSW52YWxpZFN0YXRlRXJyb3IgYWZ0ZXIgUmVhZGFibGVTdHJlYW1SZWFkZXIuY2FuY2VsKCkgY2FsbFxuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgdW5rbm93biBleGNlcHRpb24uXG4gICAgICAgICAgICAgICAgLy8gUmVsYXRlZCBpc3N1ZTogaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTEyNjUyMDIvXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICAgICAgbGV0IGluZm8gPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoKGUuY29kZSA9PT0gMTkgfHwgZS5tZXNzYWdlID09PSAnbmV0d29yayBlcnJvcicpICYmIC8vIE5FVFdPUktfRVJSXG4gICAgICAgICAgICAgICAgKHRoaXMuX2NvbnRlbnRMZW5ndGggPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5fY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpKSkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuRUFSTFlfRU9GO1xuICAgICAgICAgICAgICAgIGluZm8gPSB7Y29kZTogZS5jb2RlLCBtc2c6ICdGZXRjaCBzdHJlYW0gbWVldCBFYXJseS1FT0YnfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FWENFUFRJT047XG4gICAgICAgICAgICAgICAgaW5mbyA9IHtjb2RlOiBlLmNvZGUsIG1zZzogZS5tZXNzYWdlfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKHR5cGUsIGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBGZXRjaFN0cmVhbUxvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IFNwZWVkU2FtcGxlciBmcm9tICcuL3NwZWVkLXNhbXBsZXIuanMnO1xuaW1wb3J0IHtMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi9sb2FkZXIuanMnO1xuaW1wb3J0IEZldGNoU3RyZWFtTG9hZGVyIGZyb20gJy4vZmV0Y2gtc3RyZWFtLWxvYWRlci5qcyc7XG5pbXBvcnQgTW96Q2h1bmtlZExvYWRlciBmcm9tICcuL3hoci1tb3otY2h1bmtlZC1sb2FkZXIuanMnO1xuaW1wb3J0IE1TU3RyZWFtTG9hZGVyIGZyb20gJy4veGhyLW1zc3RyZWFtLWxvYWRlci5qcyc7XG5pbXBvcnQgUmFuZ2VMb2FkZXIgZnJvbSAnLi94aHItcmFuZ2UtbG9hZGVyLmpzJztcbmltcG9ydCBXZWJTb2NrZXRMb2FkZXIgZnJvbSAnLi93ZWJzb2NrZXQtbG9hZGVyLmpzJztcbmltcG9ydCBSYW5nZVNlZWtIYW5kbGVyIGZyb20gJy4vcmFuZ2Utc2Vlay1oYW5kbGVyLmpzJztcbmltcG9ydCBQYXJhbVNlZWtIYW5kbGVyIGZyb20gJy4vcGFyYW0tc2Vlay1oYW5kbGVyLmpzJztcbmltcG9ydCB7UnVudGltZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8qKlxuICogRGF0YVNvdXJjZToge1xuICogICAgIHVybDogc3RyaW5nLFxuICogICAgIGZpbGVzaXplOiBudW1iZXIsXG4gKiAgICAgY29yczogYm9vbGVhbixcbiAqICAgICB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW5cbiAqIH1cbiAqIFxuICovXG5cbi8vIE1hbmFnZSBJTyBMb2FkZXJzXG5jbGFzcyBJT0NvbnRyb2xsZXIge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YVNvdXJjZSwgY29uZmlnLCBleHRyYURhdGEpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnSU9Db250cm9sbGVyJztcblxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2V4dHJhRGF0YSA9IGV4dHJhRGF0YTtcblxuICAgICAgICB0aGlzLl9zdGFzaEluaXRpYWxTaXplID0gMTAyNCAqIDM4NDsgIC8vIGRlZmF1bHQgaW5pdGlhbCBzaXplOiAzODRLQlxuICAgICAgICBpZiAoY29uZmlnLnN0YXNoSW5pdGlhbFNpemUgIT0gdW5kZWZpbmVkICYmIGNvbmZpZy5zdGFzaEluaXRpYWxTaXplID4gMCkge1xuICAgICAgICAgICAgLy8gYXBwbHkgZnJvbSBjb25maWdcbiAgICAgICAgICAgIHRoaXMuX3N0YXNoSW5pdGlhbFNpemUgPSBjb25maWcuc3Rhc2hJbml0aWFsU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXNoVXNlZCA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXNoU2l6ZSA9IHRoaXMuX3N0YXNoSW5pdGlhbFNpemU7XG4gICAgICAgIHRoaXMuX2J1ZmZlclNpemUgPSAxMDI0ICogMTAyNCAqIDM7ICAvLyBpbml0aWFsIHNpemU6IDNNQlxuICAgICAgICB0aGlzLl9zdGFzaEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl9lbmFibGVTdGFzaCA9IHRydWU7XG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlU3Rhc2hCdWZmZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9lbmFibGVTdGFzaCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSBudWxsO1xuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgICAgIHRoaXMuX2lzV2ViU29ja2V0VVJMID0gL3dzcz86XFwvXFwvKC4rPykvLnRlc3QoZGF0YVNvdXJjZS51cmwpO1xuICAgICAgICB0aGlzLl9yZWZUb3RhbExlbmd0aCA9IGRhdGFTb3VyY2UuZmlsZXNpemUgPyBkYXRhU291cmNlLmZpbGVzaXplIDogbnVsbDtcbiAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggPSB0aGlzLl9yZWZUb3RhbExlbmd0aDtcbiAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RGbGFnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZGlyZWN0ZWRVUkwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3NwZWVkTm9ybWFsaXplZCA9IDA7XG4gICAgICAgIHRoaXMuX3NwZWVkU2FtcGxlciA9IG5ldyBTcGVlZFNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fc3BlZWROb3JtYWxpemVMaXN0ID0gWzY0LCAxMjgsIDI1NiwgMzg0LCA1MTIsIDc2OCwgMTAyNCwgMTUzNiwgMjA0OCwgMzA3MiwgNDA5Nl07XG5cbiAgICAgICAgdGhpcy5faXNFYXJseUVvZlJlY29ubmVjdGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZXN1bWVGcm9tID0gMDtcblxuICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TZWVrZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUmVkaXJlY3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9zZWxlY3RTZWVrSGFuZGxlcigpO1xuICAgICAgICB0aGlzLl9zZWxlY3RMb2FkZXIoKTtcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9hZGVyKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlci5pc1dvcmtpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9hZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fbG9hZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSBudWxsO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3Rhc2hCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSB0aGlzLl9zdGFzaFNpemUgPSB0aGlzLl9idWZmZXJTaXplID0gdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9zcGVlZFNhbXBsZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2lzRWFybHlFb2ZSZWNvbm5lY3RpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TZWVrZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUmVkaXJlY3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9leHRyYURhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGlzV29ya2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlciAmJiB0aGlzLl9sb2FkZXIuaXNXb3JraW5nKCkgJiYgIXRoaXMuX3BhdXNlZDtcbiAgICB9XG5cbiAgICBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdXNlZDtcbiAgICB9XG5cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVyLnN0YXR1cztcbiAgICB9XG5cbiAgICBnZXQgZXh0cmFEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFEYXRhO1xuICAgIH1cblxuICAgIHNldCBleHRyYURhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLl9leHRyYURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8vIHByb3RvdHlwZTogZnVuY3Rpb24gb25EYXRhQXJyaXZhbChjaHVua3M6IEFycmF5QnVmZmVyLCBieXRlU3RhcnQ6IG51bWJlcik6IG51bWJlclxuICAgIGdldCBvbkRhdGFBcnJpdmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25EYXRhQXJyaXZhbDtcbiAgICB9XG5cbiAgICBzZXQgb25EYXRhQXJyaXZhbChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IG9uU2Vla2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25TZWVrZWQ7XG4gICAgfVxuXG4gICAgc2V0IG9uU2Vla2VkKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uU2Vla2VkID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gcHJvdG90eXBlOiBmdW5jdGlvbiBvbkVycm9yKHR5cGU6IG51bWJlciwgaW5mbzoge2NvZGU6IG51bWJlciwgbXNnOiBzdHJpbmd9KTogdm9pZFxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcjtcbiAgICB9XG5cbiAgICBzZXQgb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IG9uQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkNvbXBsZXRlO1xuICAgIH1cblxuICAgIHNldCBvbkNvbXBsZXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uQ29tcGxldGUgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25SZWRpcmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUmVkaXJlY3Q7XG4gICAgfVxuXG4gICAgc2V0IG9uUmVkaXJlY3QoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25SZWRpcmVjdCA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvblJlY292ZXJlZEVhcmx5RW9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25SZWNvdmVyZWRFYXJseUVvZjtcbiAgICB9XG5cbiAgICBzZXQgb25SZWNvdmVyZWRFYXJseUVvZihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlLnVybDtcbiAgICB9XG5cbiAgICBnZXQgaGFzUmVkaXJlY3QoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcmVkaXJlY3RlZFVSTCAhPSBudWxsIHx8IHRoaXMuX2RhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50UmVkaXJlY3RlZFVSTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0ZWRVUkwgfHwgdGhpcy5fZGF0YVNvdXJjZS5yZWRpcmVjdGVkVVJMO1xuICAgIH1cblxuICAgIC8vIGluIEtCL3NcbiAgICBnZXQgY3VycmVudFNwZWVkKCkge1xuICAgICAgICBpZiAodGhpcy5fbG9hZGVyQ2xhc3MgPT09IFJhbmdlTG9hZGVyKSB7XG4gICAgICAgICAgICAvLyBTcGVlZFNhbXBsZXIgaXMgaW5hY2N1cmFjeSBpZiBsb2FkZXIgaXMgUmFuZ2VMb2FkZXJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkZXIuY3VycmVudFNwZWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVlZFNhbXBsZXIubGFzdFNlY29uZEtCcHM7XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRlclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZXIudHlwZTtcbiAgICB9XG5cbiAgICBfc2VsZWN0U2Vla0hhbmRsZXIoKSB7XG4gICAgICAgIGxldCBjb25maWcgPSB0aGlzLl9jb25maWc7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zZWVrVHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5fc2Vla0hhbmRsZXIgPSBuZXcgUmFuZ2VTZWVrSGFuZGxlcih0aGlzLl9jb25maWcucmFuZ2VMb2FkWmVyb1N0YXJ0KTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcuc2Vla1R5cGUgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gY29uZmlnLnNlZWtQYXJhbVN0YXJ0IHx8ICdic3RhcnQnO1xuICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gY29uZmlnLnNlZWtQYXJhbUVuZCB8fCAnYmVuZCc7XG5cbiAgICAgICAgICAgIHRoaXMuX3NlZWtIYW5kbGVyID0gbmV3IFBhcmFtU2Vla0hhbmRsZXIocGFyYW1TdGFydCwgcGFyYW1FbmQpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5zZWVrVHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmN1c3RvbVNlZWtIYW5kbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ3VzdG9tIHNlZWtUeXBlIHNwZWNpZmllZCBpbiBjb25maWcgYnV0IGludmFsaWQgY3VzdG9tU2Vla0hhbmRsZXIhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IG5ldyBjb25maWcuY3VzdG9tU2Vla0hhbmRsZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oYEludmFsaWQgc2Vla1R5cGUgaW4gY29uZmlnOiAke2NvbmZpZy5zZWVrVHlwZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZWxlY3RMb2FkZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1dlYlNvY2tldFVSTCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSBXZWJTb2NrZXRMb2FkZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoRmV0Y2hTdHJlYW1Mb2FkZXIuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSBGZXRjaFN0cmVhbUxvYWRlcjtcbiAgICAgICAgfSBlbHNlIGlmIChNb3pDaHVua2VkTG9hZGVyLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlckNsYXNzID0gTW96Q2h1bmtlZExvYWRlcjtcbiAgICAgICAgfSBlbHNlIGlmIChSYW5nZUxvYWRlci5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJDbGFzcyA9IFJhbmdlTG9hZGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgYnJvd3NlciBkb2VzblxcJ3Qgc3VwcG9ydCB4aHIgd2l0aCBhcnJheWJ1ZmZlciByZXNwb25zZVR5cGUhJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY3JlYXRlTG9hZGVyKCkge1xuICAgICAgICB0aGlzLl9sb2FkZXIgPSBuZXcgdGhpcy5fbG9hZGVyQ2xhc3ModGhpcy5fc2Vla0hhbmRsZXIsIHRoaXMuX2NvbmZpZyk7XG4gICAgICAgIGlmICh0aGlzLl9sb2FkZXIubmVlZFN0YXNoQnVmZmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5fZW5hYmxlU3Rhc2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sb2FkZXIub25Db250ZW50TGVuZ3RoS25vd24gPSB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9sb2FkZXIub25VUkxSZWRpcmVjdCA9IHRoaXMuX29uVVJMUmVkaXJlY3QuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fbG9hZGVyLm9uRGF0YUFycml2YWwgPSB0aGlzLl9vbkxvYWRlckNodW5rQXJyaXZhbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9sb2FkZXIub25Db21wbGV0ZSA9IHRoaXMuX29uTG9hZGVyQ29tcGxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fbG9hZGVyLm9uRXJyb3IgPSB0aGlzLl9vbkxvYWRlckVycm9yLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgb3BlbihvcHRpb25hbEZyb20pIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFJhbmdlID0ge2Zyb206IDAsIHRvOiAtMX07XG4gICAgICAgIGlmIChvcHRpb25hbEZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZS5mcm9tID0gb3B0aW9uYWxGcm9tO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3BlZWRTYW1wbGVyLnJlc2V0KCk7XG4gICAgICAgIGlmICghb3B0aW9uYWxGcm9tKSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdEZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZGVyLm9wZW4odGhpcy5fZGF0YVNvdXJjZSwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFJhbmdlKSk7XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlci5hYm9ydCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVzdW1lRnJvbSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlci5hYm9ydCgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzdW1lRnJvbSA9IHRoaXMuX3N0YXNoQnl0ZVN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZS50byA9IHRoaXMuX3N0YXNoQnl0ZVN0YXJ0IC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzdW1lRnJvbSA9IHRoaXMuX2N1cnJlbnRSYW5nZS50byArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSAwO1xuICAgICAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYnl0ZXMgPSB0aGlzLl9yZXN1bWVGcm9tO1xuICAgICAgICAgICAgdGhpcy5fcmVzdW1lRnJvbSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFNlZWsoYnl0ZXMsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlayhieXRlcykge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3Rhc2hVc2VkID0gMDtcbiAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbFNlZWsoYnl0ZXMsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gc2Vla2luZyByZXF1ZXN0IGlzIGZyb20gbWVkaWEgc2Vla2luZywgdW5jb25zdW1lZCBzdGFzaCBkYXRhIHNob3VsZCBiZSBkcm9wcGVkXG4gICAgICogSG93ZXZlciwgc3Rhc2ggZGF0YSBzaG91bGRuJ3QgYmUgZHJvcHBlZCBpZiBzZWVraW5nIHJlcXVlc3RlZCBmcm9tIGh0dHAgcmVjb25uZWN0aW9uXG4gICAgICpcbiAgICAgKiBAZHJvcFVuY29uc3VtZWQ6IElnbm9yZSBhbmQgZGlzY2FyZCBhbGwgdW5jb25zdW1lZCBkYXRhIGluIHN0YXNoIGJ1ZmZlclxuICAgICAqL1xuICAgIF9pbnRlcm5hbFNlZWsoYnl0ZXMsIGRyb3BVbmNvbnN1bWVkKSB7XG4gICAgICAgIGlmICh0aGlzLl9sb2FkZXIuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlci5hYm9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggJiBmbHVzaCBzdGFzaCBidWZmZXIgYmVmb3JlIHNlZWtcbiAgICAgICAgdGhpcy5fZmx1c2hTdGFzaEJ1ZmZlcihkcm9wVW5jb25zdW1lZCk7XG5cbiAgICAgICAgdGhpcy5fbG9hZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fbG9hZGVyID0gbnVsbDtcblxuICAgICAgICBsZXQgcmVxdWVzdFJhbmdlID0ge2Zyb206IGJ5dGVzLCB0bzogLTF9O1xuICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UgPSB7ZnJvbTogcmVxdWVzdFJhbmdlLmZyb20sIHRvOiAtMX07XG5cbiAgICAgICAgdGhpcy5fc3BlZWRTYW1wbGVyLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3N0YXNoU2l6ZSA9IHRoaXMuX3N0YXNoSW5pdGlhbFNpemU7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUxvYWRlcigpO1xuICAgICAgICB0aGlzLl9sb2FkZXIub3Blbih0aGlzLl9kYXRhU291cmNlLCByZXF1ZXN0UmFuZ2UpO1xuXG4gICAgICAgIGlmICh0aGlzLl9vblNlZWtlZCkge1xuICAgICAgICAgICAgdGhpcy5fb25TZWVrZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVVybCh1cmwpIHtcbiAgICAgICAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdXJsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVXJsIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZS51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB3aXRoIG5ldyB1cmxcbiAgICB9XG5cbiAgICBfZXhwYW5kQnVmZmVyKGV4cGVjdGVkQnl0ZXMpIHtcbiAgICAgICAgbGV0IGJ1ZmZlck5ld1NpemUgPSB0aGlzLl9zdGFzaFNpemU7XG4gICAgICAgIHdoaWxlIChidWZmZXJOZXdTaXplICsgMTAyNCAqIDEwMjQgKiAxIDwgZXhwZWN0ZWRCeXRlcykge1xuICAgICAgICAgICAgYnVmZmVyTmV3U2l6ZSAqPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyTmV3U2l6ZSArPSAxMDI0ICogMTAyNCAqIDE7ICAvLyBidWZmZXJTaXplID0gc3Rhc2hTaXplICsgMU1CXG4gICAgICAgIGlmIChidWZmZXJOZXdTaXplID09PSB0aGlzLl9idWZmZXJTaXplKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlck5ld1NpemUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgPiAwKSB7ICAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgaW50byBuZXcgYnVmZmVyXG4gICAgICAgICAgICBsZXQgc3Rhc2hPbGRBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9zdGFzaFVzZWQpO1xuICAgICAgICAgICAgbGV0IHN0YXNoTmV3QXJyYXkgPSBuZXcgVWludDhBcnJheShuZXdCdWZmZXIsIDAsIGJ1ZmZlck5ld1NpemUpO1xuICAgICAgICAgICAgc3Rhc2hOZXdBcnJheS5zZXQoc3Rhc2hPbGRBcnJheSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGFzaEJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IGJ1ZmZlck5ld1NpemU7XG4gICAgfVxuXG4gICAgX25vcm1hbGl6ZVNwZWVkKGlucHV0KSB7XG4gICAgICAgIGxldCBsaXN0ID0gdGhpcy5fc3BlZWROb3JtYWxpemVMaXN0O1xuICAgICAgICBsZXQgbGFzdCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG1pZCA9IDA7XG4gICAgICAgIGxldCBsYm91bmQgPSAwO1xuICAgICAgICBsZXQgdWJvdW5kID0gbGFzdDtcblxuICAgICAgICBpZiAoaW5wdXQgPCBsaXN0WzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdFswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJpbmFyeSBzZWFyY2hcbiAgICAgICAgd2hpbGUgKGxib3VuZCA8PSB1Ym91bmQpIHtcbiAgICAgICAgICAgIG1pZCA9IGxib3VuZCArIE1hdGguZmxvb3IoKHVib3VuZCAtIGxib3VuZCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChtaWQgPT09IGxhc3QgfHwgKGlucHV0ID49IGxpc3RbbWlkXSAmJiBpbnB1dCA8IGxpc3RbbWlkICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RbbWlkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFttaWRdIDwgaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBsYm91bmQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1Ym91bmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FkanVzdFN0YXNoU2l6ZShub3JtYWxpemVkKSB7XG4gICAgICAgIGxldCBzdGFzaFNpemVLQiA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0xpdmUpIHtcbiAgICAgICAgICAgIC8vIGxpdmUgc3RyZWFtOiBhbHdheXMgdXNlIHNpbmdsZSBub3JtYWxpemVkIHNwZWVkIGZvciBzaXplIG9mIHN0YXNoU2l6ZUtCXG4gICAgICAgICAgICBzdGFzaFNpemVLQiA9IG5vcm1hbGl6ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZCA8IDUxMikge1xuICAgICAgICAgICAgICAgIHN0YXNoU2l6ZUtCID0gbm9ybWFsaXplZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZCA+PSA1MTIgJiYgbm9ybWFsaXplZCA8PSAxMDI0KSB7XG4gICAgICAgICAgICAgICAgc3Rhc2hTaXplS0IgPSBNYXRoLmZsb29yKG5vcm1hbGl6ZWQgKiAxLjUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFzaFNpemVLQiA9IG5vcm1hbGl6ZWQgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXNoU2l6ZUtCID4gODE5Mikge1xuICAgICAgICAgICAgc3Rhc2hTaXplS0IgPSA4MTkyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1ZmZlclNpemUgPSBzdGFzaFNpemVLQiAqIDEwMjQgKyAxMDI0ICogMTAyNCAqIDE7ICAvLyBzdGFzaFNpemUgKyAxTUJcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlclNpemUgPCBidWZmZXJTaXplKSB7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRCdWZmZXIoYnVmZmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3Rhc2hTaXplID0gc3Rhc2hTaXplS0IgKiAxMDI0O1xuICAgIH1cblxuICAgIF9kaXNwYXRjaENodW5rcyhjaHVua3MsIGJ5dGVTdGFydCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UudG8gPSBieXRlU3RhcnQgKyBjaHVua3MuYnl0ZUxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkRhdGFBcnJpdmFsKGNodW5rcywgYnl0ZVN0YXJ0KTtcbiAgICB9XG5cbiAgICBfb25VUkxSZWRpcmVjdChyZWRpcmVjdGVkVVJMKSB7XG4gICAgICAgIHRoaXMuX3JlZGlyZWN0ZWRVUkwgPSByZWRpcmVjdGVkVVJMO1xuICAgICAgICBpZiAodGhpcy5fb25SZWRpcmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fb25SZWRpcmVjdChyZWRpcmVjdGVkVVJMKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNvbnRlbnRMZW5ndGhLbm93bihjb250ZW50TGVuZ3RoKSB7XG4gICAgICAgIGlmIChjb250ZW50TGVuZ3RoICYmIHRoaXMuX2Z1bGxSZXF1ZXN0RmxhZykge1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggPSBjb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RGbGFnID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Mb2FkZXJDaHVua0Fycml2YWwoY2h1bmssIGJ5dGVTdGFydCwgcmVjZWl2ZWRMZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vbkRhdGFBcnJpdmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdJT0NvbnRyb2xsZXI6IE5vIGV4aXN0aW5nIGNvbnN1bWVyIChvbkRhdGFBcnJpdmFsKSBjYWxsYmFjayEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzRWFybHlFb2ZSZWNvbm5lY3RpbmcpIHtcbiAgICAgICAgICAgIC8vIEF1dG8tcmVjb25uZWN0IGZvciBFYXJseUVvZiBzdWNjZWVkLCBub3RpZnkgdG8gdXBwZXItbGF5ZXIgYnkgY2FsbGJhY2tcbiAgICAgICAgICAgIHRoaXMuX2lzRWFybHlFb2ZSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25SZWNvdmVyZWRFYXJseUVvZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3BlZWRTYW1wbGVyLmFkZEJ5dGVzKGNodW5rLmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIGFkanVzdCBzdGFzaCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gbmV0d29yayBzcGVlZCBkeW5hbWljYWxseVxuICAgICAgICBsZXQgS0JwcyA9IHRoaXMuX3NwZWVkU2FtcGxlci5sYXN0U2Vjb25kS0JwcztcbiAgICAgICAgaWYgKEtCcHMgIT09IDApIHtcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkID0gdGhpcy5fbm9ybWFsaXplU3BlZWQoS0Jwcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3BlZWROb3JtYWxpemVkICE9PSBub3JtYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3BlZWROb3JtYWxpemVkID0gbm9ybWFsaXplZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGp1c3RTdGFzaFNpemUobm9ybWFsaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZVN0YXNoKSB7ICAvLyBkaXNhYmxlIHN0YXNoXG4gICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggY2h1bmsgZGlyZWN0bHkgdG8gY29uc3VtZXI7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgcmV0IHZhbHVlIChjb25zdW1lZCBieXRlcykgYW5kIHN0YXNoIHVuY29uc3VtZWQgdG8gc3Rhc2hCdWZmZXJcbiAgICAgICAgICAgICAgICBsZXQgY29uc3VtZWQgPSB0aGlzLl9kaXNwYXRjaENodW5rcyhjaHVuaywgYnl0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQgPCBjaHVuay5ieXRlTGVuZ3RoKSB7ICAvLyB1bmNvbnN1bWVkIGRhdGEgcmVtYWluLlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtYWluID0gY2h1bmsuYnl0ZUxlbmd0aCAtIGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluID4gdGhpcy5fYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kQnVmZmVyKHJlbWFpbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rLCBjb25zdW1lZCksIDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgKz0gcmVtYWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IGJ5dGVTdGFydCArIGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZWxzZTogTWVyZ2UgY2h1bmsgaW50byBzdGFzaEJ1ZmZlciwgYW5kIGRpc3BhdGNoIHN0YXNoQnVmZmVyIHRvIGNvbnN1bWVyLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgKyBjaHVuay5ieXRlTGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9leHBhbmRCdWZmZXIodGhpcy5fc3Rhc2hVc2VkICsgY2h1bmsuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzdGFzaEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fc3Rhc2hCdWZmZXIsIDAsIHRoaXMuX2J1ZmZlclNpemUpO1xuICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgdGhpcy5fc3Rhc2hVc2VkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgY29uc3VtZWQgPSB0aGlzLl9kaXNwYXRjaENodW5rcyh0aGlzLl9zdGFzaEJ1ZmZlci5zbGljZSgwLCB0aGlzLl9zdGFzaFVzZWQpLCB0aGlzLl9zdGFzaEJ5dGVTdGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkIDwgdGhpcy5fc3Rhc2hVc2VkICYmIGNvbnN1bWVkID4gMCkgeyAgLy8gdW5jb25zdW1lZCBkYXRhIHJlbWFpblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVtYWluQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgY29uc3VtZWQpO1xuICAgICAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChyZW1haW5BcnJheSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCAtPSBjb25zdW1lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCArPSBjb25zdW1lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgIC8vIGVuYWJsZSBzdGFzaFxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXNoVXNlZCA9PT0gMCAmJiB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9PT0gMCkgeyAgLy8gc2Vla2VkPyBvciBpbml0IGNodW5rP1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGNodW5rIGFmdGVyIHNlZWsgYWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSBieXRlU3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkICsgY2h1bmsuYnl0ZUxlbmd0aCA8PSB0aGlzLl9zdGFzaFNpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBqdXN0IHN0YXNoXG4gICAgICAgICAgICAgICAgbGV0IHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fc3Rhc2hTaXplKTtcbiAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChuZXcgVWludDhBcnJheShjaHVuayksIHRoaXMuX3N0YXNoVXNlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2UgeyAgLy8gc3Rhc2hVc2VkICsgY2h1bmtTaXplID4gc3Rhc2hTaXplLCBzaXplIGxpbWl0IGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgbGV0IHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXNoVXNlZCA+IDApIHsgIC8vIFRoZXJlJ3JlIHN0YXNoIGRhdGFzIGluIGJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0aGUgd2hvbGUgc3Rhc2hCdWZmZXIsIGFuZCBzdGFzaCByZW1haW4gZGF0YVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGFwcGVuZCBjaHVuayB0byBzdGFzaEJ1ZmZlciAoc3Rhc2gpXG4gICAgICAgICAgICAgICAgICAgIGxldCBidWZmZXIgPSB0aGlzLl9zdGFzaEJ1ZmZlci5zbGljZSgwLCB0aGlzLl9zdGFzaFVzZWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uc3VtZWQgPSB0aGlzLl9kaXNwYXRjaENodW5rcyhidWZmZXIsIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkIDwgYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVtYWluQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIsIGNvbnN1bWVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChyZW1haW5BcnJheSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkID0gcmVtYWluQXJyYXkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCArPSBjb25zdW1lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCArPSBjb25zdW1lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkICsgY2h1bmsuYnl0ZUxlbmd0aCA+IHRoaXMuX2J1ZmZlclNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cGFuZEJ1ZmZlcih0aGlzLl9zdGFzaFVzZWQgKyBjaHVuay5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3Rhc2hBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoY2h1bmspLCB0aGlzLl9zdGFzaFVzZWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gc3Rhc2ggYnVmZmVyIGVtcHR5LCBidXQgY2h1bmtTaXplID4gc3Rhc2hTaXplIChvaCwgaG9seSBzaGl0KVxuICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBjaHVuayBkaXJlY3RseSBhbmQgc3Rhc2ggcmVtYWluIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN1bWVkID0gdGhpcy5fZGlzcGF0Y2hDaHVua3MoY2h1bmssIGJ5dGVTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCA8IGNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1haW4gPSBjaHVuay5ieXRlTGVuZ3RoIC0gY29uc3VtZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluID4gdGhpcy5fYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cGFuZEJ1ZmZlcihyZW1haW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChuZXcgVWludDhBcnJheShjaHVuaywgY29uc3VtZWQpLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCArPSByZW1haW47XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IGJ5dGVTdGFydCArIGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2ZsdXNoU3Rhc2hCdWZmZXIoZHJvcFVuY29uc3VtZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXNoVXNlZCA+IDApIHtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSB0aGlzLl9zdGFzaEJ1ZmZlci5zbGljZSgwLCB0aGlzLl9zdGFzaFVzZWQpO1xuICAgICAgICAgICAgbGV0IGNvbnN1bWVkID0gdGhpcy5fZGlzcGF0Y2hDaHVua3MoYnVmZmVyLCB0aGlzLl9zdGFzaEJ5dGVTdGFydCk7XG4gICAgICAgICAgICBsZXQgcmVtYWluID0gYnVmZmVyLmJ5dGVMZW5ndGggLSBjb25zdW1lZDtcblxuICAgICAgICAgICAgaWYgKGNvbnN1bWVkIDwgYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZHJvcFVuY29uc3VtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGAke3JlbWFpbn0gYnl0ZXMgdW5jb25zdW1lZCBkYXRhIHJlbWFpbiB3aGVuIGZsdXNoIGJ1ZmZlciwgZHJvcHBlZGApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFzaEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fc3Rhc2hCdWZmZXIsIDAsIHRoaXMuX2J1ZmZlclNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbWFpbkFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBjb25zdW1lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChyZW1haW5BcnJheSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSByZW1haW5BcnJheS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgKz0gY29uc3VtZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHJldHVybiByZW1haW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgX29uTG9hZGVyQ29tcGxldGUoZnJvbSwgdG8pIHtcbiAgICAgICAgLy8gRm9yY2UtZmx1c2ggc3Rhc2ggYnVmZmVyLCBhbmQgZHJvcCB1bmNvbnN1bWVkIGRhdGFcbiAgICAgICAgdGhpcy5fZmx1c2hTdGFzaEJ1ZmZlcih0cnVlKTtcblxuICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5fb25Db21wbGV0ZSh0aGlzLl9leHRyYURhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTG9hZGVyRXJyb3IodHlwZSwgZGF0YSkge1xuICAgICAgICBMb2cuZSh0aGlzLlRBRywgYExvYWRlciBlcnJvciwgY29kZSA9ICR7ZGF0YS5jb2RlfSwgbXNnID0gJHtkYXRhLm1zZ31gKTtcblxuICAgICAgICB0aGlzLl9mbHVzaFN0YXNoQnVmZmVyKGZhbHNlKTtcblxuICAgICAgICBpZiAodGhpcy5faXNFYXJseUVvZlJlY29ubmVjdGluZykge1xuICAgICAgICAgICAgLy8gQXV0by1yZWNvbm5lY3QgZm9yIEVhcmx5RW9mIGZhaWxlZCwgdGhyb3cgVW5yZWNvdmVyYWJsZUVhcmx5RW9mIGVycm9yIHRvIHVwcGVyLWxheWVyXG4gICAgICAgICAgICB0aGlzLl9pc0Vhcmx5RW9mUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLlVOUkVDT1ZFUkFCTEVfRUFSTFlfRU9GO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIExvYWRlckVycm9ycy5FQVJMWV9FT0Y6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc0xpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gaW50ZXJuYWwgaHR0cCByZWNvbm5lY3QgaWYgbm90IGxpdmUgc3RyZWFtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRGcm9tID0gdGhpcy5fY3VycmVudFJhbmdlLnRvICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RnJvbSA8IHRoaXMuX3RvdGFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdDb25uZWN0aW9uIGxvc3QsIHRyeWluZyByZWNvbm5lY3QuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0Vhcmx5RW9mUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFNlZWsobmV4dEZyb20sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlOiBXZSBkb24ndCBrbm93IHRvdGFsTGVuZ3RoLCB0aHJvdyBVbnJlY292ZXJhYmxlRWFybHlFb2ZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW06IHRocm93IFVucmVjb3ZlcmFibGVFYXJseUVvZiBlcnJvciB0byB1cHBlci1sYXllclxuICAgICAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuVU5SRUNPVkVSQUJMRV9FQVJMWV9FT0Y7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIExvYWRlckVycm9ycy5VTlJFQ09WRVJBQkxFX0VBUkxZX0VPRjpcbiAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLkNPTk5FQ1RJTkdfVElNRU9VVDpcbiAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRDpcbiAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLkVYQ0VQVElPTjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKHR5cGUsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0lPRXhjZXB0aW9uOiAnICsgZGF0YS5tc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IElPQ29udHJvbGxlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuZXhwb3J0IGNvbnN0IExvYWRlclN0YXR1cyA9IHtcbiAgICBrSWRsZTogMCxcbiAgICBrQ29ubmVjdGluZzogMSxcbiAgICBrQnVmZmVyaW5nOiAyLFxuICAgIGtFcnJvcjogMyxcbiAgICBrQ29tcGxldGU6IDRcbn07XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJFcnJvcnMgPSB7XG4gICAgT0s6ICdPSycsXG4gICAgRVhDRVBUSU9OOiAnRXhjZXB0aW9uJyxcbiAgICBIVFRQX1NUQVRVU19DT0RFX0lOVkFMSUQ6ICdIdHRwU3RhdHVzQ29kZUludmFsaWQnLFxuICAgIENPTk5FQ1RJTkdfVElNRU9VVDogJ0Nvbm5lY3RpbmdUaW1lb3V0JyxcbiAgICBFQVJMWV9FT0Y6ICdFYXJseUVvZicsXG4gICAgVU5SRUNPVkVSQUJMRV9FQVJMWV9FT0Y6ICdVbnJlY292ZXJhYmxlRWFybHlFb2YnXG59O1xuXG4vKiBMb2FkZXIgaGFzIGNhbGxiYWNrcyB3aGljaCBoYXZlIGZvbGxvd2luZyBwcm90b3R5cGVzOlxuICogICAgIGZ1bmN0aW9uIG9uQ29udGVudExlbmd0aEtub3duKGNvbnRlbnRMZW5ndGg6IG51bWJlcik6IHZvaWRcbiAqICAgICBmdW5jdGlvbiBvblVSTFJlZGlyZWN0KHVybDogc3RyaW5nKTogdm9pZFxuICogICAgIGZ1bmN0aW9uIG9uRGF0YUFycml2YWwoY2h1bms6IEFycmF5QnVmZmVyLCBieXRlU3RhcnQ6IG51bWJlciwgcmVjZWl2ZWRMZW5ndGg6IG51bWJlcik6IHZvaWRcbiAqICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yVHlwZTogbnVtYmVyLCBlcnJvckluZm86IHtjb2RlOiBudW1iZXIsIG1zZzogc3RyaW5nfSk6IHZvaWRcbiAqICAgICBmdW5jdGlvbiBvbkNvbXBsZXRlKHJhbmdlRnJvbTogbnVtYmVyLCByYW5nZVRvOiBudW1iZXIpOiB2b2lkXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlTG9hZGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGVOYW1lKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlTmFtZSB8fCAndW5kZWZpbmVkJztcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtJZGxlO1xuICAgICAgICB0aGlzLl9uZWVkU3Rhc2ggPSBmYWxzZTtcbiAgICAgICAgLy8gY2FsbGJhY2tzXG4gICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25VUkxSZWRpcmVjdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtJZGxlO1xuICAgICAgICB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93biA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uVVJMUmVkaXJlY3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uQ29tcGxldGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlzV29ya2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLmtDb25uZWN0aW5nIHx8IHRoaXMuX3N0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLmtCdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cblxuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gICAgfVxuXG4gICAgZ2V0IG5lZWRTdGFzaEJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25lZWRTdGFzaDtcbiAgICB9XG5cbiAgICBnZXQgb25Db250ZW50TGVuZ3RoS25vd24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bjtcbiAgICB9XG5cbiAgICBzZXQgb25Db250ZW50TGVuZ3RoS25vd24oY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24gPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25VUkxSZWRpcmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uVVJMUmVkaXJlY3Q7XG4gICAgfVxuXG4gICAgc2V0IG9uVVJMUmVkaXJlY3QoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25VUkxSZWRpcmVjdCA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvbkRhdGFBcnJpdmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25EYXRhQXJyaXZhbDtcbiAgICB9XG5cbiAgICBzZXQgb25EYXRhQXJyaXZhbChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkVycm9yO1xuICAgIH1cblxuICAgIHNldCBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25Db21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uQ29tcGxldGU7XG4gICAgfVxuXG4gICAgc2V0IG9uQ29tcGxldGUoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8vIHB1cmUgdmlydHVhbFxuICAgIG9wZW4oZGF0YVNvdXJjZSwgcmFuZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCdVbmltcGxlbWVudGVkIGFic3RyYWN0IGZ1bmN0aW9uIScpO1xuICAgIH1cblxuICAgIGFib3J0KCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oJ1VuaW1wbGVtZW50ZWQgYWJzdHJhY3QgZnVuY3Rpb24hJyk7XG4gICAgfVxuXG5cbn0iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY2xhc3MgUGFyYW1TZWVrSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbVN0YXJ0LCBwYXJhbUVuZCkge1xuICAgICAgICB0aGlzLl9zdGFydE5hbWUgPSBwYXJhbVN0YXJ0O1xuICAgICAgICB0aGlzLl9lbmROYW1lID0gcGFyYW1FbmQ7XG4gICAgfVxuXG4gICAgZ2V0Q29uZmlnKGJhc2VVcmwsIHJhbmdlKSB7XG4gICAgICAgIGxldCB1cmwgPSBiYXNlVXJsO1xuXG4gICAgICAgIGlmIChyYW5nZS5mcm9tICE9PSAwIHx8IHJhbmdlLnRvICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IG5lZWRBbmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9ICc/JztcbiAgICAgICAgICAgICAgICBuZWVkQW5kID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZWVkQW5kKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXJsICs9IGAke3RoaXMuX3N0YXJ0TmFtZX09JHtyYW5nZS5mcm9tLnRvU3RyaW5nKCl9YDtcblxuICAgICAgICAgICAgaWYgKHJhbmdlLnRvICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgJiR7dGhpcy5fZW5kTmFtZX09JHtyYW5nZS50by50b1N0cmluZygpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbW92ZVVSTFBhcmFtZXRlcnMoc2Vla2VkVVJMKSB7XG4gICAgICAgIGxldCBiYXNlVVJMID0gc2Vla2VkVVJMLnNwbGl0KCc/JylbMF07XG4gICAgICAgIGxldCBwYXJhbXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHF1ZXJ5SW5kZXggPSBzZWVrZWRVUkwuaW5kZXhPZignPycpO1xuICAgICAgICBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHNlZWtlZFVSTC5zdWJzdHJpbmcocXVlcnlJbmRleCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdFBhcmFtcyA9ICcnO1xuXG4gICAgICAgIGlmIChwYXJhbXMgIT0gdW5kZWZpbmVkICYmIHBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcGFpcnMgPSBwYXJhbXMuc3BsaXQoJyYnKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gcGFpcnNbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZUFuZCA9IChpID4gMCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFpclswXSAhPT0gdGhpcy5fc3RhcnROYW1lICYmIHBhaXJbMF0gIT09IHRoaXMuX2VuZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVBbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBhcmFtcyArPSAnJic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGFyYW1zICs9IHBhaXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzdWx0UGFyYW1zLmxlbmd0aCA9PT0gMCkgPyBiYXNlVVJMIDogYmFzZVVSTCArICc/JyArIHJlc3VsdFBhcmFtcztcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyYW1TZWVrSGFuZGxlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY2xhc3MgUmFuZ2VTZWVrSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih6ZXJvU3RhcnQpIHtcbiAgICAgICAgdGhpcy5femVyb1N0YXJ0ID0gemVyb1N0YXJ0IHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGdldENvbmZpZyh1cmwsIHJhbmdlKSB7XG4gICAgICAgIGxldCBoZWFkZXJzID0ge307XG5cbiAgICAgICAgaWYgKHJhbmdlLmZyb20gIT09IDAgfHwgcmFuZ2UudG8gIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcGFyYW07XG4gICAgICAgICAgICBpZiAocmFuZ2UudG8gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0gPSBgYnl0ZXM9JHtyYW5nZS5mcm9tLnRvU3RyaW5nKCl9LSR7cmFuZ2UudG8udG9TdHJpbmcoKX1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJhbSA9IGBieXRlcz0ke3JhbmdlLmZyb20udG9TdHJpbmcoKX0tYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNbJ1JhbmdlJ10gPSBwYXJhbTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl96ZXJvU3RhcnQpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1JhbmdlJ10gPSAnYnl0ZXM9MC0nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbW92ZVVSTFBhcmFtZXRlcnMoc2Vla2VkVVJMKSB7XG4gICAgICAgIHJldHVybiBzZWVrZWRVUkw7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhbmdlU2Vla0hhbmRsZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFV0aWxpdHkgY2xhc3MgdG8gY2FsY3VsYXRlIHJlYWx0aW1lIG5ldHdvcmsgSS9PIHNwZWVkXG5jbGFzcyBTcGVlZFNhbXBsZXIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIG1pbGxpc2Vjb25kc1xuICAgICAgICB0aGlzLl9maXJzdENoZWNrcG9pbnQgPSAwO1xuICAgICAgICB0aGlzLl9sYXN0Q2hlY2twb2ludCA9IDA7XG4gICAgICAgIHRoaXMuX2ludGVydmFsQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLl90b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgdGhpcy5fbGFzdFNlY29uZEJ5dGVzID0gMDtcblxuICAgICAgICAvLyBjb21wYXRpYmlsaXR5IGRldGVjdGlvblxuICAgICAgICBpZiAoc2VsZi5wZXJmb3JtYW5jZSAmJiBzZWxmLnBlcmZvcm1hbmNlLm5vdykge1xuICAgICAgICAgICAgdGhpcy5fbm93ID0gc2VsZi5wZXJmb3JtYW5jZS5ub3cuYmluZChzZWxmLnBlcmZvcm1hbmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX25vdyA9IERhdGUubm93O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2ZpcnN0Q2hlY2twb2ludCA9IHRoaXMuX2xhc3RDaGVja3BvaW50ID0gMDtcbiAgICAgICAgdGhpcy5fdG90YWxCeXRlcyA9IHRoaXMuX2ludGVydmFsQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLl9sYXN0U2Vjb25kQnl0ZXMgPSAwO1xuICAgIH1cblxuICAgIGFkZEJ5dGVzKGJ5dGVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9maXJzdENoZWNrcG9pbnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0Q2hlY2twb2ludCA9IHRoaXMuX25vdygpO1xuICAgICAgICAgICAgdGhpcy5fbGFzdENoZWNrcG9pbnQgPSB0aGlzLl9maXJzdENoZWNrcG9pbnQ7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxCeXRlcyArPSBieXRlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ub3coKSAtIHRoaXMuX2xhc3RDaGVja3BvaW50IDwgMTAwMCkge1xuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWxCeXRlcyArPSBieXRlcztcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgIH0gZWxzZSB7ICAvLyBkdXJhdGlvbiA+PSAxMDAwXG4gICAgICAgICAgICB0aGlzLl9sYXN0U2Vjb25kQnl0ZXMgPSB0aGlzLl9pbnRlcnZhbEJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWxCeXRlcyA9IGJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxCeXRlcyArPSBieXRlcztcbiAgICAgICAgICAgIHRoaXMuX2xhc3RDaGVja3BvaW50ID0gdGhpcy5fbm93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY3VycmVudEtCcHMoKSB7XG4gICAgICAgIHRoaXMuYWRkQnl0ZXMoMCk7XG5cbiAgICAgICAgbGV0IGR1cmF0aW9uU2Vjb25kcyA9ICh0aGlzLl9ub3coKSAtIHRoaXMuX2xhc3RDaGVja3BvaW50KSAvIDEwMDA7XG4gICAgICAgIGlmIChkdXJhdGlvblNlY29uZHMgPT0gMCkgZHVyYXRpb25TZWNvbmRzID0gMTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9pbnRlcnZhbEJ5dGVzIC8gZHVyYXRpb25TZWNvbmRzKSAvIDEwMjQ7XG4gICAgfVxuXG4gICAgZ2V0IGxhc3RTZWNvbmRLQnBzKCkge1xuICAgICAgICB0aGlzLmFkZEJ5dGVzKDApO1xuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0U2Vjb25kQnl0ZXMgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXN0U2Vjb25kQnl0ZXMgLyAxMDI0O1xuICAgICAgICB9IGVsc2UgeyAgLy8gbGFzdFNlY29uZEJ5dGVzID09PSAwXG4gICAgICAgICAgICBpZiAodGhpcy5fbm93KCkgLSB0aGlzLl9sYXN0Q2hlY2twb2ludCA+PSA1MDApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aW1lIGludGVydmFsIHNpbmNlIGxhc3QgY2hlY2twb2ludCBoYXMgZXhjZWVkZWQgNTAwbXNcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3BlZWQgaXMgbmVhcmx5IGFjY3VyYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEtCcHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3dcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBhdmVyYWdlS0JwcygpIHtcbiAgICAgICAgbGV0IGR1cmF0aW9uU2Vjb25kcyA9ICh0aGlzLl9ub3coKSAtIHRoaXMuX2ZpcnN0Q2hlY2twb2ludCkgLyAxMDAwO1xuICAgICAgICByZXR1cm4gKHRoaXMuX3RvdGFsQnl0ZXMgLyBkdXJhdGlvblNlY29uZHMpIC8gMTAyNDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3BlZWRTYW1wbGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge0Jhc2VMb2FkZXIsIExvYWRlclN0YXR1cywgTG9hZGVyRXJyb3JzfSBmcm9tICcuL2xvYWRlci5qcyc7XG5pbXBvcnQge1J1bnRpbWVFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIEZvciBGTFYgb3ZlciBXZWJTb2NrZXQgbGl2ZSBzdHJlYW1cbmNsYXNzIFdlYlNvY2tldExvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygc2VsZi5XZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd3ZWJzb2NrZXQtbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ1dlYlNvY2tldExvYWRlcic7XG5cbiAgICAgICAgdGhpcy5fbmVlZFN0YXNoID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl93cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIG9wZW4oZGF0YVNvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHdzID0gdGhpcy5fd3MgPSBuZXcgc2VsZi5XZWJTb2NrZXQoZGF0YVNvdXJjZS51cmwpO1xuICAgICAgICAgICAgd3MuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgICAgICB3cy5vbm9wZW4gPSB0aGlzLl9vbldlYlNvY2tldE9wZW4uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSB0aGlzLl9vbldlYlNvY2tldENsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB3cy5vbm1lc3NhZ2UgPSB0aGlzLl9vbldlYlNvY2tldE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHdzLm9uZXJyb3IgPSB0aGlzLl9vbldlYlNvY2tldEVycm9yLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29ubmVjdGluZztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcblxuICAgICAgICAgICAgbGV0IGluZm8gPSB7Y29kZTogZS5jb2RlLCBtc2c6IGUubWVzc2FnZX07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihMb2FkZXJFcnJvcnMuRVhDRVBUSU9OLCBpbmZvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW5mby5tc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGxldCB3cyA9IHRoaXMuX3dzO1xuICAgICAgICBpZiAod3MgJiYgKHdzLnJlYWR5U3RhdGUgPT09IDAgfHwgd3MucmVhZHlTdGF0ZSA9PT0gMSkpIHsgIC8vIENPTk5FQ1RJTkcgfHwgT1BFTlxuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl93cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG4gICAgfVxuXG4gICAgX29uV2ViU29ja2V0T3BlbihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIF9vbldlYlNvY2tldENsb3NlKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RBYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuXG4gICAgICAgIGlmICh0aGlzLl9vbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbXBsZXRlKDAsIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25XZWJTb2NrZXRNZXNzYWdlKGUpIHtcbiAgICAgICAgaWYgKGUuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEFycmF5QnVmZmVyKGUuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoQXJyYXlCdWZmZXIocmVhZGVyLnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGUuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgbGV0IGluZm8gPSB7Y29kZTogLTEsIG1zZzogJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBtZXNzYWdlIHR5cGU6ICcgKyBlLmRhdGEuY29uc3RydWN0b3IubmFtZX07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihMb2FkZXJFcnJvcnMuRVhDRVBUSU9OLCBpbmZvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW5mby5tc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2Rpc3BhdGNoQXJyYXlCdWZmZXIoYXJyYXlidWZmZXIpIHtcbiAgICAgICAgbGV0IGNodW5rID0gYXJyYXlidWZmZXI7XG4gICAgICAgIGxldCBieXRlU3RhcnQgPSB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5fb25EYXRhQXJyaXZhbCkge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25XZWJTb2NrZXRFcnJvcihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG5cbiAgICAgICAgbGV0IGluZm8gPSB7XG4gICAgICAgICAgICBjb2RlOiBlLmNvZGUsXG4gICAgICAgICAgICBtc2c6IGUubWVzc2FnZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKExvYWRlckVycm9ycy5FWENFUFRJT04sIGluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW5mby5tc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYlNvY2tldExvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtCYXNlTG9hZGVyLCBMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi9sb2FkZXIuanMnO1xuaW1wb3J0IHtSdW50aW1lRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG4vLyBGb3IgRmlyZUZveCBicm93c2VyIHdoaWNoIHN1cHBvcnRzIGB4aHIucmVzcG9uc2VUeXBlID0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJ2BcbmNsYXNzIE1vekNodW5rZWRMb2FkZXIgZXh0ZW5kcyBCYXNlTG9hZGVyIHtcblxuICAgIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggMzctIHJlcXVpcmVzIC5vcGVuKCkgdG8gYmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIHJlc3BvbnNlVHlwZVxuICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsICdodHRwczovL2V4YW1wbGUuY29tJywgdHJ1ZSk7XG4gICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJztcbiAgICAgICAgICAgIHJldHVybiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy53KCdNb3pDaHVua2VkTG9hZGVyJywgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHNlZWtIYW5kbGVyLCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIoJ3hoci1tb3otY2h1bmtlZC1sb2FkZXInKTtcbiAgICAgICAgdGhpcy5UQUcgPSAnTW96Q2h1bmtlZExvYWRlcic7XG5cbiAgICAgICAgdGhpcy5fc2Vla0hhbmRsZXIgPSBzZWVrSGFuZGxlcjtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLl9uZWVkU3Rhc2ggPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPSAwO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25sb2FkZW5kID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIG9wZW4oZGF0YVNvdXJjZSwgcmFuZ2UpIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgICAgIHRoaXMuX3JhbmdlID0gcmFuZ2U7XG5cbiAgICAgICAgbGV0IHNvdXJjZVVSTCA9IGRhdGFTb3VyY2UudXJsO1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnJldXNlUmVkaXJlY3RlZFVSTCAmJiBkYXRhU291cmNlLnJlZGlyZWN0ZWRVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzb3VyY2VVUkwgPSBkYXRhU291cmNlLnJlZGlyZWN0ZWRVUkw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2Vla0NvbmZpZyA9IHRoaXMuX3NlZWtIYW5kbGVyLmdldENvbmZpZyhzb3VyY2VVUkwsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFVSTCA9IHNlZWtDb25maWcudXJsO1xuXG4gICAgICAgIGxldCB4aHIgPSB0aGlzLl94aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHNlZWtDb25maWcudXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcic7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLl9vblJlYWR5U3RhdGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcyk7XG4gICAgICAgIHhoci5vbmxvYWRlbmQgPSB0aGlzLl9vbkxvYWRFbmQuYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSB0aGlzLl9vblhockVycm9yLmJpbmQodGhpcyk7XG5cbiAgICAgICAgLy8gY29ycyBpcyBhdXRvIGRldGVjdGVkIGFuZCBlbmFibGVkIGJ5IHhoclxuXG4gICAgICAgIC8vIHdpdGhDcmVkZW50aWFscyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0XG4gICAgICAgIGlmIChkYXRhU291cmNlLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNlZWtDb25maWcuaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gc2Vla0NvbmZpZy5oZWFkZXJzO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29ubmVjdGluZztcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICB9XG5cbiAgICBfb25SZWFkeVN0YXRlQ2hhbmdlKGUpIHtcbiAgICAgICAgbGV0IHhociA9IGUudGFyZ2V0O1xuXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMikgeyAgLy8gSEVBREVSU19SRUNFSVZFRFxuICAgICAgICAgICAgaWYgKHhoci5yZXNwb25zZVVSTCAhPSB1bmRlZmluZWQgJiYgeGhyLnJlc3BvbnNlVVJMICE9PSB0aGlzLl9yZXF1ZXN0VVJMKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uVVJMUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZGlyZWN0ZWRVUkwgPSB0aGlzLl9zZWVrSGFuZGxlci5yZW1vdmVVUkxQYXJhbWV0ZXJzKHhoci5yZXNwb25zZVVSTCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVVJMUmVkaXJlY3QocmVkaXJlY3RlZFVSTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMCAmJiAoeGhyLnN0YXR1cyA8IDIwMCB8fCB4aHIuc3RhdHVzID4gMjk5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihMb2FkZXJFcnJvcnMuSFRUUF9TVEFUVVNfQ09ERV9JTlZBTElELCB7Y29kZTogeGhyLnN0YXR1cywgbXNnOiB4aHIuc3RhdHVzVGV4dH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNb3pDaHVua2VkTG9hZGVyOiBIdHRwIGNvZGUgaW52YWxpZCwgJyArIHhoci5zdGF0dXMgKyAnICcgKyB4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblByb2dyZXNzKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLmtFcnJvcikge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIHJlc3BvbnNlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGUudG90YWwgIT09IG51bGwgJiYgZS50b3RhbCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBlLnRvdGFsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bih0aGlzLl9jb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2h1bmsgPSBlLnRhcmdldC5yZXNwb25zZTtcbiAgICAgICAgbGV0IGJ5dGVTdGFydCA9IHRoaXMuX3JhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5fb25EYXRhQXJyaXZhbCkge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Mb2FkRW5kKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RBYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdHVzID09PSBMb2FkZXJTdGF0dXMua0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5fb25Db21wbGV0ZSh0aGlzLl9yYW5nZS5mcm9tLCB0aGlzLl9yYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblhockVycm9yKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcbiAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICBsZXQgaW5mbyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggJiYgZS5sb2FkZWQgPCB0aGlzLl9jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgIGluZm8gPSB7Y29kZTogLTEsIG1zZzogJ01vei1DaHVua2VkIHN0cmVhbSBtZWV0IEVhcmx5LUVvZid9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FWENFUFRJT047XG4gICAgICAgICAgICBpbmZvID0ge2NvZGU6IC0xLCBtc2c6IGUuY29uc3RydWN0b3IubmFtZSArICcgJyArIGUudHlwZX07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlLCBpbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGluZm8ubXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNb3pDaHVua2VkTG9hZGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge0Jhc2VMb2FkZXIsIExvYWRlclN0YXR1cywgTG9hZGVyRXJyb3JzfSBmcm9tICcuL2xvYWRlci5qcyc7XG5pbXBvcnQge1J1bnRpbWVFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8qIE5vdGljZTogbXMtc3RyZWFtIG1heSBjYXVzZSBJRS9FZGdlIGJyb3dzZXIgY3Jhc2ggaWYgc2VlayB0b28gZnJlcXVlbnRseSEhIVxuICogVGhlIGJyb3dzZXIgbWF5IGNyYXNoIGluIHdpbmluZXQuZGxsLiBEaXNhYmxlIGZvciBub3cuXG4gKlxuICogRm9yIElFMTEvRWRnZSBicm93c2VyIGJ5IG1pY3Jvc29mdCB3aGljaCBzdXBwb3J0cyBgeGhyLnJlc3BvbnNlVHlwZSA9ICdtcy1zdHJlYW0nYFxuICogTm90aWNlIHRoYXQgbXMtc3RyZWFtIEFQSSBzdWNrcy4gVGhlIGJ1ZmZlciBpcyBhbHdheXMgZXhwYW5kaW5nIGFsb25nIHdpdGggZG93bmxvYWRpbmcuXG4gKlxuICogV2UgbmVlZCB0byBhYm9ydCB0aGUgeGhyIGlmIGJ1ZmZlciBzaXplIGV4Y2VlZGVkIGxpbWl0IHNpemUgKGUuZy4gMTYgTWlCKSwgdGhlbiBkbyByZWNvbm5lY3QuXG4gKiBpbiBvcmRlciB0byByZWxlYXNlIHByZXZpb3VzIEFycmF5QnVmZmVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gKlxuICogT3RoZXJ3aXNlLCB0aGUgQXJyYXlCdWZmZXIgd2lsbCBpbmNyZWFzZSB0byBhIHRlcnJpYmxlIHNpemUgdGhhdCBlcXVhbHMgZmluYWwgZmlsZSBzaXplLlxuICovXG5jbGFzcyBNU1N0cmVhbUxvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLk1TU3RyZWFtID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygc2VsZi5NU1N0cmVhbVJlYWRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScsIHRydWUpO1xuICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdtcy1zdHJlYW0nO1xuICAgICAgICAgICAgcmV0dXJuICh4aHIucmVzcG9uc2VUeXBlID09PSAnbXMtc3RyZWFtJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy53KCdNU1N0cmVhbUxvYWRlcicsIGUubWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihzZWVrSGFuZGxlciwgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCd4aHItbXNzdHJlYW0tbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ01TU3RyZWFtTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDsgIC8vIE1TU3RyZWFtUmVhZGVyXG5cbiAgICAgICAgdGhpcy5fdG90YWxSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RVUkwgPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkTGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLl9idWZmZXJMaW1pdCA9IDE2ICogMTAyNCAqIDEwMjQ7ICAvLyAxNk1CXG4gICAgICAgIHRoaXMuX2xhc3RUaW1lQnVmZmVyU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX2lzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBvcGVuKGRhdGFTb3VyY2UsIHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsT3BlbihkYXRhU291cmNlLCByYW5nZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIF9pbnRlcm5hbE9wZW4oZGF0YVNvdXJjZSwgcmFuZ2UsIGlzU3VicmFuZ2UpIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG5cbiAgICAgICAgaWYgKCFpc1N1YnJhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl90b3RhbFJhbmdlID0gcmFuZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UgPSByYW5nZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3VyY2VVUkwgPSBkYXRhU291cmNlLnVybDtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5yZXVzZVJlZGlyZWN0ZWRVUkwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVNvdXJjZS5yZWRpcmVjdGVkVVJMICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVVSTCA9IGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWVrQ29uZmlnID0gdGhpcy5fc2Vla0hhbmRsZXIuZ2V0Q29uZmlnKHNvdXJjZVVSTCwgcmFuZ2UpO1xuICAgICAgICB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCA9IHNlZWtDb25maWcudXJsO1xuXG4gICAgICAgIGxldCByZWFkZXIgPSB0aGlzLl9yZWFkZXIgPSBuZXcgc2VsZi5NU1N0cmVhbVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25wcm9ncmVzcyA9IHRoaXMuX21zck9uUHJvZ3Jlc3MuYmluZCh0aGlzKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRoaXMuX21zck9uTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICByZWFkZXIub25lcnJvciA9IHRoaXMuX21zck9uRXJyb3IuYmluZCh0aGlzKTtcblxuICAgICAgICBsZXQgeGhyID0gdGhpcy5feGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCBzZWVrQ29uZmlnLnVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnbXMtc3RyZWFtJztcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMuX3hock9uUmVhZHlTdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25lcnJvciA9IHRoaXMuX3hock9uRXJyb3IuYmluZCh0aGlzKTtcblxuICAgICAgICBpZiAoZGF0YVNvdXJjZS53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzZWVrQ29uZmlnLmhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHNlZWtDb25maWcuaGVhZGVycztcblxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNSZWNvbm5lY3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Nvbm5lY3Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuICAgIH1cblxuICAgIF9pbnRlcm5hbEFib3J0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVhZGVyLnJlYWR5U3RhdGUgPT09IDEpIHsgIC8vIExPQURJTkdcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5vbnByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5feGhyKSB7XG4gICAgICAgICAgICB0aGlzLl94aHIuYWJvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF94aHJPblJlYWR5U3RhdGVDaGFuZ2UoZSkge1xuICAgICAgICBsZXQgeGhyID0gZS50YXJnZXQ7XG5cbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7ICAvLyBIRUFERVJTX1JFQ0VJVkVEXG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8PSAyOTkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcblxuICAgICAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdGVkVVJMID0gdGhpcy5fc2Vla0hhbmRsZXIucmVtb3ZlVVJMUGFyYW1ldGVycyh4aHIucmVzcG9uc2VVUkwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICE9PSB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCAmJiByZWRpcmVjdGVkVVJMICE9PSB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgPSByZWRpcmVjdGVkVVJMO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uVVJMUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aEhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1MZW5ndGgnKTtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoSGVhZGVyICE9IG51bGwgJiYgdGhpcy5fY29udGVudExlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZW5ndGggPSBwYXJzZUludChsZW5ndGhIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duKHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRCwge2NvZGU6IHhoci5zdGF0dXMsIG1zZzogeGhyLnN0YXR1c1RleHR9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTVNTdHJlYW1Mb2FkZXI6IEh0dHAgY29kZSBpbnZhbGlkLCAnICsgeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDMpIHsgIC8vIExPQURJTkdcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDw9IDI5OSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQnVmZmVyaW5nO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1zc3RyZWFtID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihtc3N0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfeGhyT25FcnJvcihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgIGxldCB0eXBlID0gTG9hZGVyRXJyb3JzLkVYQ0VQVElPTjtcbiAgICAgICAgbGV0IGluZm8gPSB7Y29kZTogLTEsIG1zZzogZS5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgZS50eXBlfTtcblxuICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlLCBpbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGluZm8ubXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9tc3JPblByb2dyZXNzKGUpIHtcbiAgICAgICAgbGV0IHJlYWRlciA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgYmlnYnVmZmVyID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgaWYgKGJpZ2J1ZmZlciA9PSBudWxsKSB7ICAvLyByZXN1bHQgbWF5IGJlIG51bGwsIHdvcmthcm91bmQgZm9yIGJ1Z2d5IE0kXG4gICAgICAgICAgICB0aGlzLl9kb1JlY29ubmVjdElmTmVlZGVkKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2xpY2UgPSBiaWdidWZmZXIuc2xpY2UodGhpcy5fbGFzdFRpbWVCdWZmZXJTaXplKTtcbiAgICAgICAgdGhpcy5fbGFzdFRpbWVCdWZmZXJTaXplID0gYmlnYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIGxldCBieXRlU3RhcnQgPSB0aGlzLl90b3RhbFJhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggKz0gc2xpY2UuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5fb25EYXRhQXJyaXZhbCkge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChzbGljZSwgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmlnYnVmZmVyLmJ5dGVMZW5ndGggPj0gdGhpcy5fYnVmZmVyTGltaXQpIHtcbiAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCBgTVNTdHJlYW0gYnVmZmVyIGV4Y2VlZGVkIG1heCBzaXplIG5lYXIgJHtieXRlU3RhcnQgKyBzbGljZS5ieXRlTGVuZ3RofSwgcmVjb25uZWN0aW5nLi4uYCk7XG4gICAgICAgICAgICB0aGlzLl9kb1JlY29ubmVjdElmTmVlZGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZG9SZWNvbm5lY3RJZk5lZWRlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggPT0gbnVsbCB8fCB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RUaW1lQnVmZmVyU2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFib3J0KCk7XG5cbiAgICAgICAgICAgIGxldCByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLl90b3RhbFJhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aCxcbiAgICAgICAgICAgICAgICB0bzogLTFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbE9wZW4odGhpcy5fZGF0YVNvdXJjZSwgcmFuZ2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX21zck9uTG9hZChlKSB7ICAvLyBhY3R1YWxseSBpdCBpcyBvbkNvbXBsZXRlIGV2ZW50XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG4gICAgICAgIGlmICh0aGlzLl9vbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbXBsZXRlKHRoaXMuX3RvdGFsUmFuZ2UuZnJvbSwgdGhpcy5fdG90YWxSYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9tc3JPbkVycm9yKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcbiAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICBsZXQgaW5mbyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggJiYgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPCB0aGlzLl9jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgIGluZm8gPSB7Y29kZTogLTEsIG1zZzogJ01TU3RyZWFtIG1lZXQgRWFybHktRW9mJ307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgIGluZm8gPSB7Y29kZTogLTEsIG1zZzogZS5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgZS50eXBlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKHR5cGUsIGluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW5mby5tc2cpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNU1N0cmVhbUxvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IFNwZWVkU2FtcGxlciBmcm9tICcuL3NwZWVkLXNhbXBsZXIuanMnO1xuaW1wb3J0IHtCYXNlTG9hZGVyLCBMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi9sb2FkZXIuanMnO1xuaW1wb3J0IHtSdW50aW1lRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG4vLyBVbml2ZXJzYWwgSU8gTG9hZGVyLCBpbXBsZW1lbnRlZCBieSBhZGRpbmcgUmFuZ2UgaGVhZGVyIGluIHhocidzIHJlcXVlc3QgaGVhZGVyXG5jbGFzcyBSYW5nZUxvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsICdodHRwczovL2V4YW1wbGUuY29tJywgdHJ1ZSk7XG4gICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgICAgIHJldHVybiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gJ2FycmF5YnVmZmVyJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy53KCdSYW5nZUxvYWRlcicsIGUubWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihzZWVrSGFuZGxlciwgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCd4aHItcmFuZ2UtbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ1JhbmdlTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NodW5rU2l6ZUtCTGlzdCA9IFtcbiAgICAgICAgICAgIDEyOCwgMjU2LCAzODQsIDUxMiwgNzY4LCAxMDI0LCAxNTM2LCAyMDQ4LCAzMDcyLCA0MDk2LCA1MTIwLCA2MTQ0LCA3MTY4LCA4MTkyXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX2N1cnJlbnRDaHVua1NpemVLQiA9IDM4NDtcbiAgICAgICAgdGhpcy5fY3VycmVudFNwZWVkTm9ybWFsaXplZCA9IDA7XG4gICAgICAgIHRoaXMuX3plcm9TcGVlZENodW5rQ291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NwZWVkU2FtcGxlciA9IG5ldyBTcGVlZFNhbXBsZXIoKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoUmVjZWl2ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSZWRpcmVjdGVkVVJMID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gbnVsbDsgIC8vIHNpemUgb2YgdGhlIGVudGlyZSBmaWxlXG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOyAgLy8gQ29udGVudC1MZW5ndGggb2YgZW50aXJlIHJlcXVlc3QgcmFuZ2VcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPSAwOyAgLy8gdG90YWwgcmVjZWl2ZWQgYnl0ZXNcbiAgICAgICAgdGhpcy5fbGFzdFRpbWVMb2FkZWQgPSAwOyAgLy8gcmVjZWl2ZWQgYnl0ZXMgb2YgY3VycmVudCByZXF1ZXN0IHN1Yi1yYW5nZVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50U3BlZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVlZFNhbXBsZXIubGFzdFNlY29uZEtCcHM7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSByYW5nZTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb25uZWN0aW5nO1xuXG4gICAgICAgIGxldCB1c2VSZWZUb3RhbExlbmd0aCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fZGF0YVNvdXJjZS5maWxlc2l6ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5fZGF0YVNvdXJjZS5maWxlc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgdXNlUmVmVG90YWxMZW5ndGggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggPSB0aGlzLl9kYXRhU291cmNlLmZpbGVzaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl90b3RhbExlbmd0aFJlY2VpdmVkICYmICF1c2VSZWZUb3RhbExlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0b3RhbCBmaWxlc2l6ZVxuICAgICAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsT3Blbih0aGlzLl9kYXRhU291cmNlLCB7ZnJvbTogMCwgdG86IC0xfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGZpbGVzaXplLCBzdGFydCBsb2FkaW5nXG4gICAgICAgICAgICB0aGlzLl9vcGVuU3ViUmFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vcGVuU3ViUmFuZ2UoKSB7XG4gICAgICAgIGxldCBjaHVua1NpemUgPSB0aGlzLl9jdXJyZW50Q2h1bmtTaXplS0IgKiAxMDI0O1xuXG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX3JlY2VpdmVkTGVuZ3RoO1xuICAgICAgICBsZXQgdG8gPSBmcm9tICsgY2h1bmtTaXplO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0byAtIHRoaXMuX3JhbmdlLmZyb20gPj0gdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRvID0gdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX2NvbnRlbnRMZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RSYW5nZSA9IHtmcm9tLCB0b307XG4gICAgICAgIHRoaXMuX2ludGVybmFsT3Blbih0aGlzLl9kYXRhU291cmNlLCB0aGlzLl9jdXJyZW50UmVxdWVzdFJhbmdlKTtcbiAgICB9XG5cbiAgICBfaW50ZXJuYWxPcGVuKGRhdGFTb3VyY2UsIHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2xhc3RUaW1lTG9hZGVkID0gMDtcblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlVVJMID0gdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBkYXRhU291cmNlLnJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2Vla0NvbmZpZyA9IHRoaXMuX3NlZWtIYW5kbGVyLmdldENvbmZpZyhzb3VyY2VVUkwsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RVUkwgPSBzZWVrQ29uZmlnLnVybDtcblxuICAgICAgICBsZXQgeGhyID0gdGhpcy5feGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCBzZWVrQ29uZmlnLnVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5fb25SZWFkeVN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25sb2FkID0gdGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHhoci5vbmVycm9yID0gdGhpcy5fb25YaHJFcnJvci5iaW5kKHRoaXMpO1xuXG4gICAgICAgIGlmIChkYXRhU291cmNlLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNlZWtDb25maWcuaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gc2Vla0NvbmZpZy5oZWFkZXJzO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2ludGVybmFsQWJvcnQoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICB9XG5cbiAgICBfaW50ZXJuYWxBYm9ydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblJlYWR5U3RhdGVDaGFuZ2UoZSkge1xuICAgICAgICBsZXQgeGhyID0gZS50YXJnZXQ7XG5cbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7ICAvLyBIRUFERVJTX1JFQ0VJVkVEXG4gICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICE9IHVuZGVmaW5lZCkgeyAgLy8gaWYgdGhlIGJyb3dzZXIgc3VwcG9ydCB0aGlzIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgbGV0IHJlZGlyZWN0ZWRVUkwgPSB0aGlzLl9zZWVrSGFuZGxlci5yZW1vdmVVUkxQYXJhbWV0ZXJzKHhoci5yZXNwb25zZVVSTCk7XG4gICAgICAgICAgICAgICAgaWYgKHhoci5yZXNwb25zZVVSTCAhPT0gdGhpcy5fY3VycmVudFJlcXVlc3RVUkwgJiYgcmVkaXJlY3RlZFVSTCAhPT0gdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgPSByZWRpcmVjdGVkVVJMO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25VUkxSZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25VUkxSZWRpcmVjdChyZWRpcmVjdGVkVVJMKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDw9IDI5OSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtCdWZmZXJpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihMb2FkZXJFcnJvcnMuSFRUUF9TVEFUVVNfQ09ERV9JTlZBTElELCB7Y29kZTogeGhyLnN0YXR1cywgbXNnOiB4aHIuc3RhdHVzVGV4dH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdSYW5nZUxvYWRlcjogSHR0cCBjb2RlIGludmFsaWQsICcgKyB4aHIuc3RhdHVzICsgJyAnICsgeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblByb2dyZXNzKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLmtFcnJvcikge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIHJlc3BvbnNlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9wZW5OZXh0UmFuZ2UgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3dhaXRGb3JUb3RhbExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhaXRGb3JUb3RhbExlbmd0aCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoUmVjZWl2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9wZW5OZXh0UmFuZ2UgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gZS50b3RhbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFib3J0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsICE9IG51bGwgJiB0b3RhbCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCA9IHRvdGFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGN1cnJyZW50IHJlcXVlc3QgcmFuZ2UncyBjb250ZW50TGVuZ3RoXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2UudG8gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHRoaXMuX3RvdGFsTGVuZ3RoIC0gdGhpcy5fcmFuZ2UuZnJvbTtcbiAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB0byAhPT0gLTFcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gdGhpcy5fcmFuZ2UudG8gLSB0aGlzLl9yYW5nZS5mcm9tICsgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wZW5OZXh0UmFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuU3ViUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bih0aGlzLl9jb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWx0YSA9IGUubG9hZGVkIC0gdGhpcy5fbGFzdFRpbWVMb2FkZWQ7XG4gICAgICAgIHRoaXMuX2xhc3RUaW1lTG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgICAgIHRoaXMuX3NwZWVkU2FtcGxlci5hZGRCeXRlcyhkZWx0YSk7XG4gICAgfVxuXG4gICAgX25vcm1hbGl6ZVNwZWVkKGlucHV0KSB7XG4gICAgICAgIGxldCBsaXN0ID0gdGhpcy5fY2h1bmtTaXplS0JMaXN0O1xuICAgICAgICBsZXQgbGFzdCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG1pZCA9IDA7XG4gICAgICAgIGxldCBsYm91bmQgPSAwO1xuICAgICAgICBsZXQgdWJvdW5kID0gbGFzdDtcblxuICAgICAgICBpZiAoaW5wdXQgPCBsaXN0WzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdFswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChsYm91bmQgPD0gdWJvdW5kKSB7XG4gICAgICAgICAgICBtaWQgPSBsYm91bmQgKyBNYXRoLmZsb29yKCh1Ym91bmQgLSBsYm91bmQpIC8gMik7XG4gICAgICAgICAgICBpZiAobWlkID09PSBsYXN0IHx8IChpbnB1dCA+PSBsaXN0W21pZF0gJiYgaW5wdXQgPCBsaXN0W21pZCArIDFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaXN0W21pZF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RbbWlkXSA8IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgbGJvdW5kID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdWJvdW5kID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkxvYWQoZSkge1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzID09PSBMb2FkZXJTdGF0dXMua0Vycm9yKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93YWl0Rm9yVG90YWxMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhaXRGb3JUb3RhbExlbmd0aCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdFRpbWVMb2FkZWQgPSAwO1xuICAgICAgICBsZXQgS0JwcyA9IHRoaXMuX3NwZWVkU2FtcGxlci5sYXN0U2Vjb25kS0JwcztcbiAgICAgICAgaWYgKEtCcHMgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3plcm9TcGVlZENodW5rQ291bnQrKztcbiAgICAgICAgICAgIGlmICh0aGlzLl96ZXJvU3BlZWRDaHVua0NvdW50ID49IDMpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgZ2V0IGN1cnJlbnRLQnBzIGFmdGVyIDMgY2h1bmtzXG4gICAgICAgICAgICAgICAgS0JwcyA9IHRoaXMuX3NwZWVkU2FtcGxlci5jdXJyZW50S0JwcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChLQnBzICE9PSAwKSB7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMuX25vcm1hbGl6ZVNwZWVkKEtCcHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTcGVlZE5vcm1hbGl6ZWQgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50U3BlZWROb3JtYWxpemVkID0gbm9ybWFsaXplZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50Q2h1bmtTaXplS0IgPSBub3JtYWxpemVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNodW5rID0gZS50YXJnZXQucmVzcG9uc2U7XG4gICAgICAgIGxldCBieXRlU3RhcnQgPSB0aGlzLl9yYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGg7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgICAgICAgbGV0IHJlcG9ydENvbXBsZXRlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIGxvYWQgbmV4dCBjaHVua1xuICAgICAgICAgICAgdGhpcy5fb3BlblN1YlJhbmdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXBvcnRDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXNwYXRjaCByZWNlaXZlZCBjaHVua1xuICAgICAgICBpZiAodGhpcy5fb25EYXRhQXJyaXZhbCkge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVwb3J0Q29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGUodGhpcy5fcmFuZ2UuZnJvbSwgdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25YaHJFcnJvcihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgIGxldCB0eXBlID0gMDtcbiAgICAgICAgbGV0IGluZm8gPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICYmIHRoaXMuX3JlY2VpdmVkTGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuRUFSTFlfRU9GO1xuICAgICAgICAgICAgaW5mbyA9IHtjb2RlOiAtMSwgbXNnOiAnUmFuZ2VMb2FkZXIgbWVldCBFYXJseS1Fb2YnfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuRVhDRVBUSU9OO1xuICAgICAgICAgICAgaW5mbyA9IHtjb2RlOiAtMSwgbXNnOiBlLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBlLnR5cGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IodHlwZSwgaW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFuZ2VMb2FkZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBCcm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IFBsYXllckV2ZW50cyBmcm9tICcuL3BsYXllci1ldmVudHMuanMnO1xuaW1wb3J0IFRyYW5zbXV4ZXIgZnJvbSAnLi4vY29yZS90cmFuc211eGVyLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0V2ZW50cyBmcm9tICcuLi9jb3JlL3RyYW5zbXV4aW5nLWV2ZW50cy5qcyc7XG5pbXBvcnQgTVNFQ29udHJvbGxlciBmcm9tICcuLi9jb3JlL21zZS1jb250cm9sbGVyLmpzJztcbmltcG9ydCBNU0VFdmVudHMgZnJvbSAnLi4vY29yZS9tc2UtZXZlbnRzLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlcywgRXJyb3JEZXRhaWxzfSBmcm9tICcuL3BsYXllci1lcnJvcnMuanMnO1xuaW1wb3J0IHtjcmVhdGVEZWZhdWx0Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuY2xhc3MgRmx2UGxheWVyIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lZGlhRGF0YVNvdXJjZSwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ0ZsdlBsYXllcic7XG4gICAgICAgIHRoaXMuX3R5cGUgPSAnRmx2UGxheWVyJztcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgICAgICB0aGlzLl9jb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVkaWFEYXRhU291cmNlLnR5cGUudG9Mb3dlckNhc2UoKSAhPT0gJ2ZsdicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ZsdlBsYXllciByZXF1aXJlcyBhbiBmbHYgTWVkaWFEYXRhU291cmNlIGlucHV0IScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lZGlhRGF0YVNvdXJjZS5pc0xpdmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5pc0xpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lID0ge1xuICAgICAgICAgICAgb252TG9hZGVkTWV0YWRhdGE6IHRoaXMuX29udkxvYWRlZE1ldGFkYXRhLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbnZTZWVraW5nOiB0aGlzLl9vbnZTZWVraW5nLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbnZDYW5QbGF5OiB0aGlzLl9vbnZDYW5QbGF5LmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbnZTdGFsbGVkOiB0aGlzLl9vbnZTdGFsbGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbnZQcm9ncmVzczogdGhpcy5fb252UHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzZWxmLnBlcmZvcm1hbmNlICYmIHNlbGYucGVyZm9ybWFuY2Uubm93KSB7XG4gICAgICAgICAgICB0aGlzLl9ub3cgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdy5iaW5kKHNlbGYucGVyZm9ybWFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbm93ID0gRGF0ZS5ub3c7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsOyAgLy8gaW4gc2Vjb25kc1xuICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWVrcG9pbnRSZWNvcmQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX21lZGlhRGF0YVNvdXJjZSA9IG1lZGlhRGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbXNlY3RsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fbXNlU291cmNlT3BlbmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhc1BlbmRpbmdMb2FkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkQ2FuUGxheSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX21lZGlhSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NJbmZvID0gbnVsbDtcblxuICAgICAgICBsZXQgY2hyb21lTmVlZElEUkZpeCA9IChCcm93c2VyLmNocm9tZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCcm93c2VyLnZlcnNpb24ubWFqb3IgPCA1MCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCcm93c2VyLnZlcnNpb24ubWFqb3IgPT09IDUwICYmIEJyb3dzZXIudmVyc2lvbi5idWlsZCA8IDI2NjEpKSk7XG4gICAgICAgIHRoaXMuX2Fsd2F5c1NlZWtLZXlmcmFtZSA9IChjaHJvbWVOZWVkSURSRml4IHx8IEJyb3dzZXIubXNlZGdlIHx8IEJyb3dzZXIubXNpZSkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX2Fsd2F5c1NlZWtLZXlmcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnLmFjY3VyYXRlU2VlayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb2dyZXNzQ2hlY2tlciAhPSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9wcm9ncmVzc0NoZWNrZXIpO1xuICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NDaGVja2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdHJhbnNtdXhlcikge1xuICAgICAgICAgICAgdGhpcy51bmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaE1lZGlhRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21lZGlhRGF0YVNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChldmVudCA9PT0gUGxheWVyRXZlbnRzLk1FRElBX0lORk8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYUluZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLk1FRElBX0lORk8sIHRoaXMubWVkaWFJbmZvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gUGxheWVyRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NJbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5TVEFUSVNUSUNTX0lORk8sIHRoaXMuc3RhdGlzdGljc0luZm8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuYWRkTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBhdHRhY2hNZWRpYUVsZW1lbnQobWVkaWFFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudDtcbiAgICAgICAgbWVkaWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5lLm9udkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgbWVkaWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlZWtpbmcnLCB0aGlzLmUub252U2Vla2luZyk7XG4gICAgICAgIG1lZGlhRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgdGhpcy5lLm9udkNhblBsYXkpO1xuICAgICAgICBtZWRpYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc3RhbGxlZCcsIHRoaXMuZS5vbnZTdGFsbGVkKTtcbiAgICAgICAgbWVkaWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5lLm9udlByb2dyZXNzKTtcblxuICAgICAgICB0aGlzLl9tc2VjdGwgPSBuZXcgTVNFQ29udHJvbGxlcih0aGlzLl9jb25maWcpO1xuXG4gICAgICAgIHRoaXMuX21zZWN0bC5vbihNU0VFdmVudHMuVVBEQVRFX0VORCwgdGhpcy5fb25tc2VVcGRhdGVFbmQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX21zZWN0bC5vbihNU0VFdmVudHMuQlVGRkVSX0ZVTEwsIHRoaXMuX29ubXNlQnVmZmVyRnVsbC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fbXNlY3RsLm9uKE1TRUV2ZW50cy5TT1VSQ0VfT1BFTiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNlU291cmNlT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oYXNQZW5kaW5nTG9hZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1BlbmRpbmdMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9tc2VjdGwub24oTVNFRXZlbnRzLkVSUk9SLCAoaW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclR5cGVzLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yRGV0YWlscy5NRURJQV9NU0VfRVJST1IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fbXNlY3RsLmF0dGFjaE1lZGlhRWxlbWVudChtZWRpYUVsZW1lbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nU2Vla1RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSB0aGlzLl9wZW5kaW5nU2Vla1RpbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTExIG1heSB0aHJvdyBJbnZhbGlkU3RhdGVFcnJvciBpZiByZWFkeVN0YXRlID09PSAwXG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuIGRlZmVyIHNldCBjdXJyZW50VGltZSBvcGVyYXRpb24gYWZ0ZXIgbG9hZGVkbWV0YWRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGFjaE1lZGlhRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLmRldGFjaE1lZGlhRWxlbWVudCgpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5lLm9udkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWVraW5nJywgdGhpcy5lLm9udlNlZWtpbmcpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLmUub252Q2FuUGxheSk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhbGxlZCcsIHRoaXMuZS5vbnZTdGFsbGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMuZS5vbnZQcm9ncmVzcyk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tc2VjdGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21zZWN0bC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0hUTUxNZWRpYUVsZW1lbnQgbXVzdCBiZSBhdHRhY2hlZCBiZWZvcmUgbG9hZCgpIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFuc211eGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdGbHZQbGF5ZXIubG9hZCgpIGhhcyBiZWVuIGNhbGxlZCwgcGxlYXNlIGNhbGwgdW5sb2FkKCkgZmlyc3QhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hhc1BlbmRpbmdMb2FkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmRlZmVyTG9hZEFmdGVyU291cmNlT3BlbiAmJiB0aGlzLl9tc2VTb3VyY2VPcGVuZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNQZW5kaW5nTG9hZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50LnJlYWR5U3RhdGUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBJRTExIG1heSB0aHJvdyBJbnZhbGlkU3RhdGVFcnJvciBpZiByZWFkeVN0YXRlID09PSAwXG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlciA9IG5ldyBUcmFuc211eGVyKHRoaXMuX21lZGlhRGF0YVNvdXJjZSwgdGhpcy5fY29uZmlnKTtcblxuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLklOSVRfU0VHTUVOVCwgKHR5cGUsIGlzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwuYXBwZW5kSW5pdFNlZ21lbnQoaXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5ULCAodHlwZSwgbXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21zZWN0bC5hcHBlbmRNZWRpYVNlZ21lbnQobXMpO1xuXG4gICAgICAgICAgICAvLyBsYXp5TG9hZCBjaGVja1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5sYXp5TG9hZCAmJiAhdGhpcy5fY29uZmlnLmlzTGl2ZSkge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZTtcbiAgICAgICAgICAgICAgICBpZiAobXMuaW5mby5lbmREdHMgPj0gKGN1cnJlbnRUaW1lICsgdGhpcy5fY29uZmlnLmxhenlMb2FkTWF4RHVyYXRpb24pICogMTAwMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCAnTWF4aW11bSBidWZmZXJpbmcgZHVyYXRpb24gZXhjZWVkZWQsIHN1c3BlbmQgdHJhbnNtdXhpbmcgdGFzaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3VzcGVuZFRyYW5zbXV4ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIub24oVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLmVuZE9mU3RyZWFtKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLkxPQURJTkdfQ09NUExFVEUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5SRUNPVkVSRURfRUFSTFlfRU9GLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0YpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5JT19FUlJPUiwgKGRldGFpbCwgaW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5FUlJPUiwgRXJyb3JUeXBlcy5ORVRXT1JLX0VSUk9SLCBkZXRhaWwsIGluZm8pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUiwgKGRldGFpbCwgaW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5FUlJPUiwgRXJyb3JUeXBlcy5NRURJQV9FUlJPUiwgZGV0YWlsLCB7Y29kZTogLTEsIG1zZzogaW5mb30pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9JTkZPLCAobWVkaWFJbmZvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8gPSBtZWRpYUluZm87XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLk1FRElBX0lORk8sIE9iamVjdC5hc3NpZ24oe30sIG1lZGlhSW5mbykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5TVEFUSVNUSUNTX0lORk8sIChzdGF0SW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0luZm8gPSB0aGlzLl9maWxsU3RhdGlzdGljc0luZm8oc3RhdEluZm8pO1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5TVEFUSVNUSUNTX0lORk8sIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3N0YXRpc3RpY3NJbmZvKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09NTUVORF9TRUVLUE9JTlQsIChtaWxsaXNlY29uZHMpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQgJiYgIXRoaXMuX2NvbmZpZy5hY2N1cmF0ZVNlZWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vcGVuKCk7XG4gICAgfVxuXG4gICAgdW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbXNlY3RsKSB7XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwuc2VlaygwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdHJhbnNtdXhlcikge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc211eGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQucGxheSgpO1xuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucGF1c2UoKTtcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgZ2V0IGJ1ZmZlcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LmJ1ZmZlcmVkO1xuICAgIH1cblxuICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5kdXJhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LnZvbHVtZTtcbiAgICB9XG5cbiAgICBzZXQgdm9sdW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC52b2x1bWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgbXV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQubXV0ZWQ7XG4gICAgfVxuXG4gICAgc2V0IG11dGVkKG11dGVkKSB7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5tdXRlZCA9IG11dGVkO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBzZXQgY3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFNlZWsoc2Vjb25kcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBzZWNvbmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1lZGlhSW5mbygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX21lZGlhSW5mbyk7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXRpc3RpY3NJbmZvKCkge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0luZm8gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0aXN0aWNzSW5mbyA9IHRoaXMuX2ZpbGxTdGF0aXN0aWNzSW5mbyh0aGlzLl9zdGF0aXN0aWNzSW5mbyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zdGF0aXN0aWNzSW5mbyk7XG4gICAgfVxuXG4gICAgX2ZpbGxTdGF0aXN0aWNzSW5mbyhzdGF0SW5mbykge1xuICAgICAgICBzdGF0SW5mby5wbGF5ZXJUeXBlID0gdGhpcy5fdHlwZTtcblxuICAgICAgICBpZiAoISh0aGlzLl9tZWRpYUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRJbmZvO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc1F1YWxpdHlJbmZvID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlY29kZWQgPSAwO1xuICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSkge1xuICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSB0aGlzLl9tZWRpYUVsZW1lbnQuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTtcbiAgICAgICAgICAgIGRlY29kZWQgPSBxdWFsaXR5LnRvdGFsVmlkZW9GcmFtZXM7XG4gICAgICAgICAgICBkcm9wcGVkID0gcXVhbGl0eS5kcm9wcGVkVmlkZW9GcmFtZXM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWVkaWFFbGVtZW50LndlYmtpdERlY29kZWRGcmFtZUNvdW50ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuX21lZGlhRWxlbWVudC53ZWJraXREZWNvZGVkRnJhbWVDb3VudDtcbiAgICAgICAgICAgIGRyb3BwZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQud2Via2l0RHJvcHBlZEZyYW1lQ291bnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYXNRdWFsaXR5SW5mbyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1F1YWxpdHlJbmZvKSB7XG4gICAgICAgICAgICBzdGF0SW5mby5kZWNvZGVkRnJhbWVzID0gZGVjb2RlZDtcbiAgICAgICAgICAgIHN0YXRJbmZvLmRyb3BwZWRGcmFtZXMgPSBkcm9wcGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRJbmZvO1xuICAgIH1cblxuICAgIF9vbm1zZVVwZGF0ZUVuZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcubGF6eUxvYWQgfHwgdGhpcy5fY29uZmlnLmlzTGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1ZmZlcmVkID0gdGhpcy5fbWVkaWFFbGVtZW50LmJ1ZmZlcmVkO1xuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG4gICAgICAgIGxldCBjdXJyZW50UmFuZ2VTdGFydCA9IDA7XG4gICAgICAgIGxldCBjdXJyZW50UmFuZ2VFbmQgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IGJ1ZmZlcmVkLmVuZChpKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBjdXJyZW50VGltZSAmJiBjdXJyZW50VGltZSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZVN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgY3VycmVudFJhbmdlRW5kID0gZW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRSYW5nZUVuZCA+PSBjdXJyZW50VGltZSArIHRoaXMuX2NvbmZpZy5sYXp5TG9hZE1heER1cmF0aW9uICYmIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBMb2cudih0aGlzLlRBRywgJ01heGltdW0gYnVmZmVyaW5nIGR1cmF0aW9uIGV4Y2VlZGVkLCBzdXNwZW5kIHRyYW5zbXV4aW5nIHRhc2snKTtcbiAgICAgICAgICAgIHRoaXMuX3N1c3BlbmRUcmFuc211eGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25tc2VCdWZmZXJGdWxsKCkge1xuICAgICAgICBMb2cudih0aGlzLlRBRywgJ01TRSBTb3VyY2VCdWZmZXIgaXMgZnVsbCwgc3VzcGVuZCB0cmFuc211eGluZyB0YXNrJyk7XG4gICAgICAgIGlmICh0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fc3VzcGVuZFRyYW5zbXV4ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zdXNwZW5kVHJhbnNtdXhlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIucGF1c2UoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NDaGVja2VyID0gd2luZG93LnNldEludGVydmFsKHRoaXMuX2NoZWNrUHJvZ3Jlc3NBbmRSZXN1bWUuYmluZCh0aGlzKSwgMTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2hlY2tQcm9ncmVzc0FuZFJlc3VtZSgpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuICAgICAgICBsZXQgYnVmZmVyZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQuYnVmZmVyZWQ7XG5cbiAgICAgICAgbGV0IG5lZWRSZXN1bWUgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgICAgICAgICAgbGV0IHRvID0gYnVmZmVyZWQuZW5kKGkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lID49IGZyb20gJiYgY3VycmVudFRpbWUgPCB0bykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSA+PSB0byAtIHRoaXMuX2NvbmZpZy5sYXp5TG9hZFJlY292ZXJEdXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBuZWVkUmVzdW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVlZFJlc3VtZSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fcHJvZ3Jlc3NDaGVja2VyKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9IG51bGw7XG4gICAgICAgICAgICBpZiAobmVlZFJlc3VtZSkge1xuICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCAnQ29udGludWUgbG9hZGluZyBmcm9tIHBhdXNlZCBwb3NpdGlvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIucmVzdW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaXNUaW1lcG9pbnRCdWZmZXJlZChzZWNvbmRzKSB7XG4gICAgICAgIGxldCBidWZmZXJlZCA9IHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgICAgICAgICAgbGV0IHRvID0gYnVmZmVyZWQuZW5kKGkpO1xuICAgICAgICAgICAgaWYgKHNlY29uZHMgPj0gZnJvbSAmJiBzZWNvbmRzIDwgdG8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2ludGVybmFsU2VlayhzZWNvbmRzKSB7XG4gICAgICAgIGxldCBkaXJlY3RTZWVrID0gdGhpcy5faXNUaW1lcG9pbnRCdWZmZXJlZChzZWNvbmRzKTtcblxuICAgICAgICBsZXQgZGlyZWN0U2Vla0JlZ2luID0gZmFsc2U7XG4gICAgICAgIGxldCBkaXJlY3RTZWVrQmVnaW5UaW1lID0gMDtcblxuICAgICAgICBpZiAoc2Vjb25kcyA8IDEuMCAmJiB0aGlzLl9tZWRpYUVsZW1lbnQuYnVmZmVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHZpZGVvQmVnaW5UaW1lID0gdGhpcy5fbWVkaWFFbGVtZW50LmJ1ZmZlcmVkLnN0YXJ0KDApO1xuICAgICAgICAgICAgaWYgKCh2aWRlb0JlZ2luVGltZSA8IDEuMCAmJiBzZWNvbmRzIDwgdmlkZW9CZWdpblRpbWUpIHx8IEJyb3dzZXIuc2FmYXJpKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0U2Vla0JlZ2luID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBhbHNvIHdvcmthcm91bmQgZm9yIFNhZmFyaTogU2VlayB0byAwIG1heSBjYXVzZSB2aWRlbyBzdHVjaywgdXNlIDAuMSB0byBhdm9pZFxuICAgICAgICAgICAgICAgIGRpcmVjdFNlZWtCZWdpblRpbWUgPSBCcm93c2VyLnNhZmFyaSA/IDAuMSA6IHZpZGVvQmVnaW5UaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdFNlZWtCZWdpbikgeyAgLy8gc2VlayB0byB2aWRlbyBiZWdpbiwgc2V0IGN1cnJlbnRUaW1lIGRpcmVjdGx5IGlmIGJlZ2luUFRTIGJ1ZmZlcmVkXG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSBkaXJlY3RTZWVrQmVnaW5UaW1lO1xuICAgICAgICB9ICBlbHNlIGlmIChkaXJlY3RTZWVrKSB7ICAvLyBidWZmZXJlZCBwb3NpdGlvblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9hbHdheXNTZWVrS2V5ZnJhbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkciA9IHRoaXMuX21zZWN0bC5nZXROZWFyZXN0S2V5ZnJhbWUoTWF0aC5mbG9vcihzZWNvbmRzICogMTAwMCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaWRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gaWRyLmR0cyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Byb2dyZXNzQW5kUmVzdW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9wcm9ncmVzc0NoZWNrZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwuc2VlayhzZWNvbmRzKTtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIuc2VlayhNYXRoLmZsb29yKHNlY29uZHMgKiAxMDAwKSk7ICAvLyBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0IG1lZGlhRWxlbWVudC5jdXJyZW50VGltZSBpZiBub24tYWNjdXJhdGVTZWVrLFxuICAgICAgICAgICAgLy8ganVzdCB3YWl0IGZvciB0aGUgcmVjb21tZW5kX3NlZWtwb2ludCBjYWxsYmFja1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hY2N1cmF0ZVNlZWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jaGVja0FuZEFwcGx5VW5idWZmZXJlZFNlZWtwb2ludCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlZWtwb2ludFJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlZWtwb2ludFJlY29yZC5yZWNvcmRUaW1lIDw9IHRoaXMuX25vdygpIC0gMTAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWVrcG9pbnRSZWNvcmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNUaW1lcG9pbnRCdWZmZXJlZCh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9ncmVzc0NoZWNrZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9wcm9ncmVzc0NoZWNrZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NDaGVja2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAuY3VycmVudFRpbWUgaXMgY29uc2lzdHMgd2l0aCAuYnVmZmVyZWQgdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgIC8vIENocm9tZS9FZGdlIHVzZSBEVFMsIHdoaWxlIEZpcmVGb3gvU2FmYXJpIHVzZSBQVFNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXNlY3RsLnNlZWsodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5zZWVrKE1hdGguZmxvb3IodGFyZ2V0ICogMTAwMCkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgY3VycmVudFRpbWUgaWYgYWNjdXJhdGVTZWVrLCBvciB3YWl0IGZvciByZWNvbW1lbmRfc2Vla3BvaW50IGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuYWNjdXJhdGVTZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2NoZWNrQW5kQXBwbHlVbmJ1ZmZlcmVkU2Vla3BvaW50LmJpbmQodGhpcyksIDUwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jaGVja0FuZFJlc3VtZVN0dWNrUGxheWJhY2soc3RhbGxlZCkge1xuICAgICAgICBsZXQgbWVkaWEgPSB0aGlzLl9tZWRpYUVsZW1lbnQ7XG4gICAgICAgIGlmIChzdGFsbGVkIHx8ICF0aGlzLl9yZWNlaXZlZENhblBsYXkgfHwgbWVkaWEucmVhZHlTdGF0ZSA8IDIpIHsgIC8vIEhBVkVfQ1VSUkVOVF9EQVRBXG4gICAgICAgICAgICBsZXQgYnVmZmVyZWQgPSBtZWRpYS5idWZmZXJlZDtcbiAgICAgICAgICAgIGlmIChidWZmZXJlZC5sZW5ndGggPiAwICYmIG1lZGlhLmN1cnJlbnRUaW1lIDwgYnVmZmVyZWQuc3RhcnQoMCkpIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgYFBsYXliYWNrIHNlZW1zIHN0dWNrIGF0ICR7bWVkaWEuY3VycmVudFRpbWV9LCBzZWVrIHRvICR7YnVmZmVyZWQuc3RhcnQoMCl9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IGJ1ZmZlcmVkLnN0YXJ0KDApO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMuZS5vbnZQcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBQbGF5YmFjayBkaWRuJ3Qgc3R1Y2ssIHJlbW92ZSBwcm9ncmVzcyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5lLm9udlByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbnZMb2FkZWRNZXRhZGF0YShlKSB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nU2Vla1RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gdGhpcy5fcGVuZGluZ1NlZWtUaW1lO1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbnZTZWVraW5nKGUpIHsgIC8vIGhhbmRsZSBzZWVraW5nIHJlcXVlc3QgZnJvbSBicm93c2VyJ3MgcHJvZ3Jlc3MgYmFyXG4gICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG4gICAgICAgIGxldCBidWZmZXJlZCA9IHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZDtcblxuICAgICAgICBpZiAodGhpcy5fcmVxdWVzdFNldFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0IDwgMS4wICYmIGJ1ZmZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHNlZWsgdG8gdmlkZW8gYmVnaW4sIHNldCBjdXJyZW50VGltZSBkaXJlY3RseSBpZiBiZWdpblBUUyBidWZmZXJlZFxuICAgICAgICAgICAgbGV0IHZpZGVvQmVnaW5UaW1lID0gYnVmZmVyZWQuc3RhcnQoMCk7XG4gICAgICAgICAgICBpZiAoKHZpZGVvQmVnaW5UaW1lIDwgMS4wICYmIHRhcmdldCA8IHZpZGVvQmVnaW5UaW1lKSB8fCBCcm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBhbHNvIHdvcmthcm91bmQgZm9yIFNhZmFyaTogU2VlayB0byAwIG1heSBjYXVzZSB2aWRlbyBzdHVjaywgdXNlIDAuMSB0byBhdm9pZFxuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IEJyb3dzZXIuc2FmYXJpID8gMC4xIDogdmlkZW9CZWdpblRpbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzVGltZXBvaW50QnVmZmVyZWQodGFyZ2V0KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Fsd2F5c1NlZWtLZXlmcmFtZSkge1xuICAgICAgICAgICAgICAgIGxldCBpZHIgPSB0aGlzLl9tc2VjdGwuZ2V0TmVhcmVzdEtleWZyYW1lKE1hdGguZmxvb3IodGFyZ2V0ICogMTAwMCkpO1xuICAgICAgICAgICAgICAgIGlmIChpZHIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IGlkci5kdHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9ncmVzc0NoZWNrZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrUHJvZ3Jlc3NBbmRSZXN1bWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NlZWtwb2ludFJlY29yZCA9IHtcbiAgICAgICAgICAgIHNlZWtQb2ludDogdGFyZ2V0LFxuICAgICAgICAgICAgcmVjb3JkVGltZTogdGhpcy5fbm93KClcbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5fY2hlY2tBbmRBcHBseVVuYnVmZmVyZWRTZWVrcG9pbnQuYmluZCh0aGlzKSwgNTApO1xuICAgIH1cblxuICAgIF9vbnZDYW5QbGF5KGUpIHtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRDYW5QbGF5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLmUub252Q2FuUGxheSk7XG4gICAgfVxuXG4gICAgX29udlN0YWxsZWQoZSkge1xuICAgICAgICB0aGlzLl9jaGVja0FuZFJlc3VtZVN0dWNrUGxheWJhY2sodHJ1ZSk7XG4gICAgfVxuXG4gICAgX29udlByb2dyZXNzKGUpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tBbmRSZXN1bWVTdHVja1BsYXliYWNrKCk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZsdlBsYXllcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IFBsYXllckV2ZW50cyBmcm9tICcuL3BsYXllci1ldmVudHMuanMnO1xuaW1wb3J0IHtjcmVhdGVEZWZhdWx0Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLy8gUGxheWVyIHdyYXBwZXIgZm9yIGJyb3dzZXIncyBuYXRpdmUgcGxheWVyIChIVE1MVmlkZW9FbGVtZW50KSB3aXRob3V0IE1lZGlhU291cmNlIHNyYy4gXG5jbGFzcyBOYXRpdmVQbGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IobWVkaWFEYXRhU291cmNlLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnTmF0aXZlUGxheWVyJztcbiAgICAgICAgdGhpcy5fdHlwZSA9ICdOYXRpdmVQbGF5ZXInO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZWRpYURhdGFTb3VyY2UudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZmx2Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTmF0aXZlUGxheWVyIGRvZXNcXCd0IHN1cHBvcnQgZmx2IE1lZGlhRGF0YVNvdXJjZSBpbnB1dCEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVkaWFEYXRhU291cmNlLmhhc093blByb3BlcnR5KCdzZWdtZW50cycpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKGBOYXRpdmVQbGF5ZXIoJHttZWRpYURhdGFTb3VyY2UudHlwZX0pIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBhcnQgcGxheWJhY2shYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmUgPSB7XG4gICAgICAgICAgICBvbnZMb2FkZWRNZXRhZGF0YTogdGhpcy5fb252TG9hZGVkTWV0YWRhdGEuYmluZCh0aGlzKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3BlbmRpbmdTZWVrVGltZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlID0gbWVkaWFEYXRhU291cmNlO1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB0aGlzLmRldGFjaE1lZGlhRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21lZGlhRGF0YVNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoZXZlbnQgPT09IFBsYXllckV2ZW50cy5NRURJQV9JTkZPKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5fbWVkaWFFbGVtZW50LnJlYWR5U3RhdGUgIT09IDApIHsgIC8vIEhBVkVfTk9USElOR1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLk1FRElBX0lORk8sIHRoaXMubWVkaWFJbmZvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gUGxheWVyRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCAhPSBudWxsICYmIHRoaXMuX21lZGlhRWxlbWVudC5yZWFkeVN0YXRlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuU1RBVElTVElDU19JTkZPLCB0aGlzLnN0YXRpc3RpY3NJbmZvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0dGVyLmFkZExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgYXR0YWNoTWVkaWFFbGVtZW50KG1lZGlhRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnQ7XG4gICAgICAgIG1lZGlhRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIHRoaXMuZS5vbnZMb2FkZWRNZXRhZGF0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTZWVrVGltZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHRoaXMuX3BlbmRpbmdTZWVrVGltZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElFMTEgbWF5IHRocm93IEludmFsaWRTdGF0ZUVycm9yIGlmIHJlYWR5U3RhdGUgPT09IDBcbiAgICAgICAgICAgICAgICAvLyBEZWZlciBzZXQgY3VycmVudFRpbWUgb3BlcmF0aW9uIGFmdGVyIGxvYWRlZG1ldGFkYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRhY2hNZWRpYUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5lLm9udkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdIVE1MTWVkaWFFbGVtZW50IG11c3QgYmUgYXR0YWNoZWQgYmVmb3JlIGxvYWQoKSEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuc3JjID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnVybDtcblxuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50LnJlYWR5U3RhdGUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnByZWxvYWQgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5sb2FkKCk7XG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IHdpbmRvdy5zZXRJbnRlcnZhbChcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydFN0YXRpc3RpY3NJbmZvLmJpbmQodGhpcyksXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdGF0aXN0aWNzSW5mb1JlcG9ydEludGVydmFsKTtcbiAgICB9XG5cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LnBsYXkoKTtcbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnBhdXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cblxuICAgIGdldCBidWZmZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZDtcbiAgICB9XG5cbiAgICBnZXQgZHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQuZHVyYXRpb247XG4gICAgfVxuXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC52b2x1bWU7XG4gICAgfVxuXG4gICAgc2V0IHZvbHVtZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQudm9sdW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IG11dGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50Lm11dGVkO1xuICAgIH1cblxuICAgIHNldCBtdXRlZChtdXRlZCkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQubXV0ZWQgPSBtdXRlZDtcbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgc2V0IGN1cnJlbnRUaW1lKHNlY29uZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWVrVGltZSA9IHNlY29uZHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgbWVkaWFJbmZvKCkge1xuICAgICAgICBsZXQgbWVkaWFQcmVmaXggPSAodGhpcy5fbWVkaWFFbGVtZW50IGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudCkgPyAnYXVkaW8vJyA6ICd2aWRlby8nO1xuICAgICAgICBsZXQgaW5mbyA9IHtcbiAgICAgICAgICAgIG1pbWVUeXBlOiBtZWRpYVByZWZpeCArIHRoaXMuX21lZGlhRGF0YVNvdXJjZS50eXBlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGluZm8uZHVyYXRpb24gPSBNYXRoLmZsb29yKHRoaXMuX21lZGlhRWxlbWVudC5kdXJhdGlvbiAqIDEwMDApO1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpbmZvLndpZHRoID0gdGhpcy5fbWVkaWFFbGVtZW50LnZpZGVvV2lkdGg7XG4gICAgICAgICAgICAgICAgaW5mby5oZWlnaHQgPSB0aGlzLl9tZWRpYUVsZW1lbnQudmlkZW9IZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgZ2V0IHN0YXRpc3RpY3NJbmZvKCkge1xuICAgICAgICBsZXQgaW5mbyA9IHtcbiAgICAgICAgICAgIHBsYXllclR5cGU6IHRoaXMuX3R5cGUsXG4gICAgICAgICAgICB1cmw6IHRoaXMuX21lZGlhRGF0YVNvdXJjZS51cmxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoISh0aGlzLl9tZWRpYUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzUXVhbGl0eUluZm8gPSB0cnVlO1xuICAgICAgICBsZXQgZGVjb2RlZCA9IDA7XG4gICAgICAgIGxldCBkcm9wcGVkID0gMDtcblxuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50LmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KSB7XG4gICAgICAgICAgICBsZXQgcXVhbGl0eSA9IHRoaXMuX21lZGlhRWxlbWVudC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpO1xuICAgICAgICAgICAgZGVjb2RlZCA9IHF1YWxpdHkudG90YWxWaWRlb0ZyYW1lcztcbiAgICAgICAgICAgIGRyb3BwZWQgPSBxdWFsaXR5LmRyb3BwZWRWaWRlb0ZyYW1lcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQud2Via2l0RGVjb2RlZEZyYW1lQ291bnQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWNvZGVkID0gdGhpcy5fbWVkaWFFbGVtZW50LndlYmtpdERlY29kZWRGcmFtZUNvdW50O1xuICAgICAgICAgICAgZHJvcHBlZCA9IHRoaXMuX21lZGlhRWxlbWVudC53ZWJraXREcm9wcGVkRnJhbWVDb3VudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc1F1YWxpdHlJbmZvID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzUXVhbGl0eUluZm8pIHtcbiAgICAgICAgICAgIGluZm8uZGVjb2RlZEZyYW1lcyA9IGRlY29kZWQ7XG4gICAgICAgICAgICBpbmZvLmRyb3BwZWRGcmFtZXMgPSBkcm9wcGVkO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICBfb252TG9hZGVkTWV0YWRhdGEoZSkge1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NlZWtUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHRoaXMuX3BlbmRpbmdTZWVrVGltZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWVrVGltZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5NRURJQV9JTkZPLCB0aGlzLm1lZGlhSW5mbyk7XG4gICAgfVxuXG4gICAgX3JlcG9ydFN0YXRpc3RpY3NJbmZvKCkge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTywgdGhpcy5zdGF0aXN0aWNzSW5mbyk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE5hdGl2ZVBsYXllcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtMb2FkZXJFcnJvcnN9IGZyb20gJy4uL2lvL2xvYWRlci5qcyc7XG5pbXBvcnQgRGVtdXhFcnJvcnMgZnJvbSAnLi4vZGVtdXgvZGVtdXgtZXJyb3JzLmpzJztcblxuZXhwb3J0IGNvbnN0IEVycm9yVHlwZXMgPSB7XG4gICAgTkVUV09SS19FUlJPUjogJ05ldHdvcmtFcnJvcicsXG4gICAgTUVESUFfRVJST1I6ICdNZWRpYUVycm9yJyxcbiAgICBPVEhFUl9FUlJPUjogJ090aGVyRXJyb3InXG59O1xuXG5leHBvcnQgY29uc3QgRXJyb3JEZXRhaWxzID0ge1xuICAgIE5FVFdPUktfRVhDRVBUSU9OOiBMb2FkZXJFcnJvcnMuRVhDRVBUSU9OLFxuICAgIE5FVFdPUktfU1RBVFVTX0NPREVfSU5WQUxJRDogTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRCxcbiAgICBORVRXT1JLX1RJTUVPVVQ6IExvYWRlckVycm9ycy5DT05ORUNUSU5HX1RJTUVPVVQsXG4gICAgTkVUV09SS19VTlJFQ09WRVJBQkxFX0VBUkxZX0VPRjogTG9hZGVyRXJyb3JzLlVOUkVDT1ZFUkFCTEVfRUFSTFlfRU9GLFxuXG4gICAgTUVESUFfTVNFX0VSUk9SOiAnTWVkaWFNU0VFcnJvcicsXG5cbiAgICBNRURJQV9GT1JNQVRfRVJST1I6IERlbXV4RXJyb3JzLkZPUk1BVF9FUlJPUixcbiAgICBNRURJQV9GT1JNQVRfVU5TVVBQT1JURUQ6IERlbXV4RXJyb3JzLkZPUk1BVF9VTlNVUFBPUlRFRCxcbiAgICBNRURJQV9DT0RFQ19VTlNVUFBPUlRFRDogRGVtdXhFcnJvcnMuQ09ERUNfVU5TVVBQT1JURURcbn07IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IFBsYXllckV2ZW50cyA9IHtcbiAgICBFUlJPUjogJ2Vycm9yJyxcbiAgICBMT0FESU5HX0NPTVBMRVRFOiAnbG9hZGluZ19jb21wbGV0ZScsXG4gICAgUkVDT1ZFUkVEX0VBUkxZX0VPRjogJ3JlY292ZXJlZF9lYXJseV9lb2YnLFxuICAgIE1FRElBX0lORk86ICdtZWRpYV9pbmZvJyxcbiAgICBTVEFUSVNUSUNTX0lORk86ICdzdGF0aXN0aWNzX2luZm8nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQbGF5ZXJFdmVudHM7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgbW9kaWZpZWQgZnJvbSBkYWlseW1vdGlvbidzIGhscy5qcyBsaWJyYXJ5IChobHMuanMvc3JjL2hlbHBlci9hYWMuanMpXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNsYXNzIEFBQyB7XG5cbiAgICBzdGF0aWMgZ2V0U2lsZW50RnJhbWUoY29kZWMsIGNoYW5uZWxDb3VudCkge1xuICAgICAgICBpZiAoY29kZWMgPT09ICdtcDRhLjQwLjInKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgTEMtQUFDXG4gICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDAwLCAweGM4LCAweDAwLCAweDgwLCAweDIzLCAweDgwXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgyMSwgMHgwMCwgMHg0OSwgMHg5MCwgMHgwMiwgMHgxOSwgMHgwMCwgMHgyMywgMHg4MF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4YzgsIDB4MDAsIDB4ODAsIDB4MjAsIDB4ODQsIDB4MDEsIDB4MjYsIDB4NDAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4OGVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDAwLCAweGM4LCAweDAwLCAweDgwLCAweDIwLCAweDg0LCAweDAxLCAweDI2LCAweDQwLCAweDA4LCAweDY0LCAweDAwLCAweDgwLCAweDJjLCAweDgwLCAweDA4LCAweDAyLCAweDM4XSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgwMCwgMHhjOCwgMHgwMCwgMHg4MCwgMHgyMCwgMHg4NCwgMHgwMSwgMHgyNiwgMHg0MCwgMHgwOCwgMHg2NCwgMHgwMCwgMHg4MiwgMHgzMCwgMHgwNCwgMHg5OSwgMHgwMCwgMHgyMSwgMHg5MCwgMHgwMiwgMHgzOF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4YzgsIDB4MDAsIDB4ODAsIDB4MjAsIDB4ODQsIDB4MDEsIDB4MjYsIDB4NDAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4ODIsIDB4MzAsIDB4MDQsIDB4OTksIDB4MDAsIDB4MjEsIDB4OTAsIDB4MDIsIDB4MDAsIDB4YjIsIDB4MDAsIDB4MjAsIDB4MDgsIDB4ZTBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBIRS1BQUMgKG1wNGEuNDAuNSAvIG1wNGEuNDAuMjkpXG4gICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gZmZtcGVnIC15IC1mIGxhdmZpIC1pIFwiYWV2YWxzcmM9MDpkPTAuMDVcIiAtYzphIGxpYmZka19hYWMgLXByb2ZpbGU6YSBhYWNfaGUgLWI6YSA0ayBvdXRwdXQuYWFjICYmIGhleGR1bXAgLXYgLWUgJzE2LzEgXCIweCV4LFwiIFwiXFxuXCInIC12IG91dHB1dC5hYWNcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MSwgMHg0MCwgMHgyMiwgMHg4MCwgMHhhMywgMHg0ZSwgMHhlNiwgMHg4MCwgMHhiYSwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDFjLCAweDYsIDB4ZjEsIDB4YzEsIDB4YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1ZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBmZm1wZWcgLXkgLWYgbGF2ZmkgLWkgXCJhZXZhbHNyYz0wfDA6ZD0wLjA1XCIgLWM6YSBsaWJmZGtfYWFjIC1wcm9maWxlOmEgYWFjX2hlX3YyIC1iOmEgNGsgb3V0cHV0LmFhYyAmJiBoZXhkdW1wIC12IC1lICcxNi8xIFwiMHgleCxcIiBcIlxcblwiJyAtdiBvdXRwdXQuYWFjXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDEsIDB4NDAsIDB4MjIsIDB4ODAsIDB4YTMsIDB4NWUsIDB4ZTYsIDB4ODAsIDB4YmEsIDB4OCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDk1LCAweDAsIDB4NiwgMHhmMSwgMHhhMSwgMHhhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVlXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZmbXBlZyAteSAtZiBsYXZmaSAtaSBcImFldmFsc3JjPTB8MHwwOmQ9MC4wNVwiIC1jOmEgbGliZmRrX2FhYyAtcHJvZmlsZTphIGFhY19oZV92MiAtYjphIDRrIG91dHB1dC5hYWMgJiYgaGV4ZHVtcCAtdiAtZSAnMTYvMSBcIjB4JXgsXCIgXCJcXG5cIicgLXYgb3V0cHV0LmFhY1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgxLCAweDQwLCAweDIyLCAweDgwLCAweGEzLCAweDVlLCAweGU2LCAweDgwLCAweGJhLCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHg5NSwgMHgwLCAweDYsIDB4ZjEsIDB4YTEsIDB4YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBBQUM7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGRhaWx5bW90aW9uJ3MgaGxzLmpzIGxpYnJhcnkgKGhscy5qcy9zcmMvcmVtdXgvbXA0LWdlbmVyYXRvci5qcylcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gIE1QNCBib3hlcyBnZW5lcmF0b3IgZm9yIElTTyBCTUZGIChJU08gQmFzZSBNZWRpYSBGaWxlIEZvcm1hdCwgZGVmaW5lZCBpbiBJU08vSUVDIDE0NDk2LTEyKVxuY2xhc3MgTVA0IHtcblxuICAgIHN0YXRpYyBpbml0KCkge1xuICAgICAgICBNUDQudHlwZXMgPSB7XG4gICAgICAgICAgICBhdmMxOiBbXSwgYXZjQzogW10sIGJ0cnQ6IFtdLCBkaW5mOiBbXSxcbiAgICAgICAgICAgIGRyZWY6IFtdLCBlc2RzOiBbXSwgZnR5cDogW10sIGhkbHI6IFtdLFxuICAgICAgICAgICAgbWRhdDogW10sIG1kaGQ6IFtdLCBtZGlhOiBbXSwgbWZoZDogW10sXG4gICAgICAgICAgICBtaW5mOiBbXSwgbW9vZjogW10sIG1vb3Y6IFtdLCBtcDRhOiBbXSxcbiAgICAgICAgICAgIG12ZXg6IFtdLCBtdmhkOiBbXSwgc2R0cDogW10sIHN0Ymw6IFtdLFxuICAgICAgICAgICAgc3RjbzogW10sIHN0c2M6IFtdLCBzdHNkOiBbXSwgc3RzejogW10sXG4gICAgICAgICAgICBzdHRzOiBbXSwgdGZkdDogW10sIHRmaGQ6IFtdLCB0cmFmOiBbXSxcbiAgICAgICAgICAgIHRyYWs6IFtdLCB0cnVuOiBbXSwgdHJleDogW10sIHRraGQ6IFtdLFxuICAgICAgICAgICAgdm1oZDogW10sIHNtaGQ6IFtdLCAnLm1wMyc6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBNUDQudHlwZXMpIHtcbiAgICAgICAgICAgIGlmIChNUDQudHlwZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBNUDQudHlwZXNbbmFtZV0gPSBbXG4gICAgICAgICAgICAgICAgICAgIG5hbWUuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZS5jaGFyQ29kZUF0KDEpLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLmNoYXJDb2RlQXQoMiksXG4gICAgICAgICAgICAgICAgICAgIG5hbWUuY2hhckNvZGVBdCgzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uc3RhbnRzID0gTVA0LmNvbnN0YW50cyA9IHt9O1xuXG4gICAgICAgIGNvbnN0YW50cy5GVFlQID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHg2OSwgMHg3MywgMHg2RiwgMHg2RCwgIC8vIG1ham9yX2JyYW5kOiBpc29tXG4gICAgICAgICAgICAweDAsICAweDAsICAweDAsICAweDEsICAgLy8gbWlub3JfdmVyc2lvbjogMHgwMVxuICAgICAgICAgICAgMHg2OSwgMHg3MywgMHg2RiwgMHg2RCwgIC8vIGlzb21cbiAgICAgICAgICAgIDB4NjEsIDB4NzYsIDB4NjMsIDB4MzEgICAvLyBhdmMxXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0YW50cy5TVFNEX1BSRUZJWCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgICAvLyBlbnRyeV9jb3VudFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdGFudHMuU1RUUyA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAvLyBlbnRyeV9jb3VudFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdGFudHMuU1RTQyA9IGNvbnN0YW50cy5TVENPID0gY29uc3RhbnRzLlNUVFM7XG5cbiAgICAgICAgY29uc3RhbnRzLlNUU1ogPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gc2FtcGxlX3NpemVcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAvLyBzYW1wbGVfY291bnRcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3RhbnRzLkhETFJfVklERU8gPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgICAgIDB4NzYsIDB4NjksIDB4NjQsIDB4NjUsICAvLyBoYW5kbGVyX3R5cGU6ICd2aWRlJ1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiAzICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDU2LCAweDY5LCAweDY0LCAweDY1LFxuICAgICAgICAgICAgMHg2RiwgMHg0OCwgMHg2MSwgMHg2RSxcbiAgICAgICAgICAgIDB4NjQsIDB4NkMsIDB4NjUsIDB4NzIsIDB4MDAgIC8vIG5hbWU6IFZpZGVvSGFuZGxlclxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdGFudHMuSERMUl9BVURJTyA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBwcmVfZGVmaW5lZFxuICAgICAgICAgICAgMHg3MywgMHg2RiwgMHg3NSwgMHg2RSwgIC8vIGhhbmRsZXJfdHlwZTogJ3NvdW4nXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQ6IDMgKiA0IGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4NTMsIDB4NkYsIDB4NzUsIDB4NkUsXG4gICAgICAgICAgICAweDY0LCAweDQ4LCAweDYxLCAweDZFLFxuICAgICAgICAgICAgMHg2NCwgMHg2QywgMHg2NSwgMHg3MiwgMHgwMCAgLy8gbmFtZTogU291bmRIYW5kbGVyXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0YW50cy5EUkVGID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgIC8vIGVudHJ5X2NvdW50XG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBDLCAgLy8gZW50cnlfc2l6ZVxuICAgICAgICAgICAgMHg3NSwgMHg3MiwgMHg2QywgMHgyMCwgIC8vIHR5cGUgJ3VybCAnXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxICAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFNvdW5kIG1lZGlhIGhlYWRlclxuICAgICAgICBjb25zdGFudHMuU01IRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAvLyBiYWxhbmNlKDIpICsgcmVzZXJ2ZWQoMilcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gdmlkZW8gbWVkaWEgaGVhZGVyXG4gICAgICAgIGNvbnN0YW50cy5WTUhEID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8vIGdyYXBoaWNzbW9kZTogMiBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIG9wY29sb3I6IDMgKiAyIGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAwXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGEgYm94XG4gICAgc3RhdGljIGJveCh0eXBlKSB7XG4gICAgICAgIGxldCBzaXplID0gODtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGxldCBkYXRhcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGxldCBhcnJheUNvdW50ID0gZGF0YXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBzaXplICs9IGRhdGFzW2ldLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgcmVzdWx0WzBdID0gKHNpemUgPj4+IDI0KSAmIDB4RkY7ICAvLyBzaXplXG4gICAgICAgIHJlc3VsdFsxXSA9IChzaXplID4+PiAxNikgJiAweEZGO1xuICAgICAgICByZXN1bHRbMl0gPSAoc2l6ZSA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgcmVzdWx0WzNdID0gKHNpemUpICYgMHhGRjtcblxuICAgICAgICByZXN1bHQuc2V0KHR5cGUsIDQpOyAgLy8gdHlwZVxuXG4gICAgICAgIGxldCBvZmZzZXQgPSA4O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykgeyAgLy8gZGF0YSBib2R5XG4gICAgICAgICAgICByZXN1bHQuc2V0KGRhdGFzW2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGFzW2ldLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIGVtaXQgZnR5cCAmIG1vb3ZcbiAgICBzdGF0aWMgZ2VuZXJhdGVJbml0U2VnbWVudChtZXRhKSB7XG4gICAgICAgIGxldCBmdHlwID0gTVA0LmJveChNUDQudHlwZXMuZnR5cCwgTVA0LmNvbnN0YW50cy5GVFlQKTtcbiAgICAgICAgbGV0IG1vb3YgPSBNUDQubW9vdihtZXRhKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZnR5cC5ieXRlTGVuZ3RoICsgbW9vdi5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0LnNldChmdHlwLCAwKTtcbiAgICAgICAgcmVzdWx0LnNldChtb292LCBmdHlwLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIE1vdmllIG1ldGFkYXRhIGJveFxuICAgIHN0YXRpYyBtb292KG1ldGEpIHtcbiAgICAgICAgbGV0IG12aGQgPSBNUDQubXZoZChtZXRhLnRpbWVzY2FsZSwgbWV0YS5kdXJhdGlvbik7XG4gICAgICAgIGxldCB0cmFrID0gTVA0LnRyYWsobWV0YSk7XG4gICAgICAgIGxldCBtdmV4ID0gTVA0Lm12ZXgobWV0YSk7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5tb292LCBtdmhkLCB0cmFrLCBtdmV4KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZpZSBoZWFkZXIgYm94XG4gICAgc3RhdGljIG12aGQodGltZXNjYWxlLCBkdXJhdGlvbikge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubXZoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIGNyZWF0aW9uX3RpbWVcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgICAgICAgKHRpbWVzY2FsZSA+Pj4gMjQpICYgMHhGRiwgIC8vIHRpbWVzY2FsZTogNCBieXRlc1xuICAgICAgICAgICAgKHRpbWVzY2FsZSA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICh0aW1lc2NhbGUgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAodGltZXNjYWxlKSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+IDI0KSAmIDB4RkYsICAgLy8gZHVyYXRpb246IDQgYnl0ZXNcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbikgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgIC8vIFByZWZlcnJlZCByYXRlOiAxLjBcbiAgICAgICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBQcmVmZXJyZWRWb2x1bWUoMS4wLCAyYnl0ZXMpICsgcmVzZXJ2ZWQoMmJ5dGVzKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiA0ICsgNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsICAvLyAtLS0tYmVnaW4gY29tcG9zaXRpb24gbWF0cml4LS0tLVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyAtLS0tZW5kIGNvbXBvc2l0aW9uIG1hdHJpeC0tLS1cbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyAtLS0tYmVnaW4gcHJlX2RlZmluZWQgNiAqIDQgYnl0ZXMtLS0tXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIC0tLS1lbmQgcHJlX2RlZmluZWQgNiAqIDQgYnl0ZXMtLS0tXG4gICAgICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGICAgLy8gbmV4dF90cmFja19JRFxuICAgICAgICBdKSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgYm94XG4gICAgc3RhdGljIHRyYWsobWV0YSkge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMudHJhaywgTVA0LnRraGQobWV0YSksIE1QNC5tZGlhKG1ldGEpKTtcbiAgICB9XG5cbiAgICAvLyBUcmFjayBoZWFkZXIgYm94XG4gICAgc3RhdGljIHRraGQobWV0YSkge1xuICAgICAgICBsZXQgdHJhY2tJZCA9IG1ldGEuaWQsIGR1cmF0aW9uID0gbWV0YS5kdXJhdGlvbjtcbiAgICAgICAgbGV0IHdpZHRoID0gbWV0YS5wcmVzZW50V2lkdGgsIGhlaWdodCA9IG1ldGEucHJlc2VudEhlaWdodDtcblxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMudGtoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIGNyZWF0aW9uX3RpbWVcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgICAgICAgKHRyYWNrSWQgPj4+IDI0KSAmIDB4RkYsICAvLyB0cmFja19JRDogNCBieXRlc1xuICAgICAgICAgICAgKHRyYWNrSWQgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAodHJhY2tJZCA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgICh0cmFja0lkKSAmIDB4RkYsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQ6IDQgYnl0ZXNcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMjQpICYgMHhGRiwgLy8gZHVyYXRpb246IDQgYnl0ZXNcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbikgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiAyICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBsYXllcigyYnl0ZXMpICsgYWx0ZXJuYXRlX2dyb3VwKDJieXRlcylcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2b2x1bWUoMmJ5dGVzKSArIHJlc2VydmVkKDJieXRlcylcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsICAvLyAtLS0tYmVnaW4gY29tcG9zaXRpb24gbWF0cml4LS0tLVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyAtLS0tZW5kIGNvbXBvc2l0aW9uIG1hdHJpeC0tLS1cbiAgICAgICAgICAgICh3aWR0aCA+Pj4gOCkgJiAweEZGLCAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgICAgICAod2lkdGgpICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAoaGVpZ2h0ID4+PiA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoaGVpZ2h0KSAmIDB4RkYsXG4gICAgICAgICAgICAweDAwLCAweDAwXG4gICAgICAgIF0pKTtcbiAgICB9XG5cbiAgICAvLyBNZWRpYSBCb3hcbiAgICBzdGF0aWMgbWRpYShtZXRhKSB7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5tZGlhLCBNUDQubWRoZChtZXRhKSwgTVA0LmhkbHIobWV0YSksIE1QNC5taW5mKG1ldGEpKTtcbiAgICB9XG5cbiAgICAvLyBNZWRpYSBoZWFkZXIgYm94XG4gICAgc3RhdGljIG1kaGQobWV0YSkge1xuICAgICAgICBsZXQgdGltZXNjYWxlID0gbWV0YS50aW1lc2NhbGU7XG4gICAgICAgIGxldCBkdXJhdGlvbiA9IG1ldGEuZHVyYXRpb247XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5tZGhkLCBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gY3JlYXRpb25fdGltZVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIG1vZGlmaWNhdGlvbl90aW1lXG4gICAgICAgICAgICAodGltZXNjYWxlID4+PiAyNCkgJiAweEZGLCAgLy8gdGltZXNjYWxlOiA0IGJ5dGVzXG4gICAgICAgICAgICAodGltZXNjYWxlID4+PiAxNikgJiAweEZGLFxuICAgICAgICAgICAgKHRpbWVzY2FsZSA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgICh0aW1lc2NhbGUpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMjQpICYgMHhGRiwgICAvLyBkdXJhdGlvbjogNCBieXRlc1xuICAgICAgICAgICAgKGR1cmF0aW9uID4+PiAxNikgJiAweEZGLFxuICAgICAgICAgICAgKGR1cmF0aW9uID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKGR1cmF0aW9uKSAmIDB4RkYsXG4gICAgICAgICAgICAweDU1LCAweEM0LCAgICAgICAgICAgICAvLyBsYW5ndWFnZTogdW5kICh1bmRldGVybWluZWQpXG4gICAgICAgICAgICAweDAwLCAweDAwICAgICAgICAgICAgICAvLyBwcmVfZGVmaW5lZCA9IDBcbiAgICAgICAgXSkpO1xuICAgIH1cblxuICAgIC8vIE1lZGlhIGhhbmRsZXIgcmVmZXJlbmNlIGJveFxuICAgIHN0YXRpYyBoZGxyKG1ldGEpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xuICAgICAgICBpZiAobWV0YS50eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICBkYXRhID0gTVA0LmNvbnN0YW50cy5IRExSX0FVRElPO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IE1QNC5jb25zdGFudHMuSERMUl9WSURFTztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuaGRsciwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gTWVkaWEgaW5mb21hdGlvbiBib3hcbiAgICBzdGF0aWMgbWluZihtZXRhKSB7XG4gICAgICAgIGxldCB4bWhkID0gbnVsbDtcbiAgICAgICAgaWYgKG1ldGEudHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgeG1oZCA9IE1QNC5ib3goTVA0LnR5cGVzLnNtaGQsIE1QNC5jb25zdGFudHMuU01IRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4bWhkID0gTVA0LmJveChNUDQudHlwZXMudm1oZCwgTVA0LmNvbnN0YW50cy5WTUhEKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubWluZiwgeG1oZCwgTVA0LmRpbmYoKSwgTVA0LnN0YmwobWV0YSkpO1xuICAgIH1cblxuICAgIC8vIERhdGEgaW5mb21hdGlvbiBib3hcbiAgICBzdGF0aWMgZGluZigpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE1QNC5ib3goTVA0LnR5cGVzLmRpbmYsXG4gICAgICAgICAgICBNUDQuYm94KE1QNC50eXBlcy5kcmVmLCBNUDQuY29uc3RhbnRzLkRSRUYpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gU2FtcGxlIHRhYmxlIGJveFxuICAgIHN0YXRpYyBzdGJsKG1ldGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE1QNC5ib3goTVA0LnR5cGVzLnN0YmwsICAvLyB0eXBlOiBzdGJsXG4gICAgICAgICAgICBNUDQuc3RzZChtZXRhKSwgIC8vIFNhbXBsZSBEZXNjcmlwdGlvbiBUYWJsZVxuICAgICAgICAgICAgTVA0LmJveChNUDQudHlwZXMuc3R0cywgTVA0LmNvbnN0YW50cy5TVFRTKSwgIC8vIFRpbWUtVG8tU2FtcGxlXG4gICAgICAgICAgICBNUDQuYm94KE1QNC50eXBlcy5zdHNjLCBNUDQuY29uc3RhbnRzLlNUU0MpLCAgLy8gU2FtcGxlLVRvLUNodW5rXG4gICAgICAgICAgICBNUDQuYm94KE1QNC50eXBlcy5zdHN6LCBNUDQuY29uc3RhbnRzLlNUU1opLCAgLy8gU2FtcGxlIHNpemVcbiAgICAgICAgICAgIE1QNC5ib3goTVA0LnR5cGVzLnN0Y28sIE1QNC5jb25zdGFudHMuU1RDTykgICAvLyBDaHVuayBvZmZzZXRcbiAgICAgICAgKTsgXG4gICAgICAgIHJldHVybiByZXN1bHQ7IFxuICAgIH1cblxuICAgIC8vIFNhbXBsZSBkZXNjcmlwdGlvbiBib3hcbiAgICBzdGF0aWMgc3RzZChtZXRhKSB7XG4gICAgICAgIGlmIChtZXRhLnR5cGUgPT09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIGlmIChtZXRhLmNvZGVjID09PSAnbXAzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5zdHNkLCBNUDQuY29uc3RhbnRzLlNUU0RfUFJFRklYLCBNUDQubXAzKG1ldGEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2U6IGFhYyAtPiBtcDRhXG4gICAgICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuc3RzZCwgTVA0LmNvbnN0YW50cy5TVFNEX1BSRUZJWCwgTVA0Lm1wNGEobWV0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnN0c2QsIE1QNC5jb25zdGFudHMuU1RTRF9QUkVGSVgsIE1QNC5hdmMxKG1ldGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtcDMobWV0YSkge1xuICAgICAgICBsZXQgY2hhbm5lbENvdW50ID0gbWV0YS5jaGFubmVsQ291bnQ7XG4gICAgICAgIGxldCBzYW1wbGVSYXRlID0gbWV0YS5hdWRpb1NhbXBsZVJhdGU7XG5cbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQoNClcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyByZXNlcnZlZCgyKSArIGRhdGFfcmVmZXJlbmNlX2luZGV4KDIpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQ6IDIgKiA0IGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgY2hhbm5lbENvdW50LCAgICAgIC8vIGNoYW5uZWxDb3VudCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgxMCwgICAgICAgICAgICAgIC8vIHNhbXBsZVNpemUoMilcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyByZXNlcnZlZCg0KVxuICAgICAgICAgICAgKHNhbXBsZVJhdGUgPj4+IDgpICYgMHhGRiwgIC8vIEF1ZGlvIHNhbXBsZSByYXRlXG4gICAgICAgICAgICAoc2FtcGxlUmF0ZSkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXNbJy5tcDMnXSwgZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG1wNGEobWV0YSkge1xuICAgICAgICBsZXQgY2hhbm5lbENvdW50ID0gbWV0YS5jaGFubmVsQ291bnQ7XG4gICAgICAgIGxldCBzYW1wbGVSYXRlID0gbWV0YS5hdWRpb1NhbXBsZVJhdGU7XG5cbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQoNClcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyByZXNlcnZlZCgyKSArIGRhdGFfcmVmZXJlbmNlX2luZGV4KDIpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQ6IDIgKiA0IGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgY2hhbm5lbENvdW50LCAgICAgIC8vIGNoYW5uZWxDb3VudCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgxMCwgICAgICAgICAgICAgIC8vIHNhbXBsZVNpemUoMilcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyByZXNlcnZlZCg0KVxuICAgICAgICAgICAgKHNhbXBsZVJhdGUgPj4+IDgpICYgMHhGRiwgIC8vIEF1ZGlvIHNhbXBsZSByYXRlXG4gICAgICAgICAgICAoc2FtcGxlUmF0ZSkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubXA0YSwgZGF0YSwgTVA0LmVzZHMobWV0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlc2RzKG1ldGEpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IG1ldGEuY29uZmlnIHx8IFtdO1xuICAgICAgICBsZXQgY29uZmlnU2l6ZSA9IGNvbmZpZy5sZW5ndGg7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24gMCArIGZsYWdzXG5cbiAgICAgICAgICAgIDB4MDMsICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgICAgICAgIDB4MTcgKyBjb25maWdTaXplLCAgICAgICAvLyBsZW5ndGgzXG4gICAgICAgICAgICAweDAwLCAweDAxLCAgICAgICAgICAgICAgLy8gZXNfaWRcbiAgICAgICAgICAgIDB4MDAsICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW1fcHJpb3JpdHlcblxuICAgICAgICAgICAgMHgwNCwgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3JfdHlwZVxuICAgICAgICAgICAgMHgwRiArIGNvbmZpZ1NpemUsICAgICAgIC8vIGxlbmd0aFxuICAgICAgICAgICAgMHg0MCwgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVjOiBtcGVnNF9hdWRpb1xuICAgICAgICAgICAgMHgxNSwgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbV90eXBlOiBBdWRpb1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgIC8vIGJ1ZmZlcl9zaXplXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gbWF4Qml0cmF0ZVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIGF2Z0JpdHJhdGVcblxuICAgICAgICAgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3JfdHlwZVxuICAgICAgICBdLmNvbmNhdChbXG4gICAgICAgICAgICBjb25maWdTaXplXG4gICAgICAgIF0pLmNvbmNhdChcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApLmNvbmNhdChbXG4gICAgICAgICAgICAweDA2LCAweDAxLCAweDAyICAgICAgICAgLy8gR0FTcGVjaWZpY0NvbmZpZ1xuICAgICAgICBdKSk7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5lc2RzLCBkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXZjMShtZXRhKSB7XG4gICAgICAgIGxldCBhdmNjID0gbWV0YS5hdmNjO1xuICAgICAgICBsZXQgd2lkdGggPSBtZXRhLmNvZGVjV2lkdGgsIGhlaWdodCA9IG1ldGEuY29kZWNIZWlnaHQ7XG5cbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQoNClcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyByZXNlcnZlZCgyKSArIGRhdGFfcmVmZXJlbmNlX2luZGV4KDIpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcHJlX2RlZmluZWQoMikgKyByZXNlcnZlZCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHByZV9kZWZpbmVkOiAzICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAod2lkdGggPj4+IDgpICYgMHhGRiwgICAgLy8gd2lkdGg6IDIgYnl0ZXNcbiAgICAgICAgICAgICh3aWR0aCkgJiAweEZGLFxuICAgICAgICAgICAgKGhlaWdodCA+Pj4gOCkgJiAweEZGLCAgIC8vIGhlaWdodDogMiBieXRlc1xuICAgICAgICAgICAgKGhlaWdodCkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgIC8vIGhvcml6cmVzb2x1dGlvbjogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgIC8vIHZlcnRyZXNvbHV0aW9uOiA0IGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQ6IDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsICAgICAgICAgICAgICAvLyBmcmFtZV9jb3VudFxuICAgICAgICAgICAgMHgwQSwgICAgICAgICAgICAgICAgICAgIC8vIHN0cmxlblxuICAgICAgICAgICAgMHg3OCwgMHg3MSwgMHg3MSwgMHgyRiwgIC8vIGNvbXByZXNzb3JuYW1lOiAzMiBieXRlc1xuICAgICAgICAgICAgMHg2NiwgMHg2QywgMHg3NiwgMHgyRSxcbiAgICAgICAgICAgIDB4NkEsIDB4NzMsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MTgsICAgICAgICAgICAgICAvLyBkZXB0aFxuICAgICAgICAgICAgMHhGRiwgMHhGRiAgICAgICAgICAgICAgIC8vIHByZV9kZWZpbmVkID0gLTFcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5hdmMxLCBkYXRhLCBNUDQuYm94KE1QNC50eXBlcy5hdmNDLCBhdmNjKSk7XG4gICAgfVxuXG4gICAgLy8gTW92aWUgRXh0ZW5kcyBib3hcbiAgICBzdGF0aWMgbXZleChtZXRhKSB7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5tdmV4LCBNUDQudHJleChtZXRhKSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgRXh0ZW5kcyBib3hcbiAgICBzdGF0aWMgdHJleChtZXRhKSB7XG4gICAgICAgIGxldCB0cmFja0lkID0gbWV0YS5pZDtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAodHJhY2tJZCA+Pj4gMjQpICYgMHhGRiwgLy8gdHJhY2tfSURcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAxNikgJiAweEZGLFxuICAgICAgICAgICAgKHRyYWNrSWQgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAodHJhY2tJZCkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgIC8vIGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4XG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gZGVmYXVsdF9zYW1wbGVfZHVyYXRpb25cbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBkZWZhdWx0X3NhbXBsZV9zaXplXG4gICAgICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAxICAgLy8gZGVmYXVsdF9zYW1wbGVfZmxhZ3NcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy50cmV4LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBNb3ZpZSBmcmFnbWVudCBib3hcbiAgICBzdGF0aWMgbW9vZih0cmFjaywgYmFzZU1lZGlhRGVjb2RlVGltZSkge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubW9vZiwgTVA0Lm1maGQodHJhY2suc2VxdWVuY2VOdW1iZXIpLCBNUDQudHJhZih0cmFjaywgYmFzZU1lZGlhRGVjb2RlVGltZSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBtZmhkKHNlcXVlbmNlTnVtYmVyKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIChzZXF1ZW5jZU51bWJlciA+Pj4gMjQpICYgMHhGRiwgIC8vIHNlcXVlbmNlX251bWJlcjogaW50MzJcbiAgICAgICAgICAgIChzZXF1ZW5jZU51bWJlciA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChzZXF1ZW5jZU51bWJlciA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChzZXF1ZW5jZU51bWJlcikgJiAweEZGXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubWZoZCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgZnJhZ21lbnQgYm94XG4gICAgc3RhdGljIHRyYWYodHJhY2ssIGJhc2VNZWRpYURlY29kZVRpbWUpIHtcbiAgICAgICAgbGV0IHRyYWNrSWQgPSB0cmFjay5pZDtcblxuICAgICAgICAvLyBUcmFjayBmcmFnbWVudCBoZWFkZXIgYm94XG4gICAgICAgIGxldCB0ZmhkID0gTVA0LmJveChNUDQudHlwZXMudGZoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgJiBmbGFnc1xuICAgICAgICAgICAgKHRyYWNrSWQgPj4+IDI0KSAmIDB4RkYsIC8vIHRyYWNrX0lEXG4gICAgICAgICAgICAodHJhY2tJZCA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKHRyYWNrSWQpICYgMHhGRlxuICAgICAgICBdKSk7XG4gICAgICAgIC8vIFRyYWNrIEZyYWdtZW50IERlY29kZSBUaW1lXG4gICAgICAgIGxldCB0ZmR0ID0gTVA0LmJveChNUDQudHlwZXMudGZkdCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgJiBmbGFnc1xuICAgICAgICAgICAgKGJhc2VNZWRpYURlY29kZVRpbWUgPj4+IDI0KSAmIDB4RkYsICAvLyBiYXNlTWVkaWFEZWNvZGVUaW1lOiBpbnQzMlxuICAgICAgICAgICAgKGJhc2VNZWRpYURlY29kZVRpbWUgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoYmFzZU1lZGlhRGVjb2RlVGltZSA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChiYXNlTWVkaWFEZWNvZGVUaW1lKSAmIDB4RkZcbiAgICAgICAgXSkpO1xuICAgICAgICBsZXQgc2R0cCA9IE1QNC5zZHRwKHRyYWNrKTtcbiAgICAgICAgbGV0IHRydW4gPSBNUDQudHJ1bih0cmFjaywgc2R0cC5ieXRlTGVuZ3RoICsgMTYgKyAxNiArIDggKyAxNiArIDggKyA4KTtcblxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMudHJhZiwgdGZoZCwgdGZkdCwgdHJ1biwgc2R0cCk7XG4gICAgfVxuXG4gICAgLy8gU2FtcGxlIERlcGVuZGVuY3kgVHlwZSBib3hcbiAgICBzdGF0aWMgc2R0cCh0cmFjaykge1xuICAgICAgICBsZXQgc2FtcGxlcyA9IHRyYWNrLnNhbXBsZXMgfHwgW107XG4gICAgICAgIGxldCBzYW1wbGVDb3VudCA9IHNhbXBsZXMubGVuZ3RoO1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KDQgKyBzYW1wbGVDb3VudCk7XG4gICAgICAgIC8vIDB+NCBieXRlczogdmVyc2lvbigwKSAmIGZsYWdzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gc2FtcGxlc1tpXS5mbGFncztcbiAgICAgICAgICAgIGRhdGFbaSArIDRdID0gKGZsYWdzLmlzTGVhZGluZyA8PCA2KSAgICAvLyBpc19sZWFkaW5nOiAyIChiaXQpXG4gICAgICAgICAgICAgICAgICAgICAgICB8IChmbGFncy5kZXBlbmRzT24gPDwgNCkgICAgLy8gc2FtcGxlX2RlcGVuZHNfb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZsYWdzLmlzRGVwZW5kZWRPbiA8PCAyKSAvLyBzYW1wbGVfaXNfZGVwZW5kZWRfb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZsYWdzLmhhc1JlZHVuZGFuY3kpOyAgICAvLyBzYW1wbGVfaGFzX3JlZHVuZGFuY3lcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuc2R0cCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgZnJhZ21lbnQgcnVuIGJveFxuICAgIHN0YXRpYyB0cnVuKHRyYWNrLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHNhbXBsZXMgPSB0cmFjay5zYW1wbGVzIHx8IFtdO1xuICAgICAgICBsZXQgc2FtcGxlQ291bnQgPSBzYW1wbGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IGRhdGFTaXplID0gMTIgKyAxNiAqIHNhbXBsZUNvdW50O1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGFTaXplKTtcbiAgICAgICAgb2Zmc2V0ICs9IDggKyBkYXRhU2l6ZTtcblxuICAgICAgICBkYXRhLnNldChbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDBGLCAweDAxLCAgICAgIC8vIHZlcnNpb24oMCkgJiBmbGFnc1xuICAgICAgICAgICAgKHNhbXBsZUNvdW50ID4+PiAyNCkgJiAweEZGLCAvLyBzYW1wbGVfY291bnRcbiAgICAgICAgICAgIChzYW1wbGVDb3VudCA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChzYW1wbGVDb3VudCA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChzYW1wbGVDb3VudCkgJiAweEZGLFxuICAgICAgICAgICAgKG9mZnNldCA+Pj4gMjQpICYgMHhGRiwgICAgICAvLyBkYXRhX29mZnNldFxuICAgICAgICAgICAgKG9mZnNldCA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChvZmZzZXQgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAob2Zmc2V0KSAmIDB4RkZcbiAgICAgICAgXSwgMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBzYW1wbGVzW2ldLmR1cmF0aW9uO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzYW1wbGVzW2ldLnNpemU7XG4gICAgICAgICAgICBsZXQgZmxhZ3MgPSBzYW1wbGVzW2ldLmZsYWdzO1xuICAgICAgICAgICAgbGV0IGN0cyA9IHNhbXBsZXNbaV0uY3RzO1xuICAgICAgICAgICAgZGF0YS5zZXQoW1xuICAgICAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMjQpICYgMHhGRiwgIC8vIHNhbXBsZV9kdXJhdGlvblxuICAgICAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoZHVyYXRpb24gPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKGR1cmF0aW9uKSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKHNpemUgPj4+IDI0KSAmIDB4RkYsICAgICAgLy8gc2FtcGxlX3NpemVcbiAgICAgICAgICAgICAgICAoc2l6ZSA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoc2l6ZSA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoc2l6ZSkgJiAweEZGLFxuICAgICAgICAgICAgICAgIChmbGFncy5pc0xlYWRpbmcgPDwgMikgfCBmbGFncy5kZXBlbmRzT24sICAvLyBzYW1wbGVfZmxhZ3NcbiAgICAgICAgICAgICAgICAoZmxhZ3MuaXNEZXBlbmRlZE9uIDw8IDYpIHwgKGZsYWdzLmhhc1JlZHVuZGFuY3kgPDwgNCkgfCBmbGFncy5pc05vblN5bmMsXG4gICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgLy8gc2FtcGxlX2RlZ3JhZGF0aW9uX3ByaW9yaXR5XG4gICAgICAgICAgICAgICAgKGN0cyA+Pj4gMjQpICYgMHhGRiwgICAgICAgLy8gc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0XG4gICAgICAgICAgICAgICAgKGN0cyA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoY3RzID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgICAgIChjdHMpICYgMHhGRlxuICAgICAgICAgICAgXSwgMTIgKyAxNiAqIGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy50cnVuLCBkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWRhdChkYXRhKSB7XG4gICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5tZGF0LCBkYXRhKTtcbiAgICB9XG5cbn1cblxuTVA0LmluaXQoKTtcblxuZXhwb3J0IGRlZmF1bHQgTVA0OyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgTVA0IGZyb20gJy4vbXA0LWdlbmVyYXRvci5qcyc7XG5pbXBvcnQgQUFDIGZyb20gJy4vYWFjLXNpbGVudC5qcyc7XG5pbXBvcnQgQnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCB7U2FtcGxlSW5mbywgTWVkaWFTZWdtZW50SW5mbywgTWVkaWFTZWdtZW50SW5mb0xpc3R9IGZyb20gJy4uL2NvcmUvbWVkaWEtc2VnbWVudC1pbmZvLmpzJztcbmltcG9ydCB7SWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG5cbi8vIEZyYWdtZW50ZWQgbXA0IHJlbXV4ZXJcbmNsYXNzIE1QNFJlbXV4ZXIge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ01QNFJlbXV4ZXInO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5faXNMaXZlID0gKGNvbmZpZy5pc0xpdmUgPT09IHRydWUpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2R0c0Jhc2UgPSAtMTtcbiAgICAgICAgdGhpcy5fZHRzQmFzZUluaXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hdWRpb0R0c0Jhc2UgPSBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5fdmlkZW9EdHNCYXNlID0gSW5maW5pdHk7XG4gICAgICAgIHRoaXMuX2F1ZGlvTmV4dER0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdmlkZW9OZXh0RHRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9hdWRpb1N0YXNoZWRMYXN0U2FtcGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fYXVkaW9NZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9NZXRhID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9hdWRpb1NlZ21lbnRJbmZvTGlzdCA9IG5ldyBNZWRpYVNlZ21lbnRJbmZvTGlzdCgnYXVkaW8nKTtcbiAgICAgICAgdGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QgPSBuZXcgTWVkaWFTZWdtZW50SW5mb0xpc3QoJ3ZpZGVvJyk7XG5cbiAgICAgICAgdGhpcy5fb25Jbml0U2VnbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uTWVkaWFTZWdtZW50ID0gbnVsbDtcblxuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBjaHJvbWUgPCA1MDogQWx3YXlzIGZvcmNlIGZpcnN0IHNhbXBsZSBhcyBhIFJhbmRvbSBBY2Nlc3MgUG9pbnQgaW4gbWVkaWEgc2VnbWVudFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjI5NDEyXG4gICAgICAgIHRoaXMuX2ZvcmNlRmlyc3RJRFIgPSAoQnJvd3Nlci5jaHJvbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCcm93c2VyLnZlcnNpb24ubWFqb3IgPCA1MCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJyb3dzZXIudmVyc2lvbi5tYWpvciA9PT0gNTAgJiYgQnJvd3Nlci52ZXJzaW9uLmJ1aWxkIDwgMjY2MSkpKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRTExL0VkZ2U6IEZpbGwgc2lsZW50IGFhYyBmcmFtZSBhZnRlciBrZXlmcmFtZS1zZWVraW5nXG4gICAgICAgIC8vIE1ha2UgYXVkaW8gYmVnaW5EdHMgZXF1YWxzIHdpdGggdmlkZW8gYmVnaW5EdHMsIGluIG9yZGVyIHRvIGZpeCBzZWVrIGZyZWV6ZVxuICAgICAgICB0aGlzLl9maWxsU2lsZW50QWZ0ZXJTZWVrID0gKEJyb3dzZXIubXNlZGdlIHx8IEJyb3dzZXIubXNpZSk7XG5cbiAgICAgICAgLy8gV2hpbGUgb25seSBGaXJlRm94IHN1cHBvcnRzICdhdWRpby9tcDQsIGNvZGVjcz1cIm1wM1wiJywgdXNlICdhdWRpby9tcGVnJyBmb3IgY2hyb21lLCBzYWZhcmksIC4uLlxuICAgICAgICB0aGlzLl9tcDNVc2VNcGVnQXVkaW8gPSAhQnJvd3Nlci5maXJlZm94O1xuXG4gICAgICAgIHRoaXMuX2ZpbGxBdWRpb1RpbWVzdGFtcEdhcCA9IHRoaXMuX2NvbmZpZy5maXhBdWRpb1RpbWVzdGFtcEdhcDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9kdHNCYXNlID0gLTE7XG4gICAgICAgIHRoaXMuX2R0c0Jhc2VJbml0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXVkaW9NZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9NZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5jbGVhcigpO1xuICAgICAgICB0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uSW5pdFNlZ21lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbk1lZGlhU2VnbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgYmluZERhdGFTb3VyY2UocHJvZHVjZXIpIHtcbiAgICAgICAgcHJvZHVjZXIub25EYXRhQXZhaWxhYmxlID0gdGhpcy5yZW11eC5iaW5kKHRoaXMpO1xuICAgICAgICBwcm9kdWNlci5vblRyYWNrTWV0YWRhdGEgPSB0aGlzLl9vblRyYWNrTWV0YWRhdGFSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKiBwcm90b3R5cGU6IGZ1bmN0aW9uIG9uSW5pdFNlZ21lbnQodHlwZTogc3RyaW5nLCBpbml0U2VnbWVudDogQXJyYXlCdWZmZXIpOiB2b2lkXG4gICAgICAgSW5pdFNlZ21lbnQ6IHtcbiAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlcixcbiAgICAgICAgICAgY29kZWM6IHN0cmluZyxcbiAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdcbiAgICAgICB9XG4gICAgKi9cbiAgICBnZXQgb25Jbml0U2VnbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uSW5pdFNlZ21lbnQ7XG4gICAgfVxuXG4gICAgc2V0IG9uSW5pdFNlZ21lbnQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Jbml0U2VnbWVudCA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qIHByb3RvdHlwZTogZnVuY3Rpb24gb25NZWRpYVNlZ21lbnQodHlwZTogc3RyaW5nLCBtZWRpYVNlZ21lbnQ6IE1lZGlhU2VnbWVudCk6IHZvaWRcbiAgICAgICBNZWRpYVNlZ21lbnQ6IHtcbiAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlcixcbiAgICAgICAgICAgc2FtcGxlQ291bnQ6IGludDMyXG4gICAgICAgICAgIGluZm86IE1lZGlhU2VnbWVudEluZm9cbiAgICAgICB9XG4gICAgKi9cbiAgICBnZXQgb25NZWRpYVNlZ21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbk1lZGlhU2VnbWVudDtcbiAgICB9XG5cbiAgICBzZXQgb25NZWRpYVNlZ21lbnQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25NZWRpYVNlZ21lbnQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBpbnNlcnREaXNjb250aW51aXR5KCkge1xuICAgICAgICB0aGlzLl9hdWRpb05leHREdHMgPSB0aGlzLl92aWRlb05leHREdHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2VlayhvcmlnaW5hbER0cykge1xuICAgICAgICB0aGlzLl9hdWRpb1N0YXNoZWRMYXN0U2FtcGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvU2VnbWVudEluZm9MaXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcmVtdXgoYXVkaW9UcmFjaywgdmlkZW9UcmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuX29uTWVkaWFTZWdtZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdNUDRSZW11eGVyOiBvbk1lZGlhU2VnbWVudCBjYWxsYmFjayBtdXN0IGJlIHNwZWNpZmljZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9kdHNCYXNlSW5pdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVEdHNCYXNlKGF1ZGlvVHJhY2ssIHZpZGVvVHJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbXV4VmlkZW8odmlkZW9UcmFjayk7XG4gICAgICAgIHRoaXMuX3JlbXV4QXVkaW8oYXVkaW9UcmFjayk7XG4gICAgfVxuXG4gICAgX29uVHJhY2tNZXRhZGF0YVJlY2VpdmVkKHR5cGUsIG1ldGFkYXRhKSB7XG4gICAgICAgIGxldCBtZXRhYm94ID0gbnVsbDtcblxuICAgICAgICBsZXQgY29udGFpbmVyID0gJ21wNCc7XG4gICAgICAgIGxldCBjb2RlYyA9IG1ldGFkYXRhLmNvZGVjO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLl9hdWRpb01ldGEgPSBtZXRhZGF0YTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5jb2RlYyA9PT0gJ21wMycgJiYgdGhpcy5fbXAzVXNlTXBlZ0F1ZGlvKSB7XG4gICAgICAgICAgICAgICAgLy8gJ2F1ZGlvL21wZWcnIGZvciBNUDMgYXVkaW8gdHJhY2tcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSAnbXBlZyc7XG4gICAgICAgICAgICAgICAgY29kZWMgPSAnJztcbiAgICAgICAgICAgICAgICBtZXRhYm94ID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gJ2F1ZGlvL21wNCwgY29kZWNzPVwiY29kZWNcIidcbiAgICAgICAgICAgICAgICBtZXRhYm94ID0gTVA0LmdlbmVyYXRlSW5pdFNlZ21lbnQobWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvTWV0YSA9IG1ldGFkYXRhO1xuICAgICAgICAgICAgbWV0YWJveCA9IE1QNC5nZW5lcmF0ZUluaXRTZWdtZW50KG1ldGFkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpc3BhdGNoIG1ldGFib3ggKEluaXRpYWxpemF0aW9uIFNlZ21lbnQpXG4gICAgICAgIGlmICghdGhpcy5fb25Jbml0U2VnbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignTVA0UmVtdXhlcjogb25Jbml0U2VnbWVudCBjYWxsYmFjayBtdXN0IGJlIHNwZWNpZmllZCEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vbkluaXRTZWdtZW50KHR5cGUsIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBkYXRhOiBtZXRhYm94LmJ1ZmZlcixcbiAgICAgICAgICAgIGNvZGVjOiBjb2RlYyxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogYCR7dHlwZX0vJHtjb250YWluZXJ9YCxcbiAgICAgICAgICAgIG1lZGlhRHVyYXRpb246IG1ldGFkYXRhLmR1cmF0aW9uICAvLyBpbiB0aW1lc2NhbGUgMTAwMCAobWlsbGlzZWNvbmRzKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlRHRzQmFzZShhdWRpb1RyYWNrLCB2aWRlb1RyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLl9kdHNCYXNlSW5pdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXVkaW9UcmFjay5zYW1wbGVzICYmIGF1ZGlvVHJhY2suc2FtcGxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1ZGlvRHRzQmFzZSA9IGF1ZGlvVHJhY2suc2FtcGxlc1swXS5kdHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpZGVvVHJhY2suc2FtcGxlcyAmJiB2aWRlb1RyYWNrLnNhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb0R0c0Jhc2UgPSB2aWRlb1RyYWNrLnNhbXBsZXNbMF0uZHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZHRzQmFzZSA9IE1hdGgubWluKHRoaXMuX2F1ZGlvRHRzQmFzZSwgdGhpcy5fdmlkZW9EdHNCYXNlKTtcbiAgICAgICAgdGhpcy5fZHRzQmFzZUluaXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZmx1c2hTdGFzaGVkU2FtcGxlcygpIHtcbiAgICAgICAgbGV0IHZpZGVvU2FtcGxlID0gdGhpcy5fdmlkZW9TdGFzaGVkTGFzdFNhbXBsZTtcbiAgICAgICAgbGV0IGF1ZGlvU2FtcGxlID0gdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZTtcblxuICAgICAgICBsZXQgdmlkZW9UcmFjayA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgICAgICAgc2FtcGxlczogW10sXG4gICAgICAgICAgICBsZW5ndGg6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodmlkZW9TYW1wbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmlkZW9UcmFjay5zYW1wbGVzLnB1c2godmlkZW9TYW1wbGUpO1xuICAgICAgICAgICAgdmlkZW9UcmFjay5sZW5ndGggPSB2aWRlb1NhbXBsZS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXVkaW9UcmFjayA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdhdWRpbycsXG4gICAgICAgICAgICBpZDogMixcbiAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgICAgICAgc2FtcGxlczogW10sXG4gICAgICAgICAgICBsZW5ndGg6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXVkaW9TYW1wbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXVkaW9UcmFjay5zYW1wbGVzLnB1c2goYXVkaW9TYW1wbGUpO1xuICAgICAgICAgICAgYXVkaW9UcmFjay5sZW5ndGggPSBhdWRpb1NhbXBsZS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl92aWRlb1N0YXNoZWRMYXN0U2FtcGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fcmVtdXhWaWRlbyh2aWRlb1RyYWNrLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fcmVtdXhBdWRpbyhhdWRpb1RyYWNrLCB0cnVlKTtcbiAgICB9XG5cbiAgICBfcmVtdXhBdWRpbyhhdWRpb1RyYWNrLCBmb3JjZSkge1xuICAgICAgICBpZiAodGhpcy5fYXVkaW9NZXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFjayA9IGF1ZGlvVHJhY2s7XG4gICAgICAgIGxldCBzYW1wbGVzID0gdHJhY2suc2FtcGxlcztcbiAgICAgICAgbGV0IGR0c0NvcnJlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBmaXJzdER0cyA9IC0xLCBsYXN0RHRzID0gLTEsIGxhc3RQdHMgPSAtMTtcbiAgICAgICAgbGV0IHJlZlNhbXBsZUR1cmF0aW9uID0gdGhpcy5fYXVkaW9NZXRhLnJlZlNhbXBsZUR1cmF0aW9uO1xuXG4gICAgICAgIGxldCBtcGVnUmF3VHJhY2sgPSB0aGlzLl9hdWRpb01ldGEuY29kZWMgPT09ICdtcDMnICYmIHRoaXMuX21wM1VzZU1wZWdBdWRpbztcbiAgICAgICAgbGV0IGZpcnN0U2VnbWVudEFmdGVyU2VlayA9IHRoaXMuX2R0c0Jhc2VJbml0ZWQgJiYgdGhpcy5fYXVkaW9OZXh0RHRzID09PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGluc2VydFByZWZpeFNpbGVudEZyYW1lID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFzYW1wbGVzIHx8IHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbXBsZXMubGVuZ3RoID09PSAxICYmICFmb3JjZSkge1xuICAgICAgICAgICAgLy8gSWYgW3NhbXBsZSBjb3VudCBpbiBjdXJyZW50IGJhdGNoXSA9PT0gMSAmJiAoZm9yY2UgIT0gdHJ1ZSlcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbmQga2VlcCBpbiBkZW11eGVyJ3MgcXVldWVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAgLy8gZWxzZSBpZiAoZm9yY2UgPT09IHRydWUpIGRvIHJlbXV4XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGxldCBtZGF0Ym94ID0gbnVsbDtcbiAgICAgICAgbGV0IG1kYXRCeXRlcyA9IDA7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGluaXRpYWwgbWRhdCBzaXplXG4gICAgICAgIGlmIChtcGVnUmF3VHJhY2spIHtcbiAgICAgICAgICAgIC8vIGZvciByYXcgbXBlZyBidWZmZXJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICBtZGF0Qnl0ZXMgPSB0cmFjay5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmb3IgZm1wNCBtZGF0IGJveFxuICAgICAgICAgICAgb2Zmc2V0ID0gODsgIC8vIHNpemUgKyB0eXBlXG4gICAgICAgICAgICBtZGF0Qnl0ZXMgPSA4ICsgdHJhY2subGVuZ3RoO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgbGFzdFNhbXBsZSA9IG51bGw7XG5cbiAgICAgICAgLy8gUG9wIHRoZSBsYXN0U2FtcGxlIGFuZCB3YWl0aW5nIGZvciBzdGFzaFxuICAgICAgICBpZiAoc2FtcGxlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsYXN0U2FtcGxlID0gc2FtcGxlcy5wb3AoKTtcbiAgICAgICAgICAgIG1kYXRCeXRlcyAtPSBsYXN0U2FtcGxlLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluc2VydCBbc3Rhc2hlZCBsYXN0U2FtcGxlIGluIHRoZSBwcmV2aW91cyBiYXRjaF0gdG8gdGhlIGZyb250XG4gICAgICAgIGlmICh0aGlzLl9hdWRpb1N0YXNoZWRMYXN0U2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBzYW1wbGUgPSB0aGlzLl9hdWRpb1N0YXNoZWRMYXN0U2FtcGxlO1xuICAgICAgICAgICAgdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgICAgICBzYW1wbGVzLnVuc2hpZnQoc2FtcGxlKTtcbiAgICAgICAgICAgIG1kYXRCeXRlcyArPSBzYW1wbGUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIGxhc3RTYW1wbGUgb2YgY3VycmVudCBiYXRjaCwgd2FpdGluZyBmb3IgbmV4dCBiYXRjaFxuICAgICAgICBpZiAobGFzdFNhbXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9hdWRpb1N0YXNoZWRMYXN0U2FtcGxlID0gbGFzdFNhbXBsZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgPSBzYW1wbGVzWzBdLmR0cyAtIHRoaXMuX2R0c0Jhc2U7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGR0c0NvcnJlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvTmV4dER0cykge1xuICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgLSB0aGlzLl9hdWRpb05leHREdHM7XG4gICAgICAgIH0gZWxzZSB7ICAvLyB0aGlzLl9hdWRpb05leHREdHMgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGxTaWxlbnRBZnRlclNlZWsgJiYgIXRoaXMuX3ZpZGVvU2VnbWVudEluZm9MaXN0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXVkaW9NZXRhLm9yaWdpbmFsQ29kZWMgIT09ICdtcDMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRQcmVmaXhTaWxlbnRGcmFtZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0U2FtcGxlID0gdGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QuZ2V0TGFzdFNhbXBsZUJlZm9yZShmaXJzdFNhbXBsZU9yaWdpbmFsRHRzKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFNhbXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IChmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gKGxhc3RTYW1wbGUub3JpZ2luYWxEdHMgKyBsYXN0U2FtcGxlLmR1cmF0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkRHRzID0gbGFzdFNhbXBsZS5kdHMgKyBsYXN0U2FtcGxlLmR1cmF0aW9uICsgZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGR0c0NvcnJlY3Rpb24gPSBmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gZXhwZWN0ZWREdHM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbGFzdFNhbXBsZSA9PSBudWxsLCBjYW5ub3QgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc2VydFByZWZpeFNpbGVudEZyYW1lKSB7XG4gICAgICAgICAgICAvLyBhbGlnbiBhdWRpbyBzZWdtZW50IGJlZ2luRHRzIHRvIG1hdGNoIHdpdGggY3VycmVudCB2aWRlbyBzZWdtZW50J3MgYmVnaW5EdHNcbiAgICAgICAgICAgIGxldCBmaXJzdFNhbXBsZUR0cyA9IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgLSBkdHNDb3JyZWN0aW9uO1xuICAgICAgICAgICAgbGV0IHZpZGVvU2VnbWVudCA9IHRoaXMuX3ZpZGVvU2VnbWVudEluZm9MaXN0LmdldExhc3RTZWdtZW50QmVmb3JlKGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMpO1xuICAgICAgICAgICAgaWYgKHZpZGVvU2VnbWVudCAhPSBudWxsICYmIHZpZGVvU2VnbWVudC5iZWdpbkR0cyA8IGZpcnN0U2FtcGxlRHRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNpbGVudFVuaXQgPSBBQUMuZ2V0U2lsZW50RnJhbWUodGhpcy5fYXVkaW9NZXRhLm9yaWdpbmFsQ29kZWMsIHRoaXMuX2F1ZGlvTWV0YS5jaGFubmVsQ291bnQpO1xuICAgICAgICAgICAgICAgIGlmIChzaWxlbnRVbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkdHMgPSB2aWRlb1NlZ21lbnQuYmVnaW5EdHM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWxlbnRGcmFtZUR1cmF0aW9uID0gZmlyc3RTYW1wbGVEdHMgLSB2aWRlb1NlZ21lbnQuYmVnaW5EdHM7XG4gICAgICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCBgSW5zZXJ0UHJlZml4U2lsZW50QXVkaW86IGR0czogJHtkdHN9LCBkdXJhdGlvbjogJHtzaWxlbnRGcmFtZUR1cmF0aW9ufWApO1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLnVuc2hpZnQoe3VuaXQ6IHNpbGVudFVuaXQsIGR0czogZHRzLCBwdHM6IGR0c30pO1xuICAgICAgICAgICAgICAgICAgICBtZGF0Qnl0ZXMgKz0gc2lsZW50VW5pdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gIC8vIHNpbGVudFVuaXQgPT0gbnVsbDogQ2Fubm90IGdlbmVyYXRlLCBza2lwXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc2VydFByZWZpeFNpbGVudEZyYW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbXA0U2FtcGxlcyA9IFtdO1xuXG4gICAgICAgIC8vIENvcnJlY3QgZHRzIGZvciBlYWNoIHNhbXBsZSwgYW5kIGNhbGN1bGF0ZSBzYW1wbGUgZHVyYXRpb24uIFRoZW4gb3V0cHV0IHRvIG1wNFNhbXBsZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc2FtcGxlID0gc2FtcGxlc1tpXTtcbiAgICAgICAgICAgIGxldCB1bml0ID0gc2FtcGxlLnVuaXQ7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxEdHMgPSBzYW1wbGUuZHRzIC0gdGhpcy5fZHRzQmFzZTtcbiAgICAgICAgICAgIGxldCBkdHMgPSBvcmlnaW5hbER0cyAtIGR0c0NvcnJlY3Rpb247XG5cbiAgICAgICAgICAgIGlmIChmaXJzdER0cyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBmaXJzdER0cyA9IGR0cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNhbXBsZUR1cmF0aW9uID0gMDtcblxuICAgICAgICAgICAgaWYgKGkgIT09IHNhbXBsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0RHRzID0gc2FtcGxlc1tpICsgMV0uZHRzIC0gdGhpcy5fZHRzQmFzZSAtIGR0c0NvcnJlY3Rpb247XG4gICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBuZXh0RHRzIC0gZHRzO1xuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHRoZSBsYXN0IHNhbXBsZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0U2FtcGxlICE9IG51bGwpIHsgIC8vIHVzZSBzdGFzaGVkIHNhbXBsZSdzIGR0cyB0byBjYWxjdWxhdGUgc2FtcGxlIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0RHRzID0gbGFzdFNhbXBsZS5kdHMgLSB0aGlzLl9kdHNCYXNlIC0gZHRzQ29ycmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBuZXh0RHRzIC0gZHRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXA0U2FtcGxlcy5sZW5ndGggPj0gMSkgeyAgLy8gdXNlIHNlY29uZCBsYXN0IHNhbXBsZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1wNFNhbXBsZXNbbXA0U2FtcGxlcy5sZW5ndGggLSAxXS5kdXJhdGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gdGhlIG9ubHkgb25lIHNhbXBsZSwgdXNlIHJlZmVyZW5jZSBzYW1wbGUgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBNYXRoLmZsb29yKHJlZlNhbXBsZUR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuZWVkRmlsbFNpbGVudEZyYW1lcyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHNpbGVudEZyYW1lcyA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIFNpbGVudCBmcmFtZSBnZW5lcmF0aW9uLCBpZiBsYXJnZSB0aW1lc3RhbXAgZ2FwIGRldGVjdGVkICYmIGNvbmZpZy5maXhBdWRpb1RpbWVzdGFtcEdhcFxuICAgICAgICAgICAgaWYgKHNhbXBsZUR1cmF0aW9uID4gcmVmU2FtcGxlRHVyYXRpb24gKiAxLjUgJiYgdGhpcy5fYXVkaW9NZXRhLmNvZGVjICE9PSAnbXAzJyAmJiB0aGlzLl9maWxsQXVkaW9UaW1lc3RhbXBHYXAgJiYgIUJyb3dzZXIuc2FmYXJpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBpbnNlcnQgc2lsZW50IGZyYW1lcyB0byBmaWxsIHRpbWVzdGFtcCBnYXBcbiAgICAgICAgICAgICAgICBuZWVkRmlsbFNpbGVudEZyYW1lcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGRlbHRhID0gTWF0aC5hYnMoc2FtcGxlRHVyYXRpb24gLSByZWZTYW1wbGVEdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgbGV0IGZyYW1lQ291bnQgPSBNYXRoLmNlaWwoZGVsdGEgLyByZWZTYW1wbGVEdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnREdHMgPSBkdHMgKyByZWZTYW1wbGVEdXJhdGlvbjsgIC8vIE5vdGljZTogaW4gZmxvYXRcblxuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnTGFyZ2UgYXVkaW8gdGltZXN0YW1wIGdhcCBkZXRlY3RlZCwgbWF5IGNhdXNlIEFWIHN5bmMgdG8gZHJpZnQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2lsZW50IGZyYW1lcyB3aWxsIGJlIGdlbmVyYXRlZCB0byBhdm9pZCB1bnN5bmMuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBkdHM6ICR7ZHRzICsgc2FtcGxlRHVyYXRpb259IG1zLCBleHBlY3RlZDogJHtkdHMgKyBNYXRoLnJvdW5kKHJlZlNhbXBsZUR1cmF0aW9uKX0gbXMsIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZGVsdGE6ICR7TWF0aC5yb3VuZChkZWx0YSl9IG1zLCBnZW5lcmF0ZTogJHtmcmFtZUNvdW50fSBmcmFtZXNgKTtcblxuICAgICAgICAgICAgICAgIGxldCBzaWxlbnRVbml0ID0gQUFDLmdldFNpbGVudEZyYW1lKHRoaXMuX2F1ZGlvTWV0YS5vcmlnaW5hbENvZGVjLCB0aGlzLl9hdWRpb01ldGEuY2hhbm5lbENvdW50KTtcbiAgICAgICAgICAgICAgICBpZiAoc2lsZW50VW5pdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnVW5hYmxlIHRvIGdlbmVyYXRlIHNpbGVudCBmcmFtZSBmb3IgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9hdWRpb01ldGEub3JpZ2luYWxDb2RlY30gd2l0aCAke3RoaXMuX2F1ZGlvTWV0YS5jaGFubmVsQ291bnR9IGNoYW5uZWxzLCByZXBlYXQgbGFzdCBmcmFtZWApO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXBlYXQgbGFzdCBmcmFtZVxuICAgICAgICAgICAgICAgICAgICBzaWxlbnRVbml0ID0gdW5pdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2lsZW50RnJhbWVzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZyYW1lQ291bnQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50RHRzID0gTWF0aC5yb3VuZChjdXJyZW50RHRzKTsgIC8vIHJvdW5kIHRvIGludGVnZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudEZyYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgcHJldmlvdXMgZnJhbWUgc2FtcGxlIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNGcmFtZSA9IHNpbGVudEZyYW1lc1tzaWxlbnRGcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0ZyYW1lLmR1cmF0aW9uID0gaW50RHRzIC0gcHJldmlvdXNGcmFtZS5kdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHRzOiBpbnREdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwdHM6IGludER0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0czogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6IHNpbGVudFVuaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBzaWxlbnRVbml0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCwgIC8vIHdhaXQgZm9yIG5leHQgc2FtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbER0czogb3JpZ2luYWxEdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT246IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXBlbmRlZE9uOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JlZHVuZGFuY3k6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2lsZW50RnJhbWVzLnB1c2goZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgICBtZGF0Qnl0ZXMgKz0gdW5pdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RHRzICs9IHJlZlNhbXBsZUR1cmF0aW9uO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGxhc3QgZnJhbWU6IGFsaWduIGVuZCB0aW1lIHRvIG5leHQgZnJhbWUgZHRzXG4gICAgICAgICAgICAgICAgbGV0IGxhc3RGcmFtZSA9IHNpbGVudEZyYW1lc1tzaWxlbnRGcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGFzdEZyYW1lLmR1cmF0aW9uID0gZHRzICsgc2FtcGxlRHVyYXRpb24gLSBsYXN0RnJhbWUuZHRzO1xuXG4gICAgICAgICAgICAgICAgLy8gc2lsZW50RnJhbWVzLmZvckVhY2goKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIExvZy53KHRoaXMuVEFHLCBgU2lsZW50QXVkaW86IGR0czogJHtmcmFtZS5kdHN9LCBkdXJhdGlvbjogJHtmcmFtZS5kdXJhdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAvLyB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFNldCBjb3JyZWN0IHNhbXBsZSBkdXJhdGlvbiBmb3IgY3VycmVudCBmcmFtZVxuICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gTWF0aC5yb3VuZChyZWZTYW1wbGVEdXJhdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1wNFNhbXBsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZHRzOiBkdHMsXG4gICAgICAgICAgICAgICAgcHRzOiBkdHMsXG4gICAgICAgICAgICAgICAgY3RzOiAwLFxuICAgICAgICAgICAgICAgIHVuaXQ6IHNhbXBsZS51bml0LFxuICAgICAgICAgICAgICAgIHNpemU6IHNhbXBsZS51bml0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IHNhbXBsZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRHRzOiBvcmlnaW5hbER0cyxcbiAgICAgICAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgICAgICAgICBpc0xlYWRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbjogMSxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXBlbmRlZE9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBoYXNSZWR1bmRhbmN5OiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChuZWVkRmlsbFNpbGVudEZyYW1lcykge1xuICAgICAgICAgICAgICAgIC8vIFNpbGVudCBmcmFtZXMgc2hvdWxkIGJlIGluc2VydGVkIGFmdGVyIHdyb25nLWR1cmF0aW9uIGZyYW1lXG4gICAgICAgICAgICAgICAgbXA0U2FtcGxlcy5wdXNoLmFwcGx5KG1wNFNhbXBsZXMsIHNpbGVudEZyYW1lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGxvY2F0ZSBtZGF0Ym94XG4gICAgICAgIGlmIChtcGVnUmF3VHJhY2spIHtcbiAgICAgICAgICAgIC8vIGFsbG9jYXRlIGZvciByYXcgbXBlZyBidWZmZXJcbiAgICAgICAgICAgIG1kYXRib3ggPSBuZXcgVWludDhBcnJheShtZGF0Qnl0ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWxsb2NhdGUgZm9yIGZtcDQgbWRhdCBib3hcbiAgICAgICAgICAgIG1kYXRib3ggPSBuZXcgVWludDhBcnJheShtZGF0Qnl0ZXMpO1xuICAgICAgICAgICAgLy8gc2l6ZSBmaWVsZFxuICAgICAgICAgICAgbWRhdGJveFswXSA9IChtZGF0Qnl0ZXMgPj4+IDI0KSAmIDB4RkY7XG4gICAgICAgICAgICBtZGF0Ym94WzFdID0gKG1kYXRCeXRlcyA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgICAgIG1kYXRib3hbMl0gPSAobWRhdEJ5dGVzID4+PiAgOCkgJiAweEZGO1xuICAgICAgICAgICAgbWRhdGJveFszXSA9IChtZGF0Qnl0ZXMpICYgMHhGRjtcbiAgICAgICAgICAgIC8vIHR5cGUgZmllbGQgKGZvdXJDQylcbiAgICAgICAgICAgIG1kYXRib3guc2V0KE1QNC50eXBlcy5tZGF0LCA0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHNhbXBsZXMgaW50byBtZGF0Ym94XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXA0U2FtcGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHVuaXQgPSBtcDRTYW1wbGVzW2ldLnVuaXQ7XG4gICAgICAgICAgICBtZGF0Ym94LnNldCh1bml0LCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHVuaXQuYnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXRlc3QgPSBtcDRTYW1wbGVzW21wNFNhbXBsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGxhc3REdHMgPSBsYXRlc3QuZHRzICsgbGF0ZXN0LmR1cmF0aW9uO1xuICAgICAgICB0aGlzLl9hdWRpb05leHREdHMgPSBsYXN0RHRzO1xuXG4gICAgICAgIC8vIGZpbGwgbWVkaWEgc2VnbWVudCBpbmZvICYgYWRkIHRvIGluZm8gbGlzdFxuICAgICAgICBsZXQgaW5mbyA9IG5ldyBNZWRpYVNlZ21lbnRJbmZvKCk7XG4gICAgICAgIGluZm8uYmVnaW5EdHMgPSBmaXJzdER0cztcbiAgICAgICAgaW5mby5lbmREdHMgPSBsYXN0RHRzO1xuICAgICAgICBpbmZvLmJlZ2luUHRzID0gZmlyc3REdHM7XG4gICAgICAgIGluZm8uZW5kUHRzID0gbGFzdER0cztcbiAgICAgICAgaW5mby5vcmlnaW5hbEJlZ2luRHRzID0gbXA0U2FtcGxlc1swXS5vcmlnaW5hbER0cztcbiAgICAgICAgaW5mby5vcmlnaW5hbEVuZER0cyA9IGxhdGVzdC5vcmlnaW5hbER0cyArIGxhdGVzdC5kdXJhdGlvbjtcbiAgICAgICAgaW5mby5maXJzdFNhbXBsZSA9IG5ldyBTYW1wbGVJbmZvKG1wNFNhbXBsZXNbMF0uZHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0U2FtcGxlc1swXS5wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0U2FtcGxlc1swXS5vcmlnaW5hbER0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgaW5mby5sYXN0U2FtcGxlID0gbmV3IFNhbXBsZUluZm8obGF0ZXN0LmR0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LnB0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3Qub3JpZ2luYWxEdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0xpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0LmFwcGVuZChpbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrLnNhbXBsZXMgPSBtcDRTYW1wbGVzO1xuICAgICAgICB0cmFjay5zZXF1ZW5jZU51bWJlcisrO1xuXG4gICAgICAgIGxldCBtb29mYm94ID0gbnVsbDtcblxuICAgICAgICBpZiAobXBlZ1Jhd1RyYWNrKSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBlbXB0eSBidWZmZXIsIGJlY2F1c2UgdXNlbGVzcyBmb3IgcmF3IG1wZWdcbiAgICAgICAgICAgIG1vb2Zib3ggPSBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2VuZXJhdGUgbW9vZiBmb3IgZm1wNCBzZWdtZW50XG4gICAgICAgICAgICBtb29mYm94ID0gTVA0Lm1vb2YodHJhY2ssIGZpcnN0RHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrLnNhbXBsZXMgPSBbXTtcbiAgICAgICAgdHJhY2subGVuZ3RoID0gMDtcblxuICAgICAgICBsZXQgc2VnbWVudCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdhdWRpbycsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9tZXJnZUJveGVzKG1vb2Zib3gsIG1kYXRib3gpLmJ1ZmZlcixcbiAgICAgICAgICAgIHNhbXBsZUNvdW50OiBtcDRTYW1wbGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZm86IGluZm9cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobXBlZ1Jhd1RyYWNrICYmIGZpcnN0U2VnbWVudEFmdGVyU2Vlaykge1xuICAgICAgICAgICAgLy8gRm9yIE1QRUcgYXVkaW8gc3RyZWFtIGluIE1TRSwgaWYgc2Vla2luZyBvY2N1cnJlZCwgYmVmb3JlIGFwcGVuZGluZyBuZXcgYnVmZmVyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIGV4cGxpY2l0bHkgc2V0IHRpbWVzdGFtcE9mZnNldCB0byB0aGUgZGVzaXJlZCBwb2ludCBpbiB0aW1lbGluZSBmb3IgbXBlZyBTb3VyY2VCdWZmZXIuXG4gICAgICAgICAgICBzZWdtZW50LnRpbWVzdGFtcE9mZnNldCA9IGZpcnN0RHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25NZWRpYVNlZ21lbnQoJ2F1ZGlvJywgc2VnbWVudCk7XG4gICAgfVxuXG4gICAgX3JlbXV4VmlkZW8odmlkZW9UcmFjaywgZm9yY2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZpZGVvTWV0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2sgPSB2aWRlb1RyYWNrO1xuICAgICAgICBsZXQgc2FtcGxlcyA9IHRyYWNrLnNhbXBsZXM7XG4gICAgICAgIGxldCBkdHNDb3JyZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZmlyc3REdHMgPSAtMSwgbGFzdER0cyA9IC0xO1xuICAgICAgICBsZXQgZmlyc3RQdHMgPSAtMSwgbGFzdFB0cyA9IC0xO1xuXG4gICAgICAgIGlmICghc2FtcGxlcyB8fCBzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1wbGVzLmxlbmd0aCA9PT0gMSAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIC8vIElmIFtzYW1wbGUgY291bnQgaW4gY3VycmVudCBiYXRjaF0gPT09IDEgJiYgKGZvcmNlICE9IHRydWUpXG4gICAgICAgICAgICAvLyBJZ25vcmUgYW5kIGtlZXAgaW4gZGVtdXhlcidzIHF1ZXVlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gIC8vIGVsc2UgaWYgKGZvcmNlID09PSB0cnVlKSBkbyByZW11eFxuXG4gICAgICAgIGxldCBvZmZzZXQgPSA4O1xuICAgICAgICBsZXQgbWRhdGJveCA9IG51bGw7XG4gICAgICAgIGxldCBtZGF0Qnl0ZXMgPSA4ICsgdmlkZW9UcmFjay5sZW5ndGg7XG5cblxuICAgICAgICBsZXQgbGFzdFNhbXBsZSA9IG51bGw7XG5cbiAgICAgICAgLy8gUG9wIHRoZSBsYXN0U2FtcGxlIGFuZCB3YWl0aW5nIGZvciBzdGFzaFxuICAgICAgICBpZiAoc2FtcGxlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsYXN0U2FtcGxlID0gc2FtcGxlcy5wb3AoKTtcbiAgICAgICAgICAgIG1kYXRCeXRlcyAtPSBsYXN0U2FtcGxlLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluc2VydCBbc3Rhc2hlZCBsYXN0U2FtcGxlIGluIHRoZSBwcmV2aW91cyBiYXRjaF0gdG8gdGhlIGZyb250XG4gICAgICAgIGlmICh0aGlzLl92aWRlb1N0YXNoZWRMYXN0U2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBzYW1wbGUgPSB0aGlzLl92aWRlb1N0YXNoZWRMYXN0U2FtcGxlO1xuICAgICAgICAgICAgdGhpcy5fdmlkZW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgICAgICBzYW1wbGVzLnVuc2hpZnQoc2FtcGxlKTtcbiAgICAgICAgICAgIG1kYXRCeXRlcyArPSBzYW1wbGUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIGxhc3RTYW1wbGUgb2YgY3VycmVudCBiYXRjaCwgd2FpdGluZyBmb3IgbmV4dCBiYXRjaFxuICAgICAgICBpZiAobGFzdFNhbXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb1N0YXNoZWRMYXN0U2FtcGxlID0gbGFzdFNhbXBsZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgPSBzYW1wbGVzWzBdLmR0cyAtIHRoaXMuX2R0c0Jhc2U7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGR0c0NvcnJlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuX3ZpZGVvTmV4dER0cykge1xuICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgLSB0aGlzLl92aWRlb05leHREdHM7XG4gICAgICAgIH0gZWxzZSB7ICAvLyB0aGlzLl92aWRlb05leHREdHMgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0U2FtcGxlID0gdGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QuZ2V0TGFzdFNhbXBsZUJlZm9yZShmaXJzdFNhbXBsZU9yaWdpbmFsRHRzKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFNhbXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IChmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gKGxhc3RTYW1wbGUub3JpZ2luYWxEdHMgKyBsYXN0U2FtcGxlLmR1cmF0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkRHRzID0gbGFzdFNhbXBsZS5kdHMgKyBsYXN0U2FtcGxlLmR1cmF0aW9uICsgZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGR0c0NvcnJlY3Rpb24gPSBmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gZXhwZWN0ZWREdHM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbGFzdFNhbXBsZSA9PSBudWxsLCBjYW5ub3QgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZm8gPSBuZXcgTWVkaWFTZWdtZW50SW5mbygpO1xuICAgICAgICBsZXQgbXA0U2FtcGxlcyA9IFtdO1xuXG4gICAgICAgIC8vIENvcnJlY3QgZHRzIGZvciBlYWNoIHNhbXBsZSwgYW5kIGNhbGN1bGF0ZSBzYW1wbGUgZHVyYXRpb24uIFRoZW4gb3V0cHV0IHRvIG1wNFNhbXBsZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc2FtcGxlID0gc2FtcGxlc1tpXTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbER0cyA9IHNhbXBsZS5kdHMgLSB0aGlzLl9kdHNCYXNlO1xuICAgICAgICAgICAgbGV0IGlzS2V5ZnJhbWUgPSBzYW1wbGUuaXNLZXlmcmFtZTtcbiAgICAgICAgICAgIGxldCBkdHMgPSBvcmlnaW5hbER0cyAtIGR0c0NvcnJlY3Rpb247XG4gICAgICAgICAgICBsZXQgY3RzID0gc2FtcGxlLmN0cztcbiAgICAgICAgICAgIGxldCBwdHMgPSBkdHMgKyBjdHM7XG5cbiAgICAgICAgICAgIGlmIChmaXJzdER0cyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBmaXJzdER0cyA9IGR0cztcbiAgICAgICAgICAgICAgICBmaXJzdFB0cyA9IHB0cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNhbXBsZUR1cmF0aW9uID0gMDtcblxuICAgICAgICAgICAgaWYgKGkgIT09IHNhbXBsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0RHRzID0gc2FtcGxlc1tpICsgMV0uZHRzIC0gdGhpcy5fZHRzQmFzZSAtIGR0c0NvcnJlY3Rpb247XG4gICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBuZXh0RHRzIC0gZHRzO1xuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHRoZSBsYXN0IHNhbXBsZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0U2FtcGxlICE9IG51bGwpIHsgIC8vIHVzZSBzdGFzaGVkIHNhbXBsZSdzIGR0cyB0byBjYWxjdWxhdGUgc2FtcGxlIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0RHRzID0gbGFzdFNhbXBsZS5kdHMgLSB0aGlzLl9kdHNCYXNlIC0gZHRzQ29ycmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBuZXh0RHRzIC0gZHRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXA0U2FtcGxlcy5sZW5ndGggPj0gMSkgeyAgLy8gdXNlIHNlY29uZCBsYXN0IHNhbXBsZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1wNFNhbXBsZXNbbXA0U2FtcGxlcy5sZW5ndGggLSAxXS5kdXJhdGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gdGhlIG9ubHkgb25lIHNhbXBsZSwgdXNlIHJlZmVyZW5jZSBzYW1wbGUgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBNYXRoLmZsb29yKHRoaXMuX3ZpZGVvTWV0YS5yZWZTYW1wbGVEdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNLZXlmcmFtZSkge1xuICAgICAgICAgICAgICAgIGxldCBzeW5jUG9pbnQgPSBuZXcgU2FtcGxlSW5mbyhkdHMsIHB0cywgc2FtcGxlRHVyYXRpb24sIHNhbXBsZS5kdHMsIHRydWUpO1xuICAgICAgICAgICAgICAgIHN5bmNQb2ludC5maWxlcG9zaXRpb24gPSBzYW1wbGUuZmlsZXBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGluZm8uYXBwZW5kU3luY1BvaW50KHN5bmNQb2ludCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1wNFNhbXBsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZHRzOiBkdHMsXG4gICAgICAgICAgICAgICAgcHRzOiBwdHMsXG4gICAgICAgICAgICAgICAgY3RzOiBjdHMsXG4gICAgICAgICAgICAgICAgdW5pdHM6IHNhbXBsZS51bml0cyxcbiAgICAgICAgICAgICAgICBzaXplOiBzYW1wbGUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGlzS2V5ZnJhbWU6IGlzS2V5ZnJhbWUsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IHNhbXBsZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRHRzOiBvcmlnaW5hbER0cyxcbiAgICAgICAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgICAgICAgICBpc0xlYWRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbjogaXNLZXlmcmFtZSA/IDIgOiAxLFxuICAgICAgICAgICAgICAgICAgICBpc0RlcGVuZGVkT246IGlzS2V5ZnJhbWUgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGFzUmVkdW5kYW5jeTogMCxcbiAgICAgICAgICAgICAgICAgICAgaXNOb25TeW5jOiBpc0tleWZyYW1lID8gMCA6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsbG9jYXRlIG1kYXRib3hcbiAgICAgICAgbWRhdGJveCA9IG5ldyBVaW50OEFycmF5KG1kYXRCeXRlcyk7XG4gICAgICAgIG1kYXRib3hbMF0gPSAobWRhdEJ5dGVzID4+PiAyNCkgJiAweEZGO1xuICAgICAgICBtZGF0Ym94WzFdID0gKG1kYXRCeXRlcyA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgbWRhdGJveFsyXSA9IChtZGF0Qnl0ZXMgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgIG1kYXRib3hbM10gPSAobWRhdEJ5dGVzKSAmIDB4RkY7XG4gICAgICAgIG1kYXRib3guc2V0KE1QNC50eXBlcy5tZGF0LCA0KTtcblxuICAgICAgICAvLyBXcml0ZSBzYW1wbGVzIGludG8gbWRhdGJveFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1wNFNhbXBsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB1bml0cyA9IG1wNFNhbXBsZXNbaV0udW5pdHM7XG4gICAgICAgICAgICB3aGlsZSAodW5pdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVuaXQgPSB1bml0cy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdW5pdC5kYXRhO1xuICAgICAgICAgICAgICAgIG1kYXRib3guc2V0KGRhdGEsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXRlc3QgPSBtcDRTYW1wbGVzW21wNFNhbXBsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGxhc3REdHMgPSBsYXRlc3QuZHRzICsgbGF0ZXN0LmR1cmF0aW9uO1xuICAgICAgICBsYXN0UHRzID0gbGF0ZXN0LnB0cyArIGxhdGVzdC5kdXJhdGlvbjtcbiAgICAgICAgdGhpcy5fdmlkZW9OZXh0RHRzID0gbGFzdER0cztcblxuICAgICAgICAvLyBmaWxsIG1lZGlhIHNlZ21lbnQgaW5mbyAmIGFkZCB0byBpbmZvIGxpc3RcbiAgICAgICAgaW5mby5iZWdpbkR0cyA9IGZpcnN0RHRzO1xuICAgICAgICBpbmZvLmVuZER0cyA9IGxhc3REdHM7XG4gICAgICAgIGluZm8uYmVnaW5QdHMgPSBmaXJzdFB0cztcbiAgICAgICAgaW5mby5lbmRQdHMgPSBsYXN0UHRzO1xuICAgICAgICBpbmZvLm9yaWdpbmFsQmVnaW5EdHMgPSBtcDRTYW1wbGVzWzBdLm9yaWdpbmFsRHRzO1xuICAgICAgICBpbmZvLm9yaWdpbmFsRW5kRHRzID0gbGF0ZXN0Lm9yaWdpbmFsRHRzICsgbGF0ZXN0LmR1cmF0aW9uO1xuICAgICAgICBpbmZvLmZpcnN0U2FtcGxlID0gbmV3IFNhbXBsZUluZm8obXA0U2FtcGxlc1swXS5kdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLnB0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNFNhbXBsZXNbMF0uZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLm9yaWdpbmFsRHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0U2FtcGxlc1swXS5pc0tleWZyYW1lKTtcbiAgICAgICAgaW5mby5sYXN0U2FtcGxlID0gbmV3IFNhbXBsZUluZm8obGF0ZXN0LmR0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LnB0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3Qub3JpZ2luYWxEdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdC5pc0tleWZyYW1lKTtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0xpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvU2VnbWVudEluZm9MaXN0LmFwcGVuZChpbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrLnNhbXBsZXMgPSBtcDRTYW1wbGVzO1xuICAgICAgICB0cmFjay5zZXF1ZW5jZU51bWJlcisrO1xuXG4gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGNocm9tZSA8IDUwOiBmb3JjZSBmaXJzdCBzYW1wbGUgYXMgYSByYW5kb20gYWNjZXNzIHBvaW50XG4gICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yMjk0MTJcbiAgICAgICAgaWYgKHRoaXMuX2ZvcmNlRmlyc3RJRFIpIHtcbiAgICAgICAgICAgIGxldCBmbGFncyA9IG1wNFNhbXBsZXNbMF0uZmxhZ3M7XG4gICAgICAgICAgICBmbGFncy5kZXBlbmRzT24gPSAyO1xuICAgICAgICAgICAgZmxhZ3MuaXNOb25TeW5jID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb29mYm94ID0gTVA0Lm1vb2YodHJhY2ssIGZpcnN0RHRzKTtcbiAgICAgICAgdHJhY2suc2FtcGxlcyA9IFtdO1xuICAgICAgICB0cmFjay5sZW5ndGggPSAwO1xuXG4gICAgICAgIHRoaXMuX29uTWVkaWFTZWdtZW50KCd2aWRlbycsIHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9tZXJnZUJveGVzKG1vb2Zib3gsIG1kYXRib3gpLmJ1ZmZlcixcbiAgICAgICAgICAgIHNhbXBsZUNvdW50OiBtcDRTYW1wbGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZm86IGluZm9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21lcmdlQm94ZXMobW9vZiwgbWRhdCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobW9vZi5ieXRlTGVuZ3RoICsgbWRhdC5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0LnNldChtb29mLCAwKTtcbiAgICAgICAgcmVzdWx0LnNldChtZGF0LCBtb29mLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNUDRSZW11eGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5sZXQgQnJvd3NlciA9IHt9O1xuXG5mdW5jdGlvbiBkZXRlY3QoKSB7XG4gICAgLy8gbW9kaWZpZWQgZnJvbSBqcXVlcnktYnJvd3Nlci1wbHVnaW5cblxuICAgIGxldCB1YSA9IHNlbGYubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgbGV0IG1hdGNoID0gLyhlZGdlKVxcLyhbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhvcHIpW1xcL10oW1xcdy5dKykvLmV4ZWModWEpIHx8XG4gICAgICAgIC8oY2hyb21lKVsgXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhpZW1vYmlsZSlbXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyh2ZXJzaW9uKShhcHBsZXdlYmtpdClbIFxcL10oW1xcdy5dKykuKihzYWZhcmkpWyBcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKHdlYmtpdClbIFxcL10oW1xcdy5dKykuKih2ZXJzaW9uKVsgXFwvXShbXFx3Ll0rKS4qKHNhZmFyaSlbIFxcL10oW1xcdy5dKykvLmV4ZWModWEpIHx8XG4gICAgICAgIC8od2Via2l0KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhvcGVyYSkoPzouKnZlcnNpb258KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhtc2llKSAoW1xcdy5dKykvLmV4ZWModWEpIHx8XG4gICAgICAgIHVhLmluZGV4T2YoJ3RyaWRlbnQnKSA+PSAwICYmIC8ocnYpKD86OnwgKShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgdWEuaW5kZXhPZignY29tcGF0aWJsZScpIDwgMCAmJiAvKGZpcmVmb3gpWyBcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICBbXTtcblxuICAgIGxldCBwbGF0Zm9ybV9tYXRjaCA9IC8oaXBhZCkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8oaXBvZCkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8od2luZG93cyBwaG9uZSkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8oaXBob25lKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhraW5kbGUpLy5leGVjKHVhKSB8fFxuICAgICAgICAvKGFuZHJvaWQpLy5leGVjKHVhKSB8fFxuICAgICAgICAvKHdpbmRvd3MpLy5leGVjKHVhKSB8fFxuICAgICAgICAvKG1hYykvLmV4ZWModWEpIHx8XG4gICAgICAgIC8obGludXgpLy5leGVjKHVhKSB8fFxuICAgICAgICAvKGNyb3MpLy5leGVjKHVhKSB8fFxuICAgICAgICBbXTtcblxuICAgIGxldCBtYXRjaGVkID0ge1xuICAgICAgICBicm93c2VyOiBtYXRjaFs1XSB8fCBtYXRjaFszXSB8fCBtYXRjaFsxXSB8fCAnJyxcbiAgICAgICAgdmVyc2lvbjogbWF0Y2hbMl0gfHwgbWF0Y2hbNF0gfHwgJzAnLFxuICAgICAgICBtYWpvclZlcnNpb246IG1hdGNoWzRdIHx8IG1hdGNoWzJdIHx8ICcwJyxcbiAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtX21hdGNoWzBdIHx8ICcnXG4gICAgfTtcblxuICAgIGxldCBicm93c2VyID0ge307XG4gICAgaWYgKG1hdGNoZWQuYnJvd3Nlcikge1xuICAgICAgICBicm93c2VyW21hdGNoZWQuYnJvd3Nlcl0gPSB0cnVlO1xuXG4gICAgICAgIGxldCB2ZXJzaW9uQXJyYXkgPSBtYXRjaGVkLm1ham9yVmVyc2lvbi5zcGxpdCgnLicpO1xuICAgICAgICBicm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBtYWpvcjogcGFyc2VJbnQobWF0Y2hlZC5tYWpvclZlcnNpb24sIDEwKSxcbiAgICAgICAgICAgIHN0cmluZzogbWF0Y2hlZC52ZXJzaW9uXG4gICAgICAgIH07XG4gICAgICAgIGlmICh2ZXJzaW9uQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYnJvd3Nlci52ZXJzaW9uLm1pbm9yID0gcGFyc2VJbnQodmVyc2lvbkFycmF5WzFdLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZlcnNpb25BcnJheS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBicm93c2VyLnZlcnNpb24uYnVpbGQgPSBwYXJzZUludCh2ZXJzaW9uQXJyYXlbMl0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXRjaGVkLnBsYXRmb3JtKSB7XG4gICAgICAgIGJyb3dzZXJbbWF0Y2hlZC5wbGF0Zm9ybV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChicm93c2VyLmNocm9tZSB8fCBicm93c2VyLm9wciB8fCBicm93c2VyLnNhZmFyaSkge1xuICAgICAgICBicm93c2VyLndlYmtpdCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gTVNJRS4gSUUxMSBoYXMgJ3J2JyBpZGVudGlmZXJcbiAgICBpZiAoYnJvd3Nlci5ydiB8fCBicm93c2VyLmllbW9iaWxlKSB7XG4gICAgICAgIGlmIChicm93c2VyLnJ2KSB7XG4gICAgICAgICAgICBkZWxldGUgYnJvd3Nlci5ydjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXNpZSA9ICdtc2llJztcbiAgICAgICAgbWF0Y2hlZC5icm93c2VyID0gbXNpZTtcbiAgICAgICAgYnJvd3Nlclttc2llXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWljcm9zb2Z0IEVkZ2VcbiAgICBpZiAoYnJvd3Nlci5lZGdlKSB7XG4gICAgICAgIGRlbGV0ZSBicm93c2VyLmVkZ2U7XG4gICAgICAgIGxldCBtc2VkZ2UgPSAnbXNlZGdlJztcbiAgICAgICAgbWF0Y2hlZC5icm93c2VyID0gbXNlZGdlO1xuICAgICAgICBicm93c2VyW21zZWRnZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE9wZXJhIDE1K1xuICAgIGlmIChicm93c2VyLm9wcikge1xuICAgICAgICBsZXQgb3BlcmEgPSAnb3BlcmEnO1xuICAgICAgICBtYXRjaGVkLmJyb3dzZXIgPSBvcGVyYTtcbiAgICAgICAgYnJvd3NlcltvcGVyYV0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFN0b2NrIGFuZHJvaWQgYnJvd3NlcnMgYXJlIG1hcmtlZCBhcyBTYWZhcmlcbiAgICBpZiAoYnJvd3Nlci5zYWZhcmkgJiYgYnJvd3Nlci5hbmRyb2lkKSB7XG4gICAgICAgIGxldCBhbmRyb2lkID0gJ2FuZHJvaWQnO1xuICAgICAgICBtYXRjaGVkLmJyb3dzZXIgPSBhbmRyb2lkO1xuICAgICAgICBicm93c2VyW2FuZHJvaWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBicm93c2VyLm5hbWUgPSBtYXRjaGVkLmJyb3dzZXI7XG4gICAgYnJvd3Nlci5wbGF0Zm9ybSA9IG1hdGNoZWQucGxhdGZvcm07XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gQnJvd3Nlcikge1xuICAgICAgICBpZiAoQnJvd3Nlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWxldGUgQnJvd3NlcltrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24oQnJvd3NlciwgYnJvd3Nlcik7XG59XG5cbmRldGVjdCgpO1xuXG5leHBvcnQgZGVmYXVsdCBCcm93c2VyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgUnVudGltZUV4Y2VwdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gJ1J1bnRpbWVFeGNlcHRpb24nO1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnSWxsZWdhbFN0YXRlRXhjZXB0aW9uJztcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24nO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnTm90SW1wbGVtZW50ZWRFeGNlcHRpb24nO1xuICAgIH1cblxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcblxuY2xhc3MgTG9nIHtcblxuICAgIHN0YXRpYyBlKHRhZywgbXNnKSB7XG4gICAgICAgIGlmICghdGFnIHx8IExvZy5GT1JDRV9HTE9CQUxfVEFHKVxuICAgICAgICAgICAgdGFnID0gTG9nLkdMT0JBTF9UQUc7XG5cbiAgICAgICAgbGV0IHN0ciA9IGBbJHt0YWd9XSA+ICR7bXNnfWA7XG5cbiAgICAgICAgaWYgKExvZy5FTkFCTEVfQ0FMTEJBQ0spIHtcbiAgICAgICAgICAgIExvZy5lbWl0dGVyLmVtaXQoJ2xvZycsICdlcnJvcicsIHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUxvZy5FTkFCTEVfRVJST1IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHN0cik7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oc3RyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaSh0YWcsIG1zZykge1xuICAgICAgICBpZiAoIXRhZyB8fCBMb2cuRk9SQ0VfR0xPQkFMX1RBRylcbiAgICAgICAgICAgIHRhZyA9IExvZy5HTE9CQUxfVEFHO1xuXG4gICAgICAgIGxldCBzdHIgPSBgWyR7dGFnfV0gPiAke21zZ31gO1xuXG4gICAgICAgIGlmIChMb2cuRU5BQkxFX0NBTExCQUNLKSB7XG4gICAgICAgICAgICBMb2cuZW1pdHRlci5lbWl0KCdsb2cnLCAnaW5mbycsIHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUxvZy5FTkFCTEVfSU5GTykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnNvbGUuaW5mbykge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKHN0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHcodGFnLCBtc2cpIHtcbiAgICAgICAgaWYgKCF0YWcgfHwgTG9nLkZPUkNFX0dMT0JBTF9UQUcpXG4gICAgICAgICAgICB0YWcgPSBMb2cuR0xPQkFMX1RBRztcblxuICAgICAgICBsZXQgc3RyID0gYFske3RhZ31dID4gJHttc2d9YDtcblxuICAgICAgICBpZiAoTG9nLkVOQUJMRV9DQUxMQkFDSykge1xuICAgICAgICAgICAgTG9nLmVtaXR0ZXIuZW1pdCgnbG9nJywgJ3dhcm4nLCBzdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFMb2cuRU5BQkxFX1dBUk4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihzdHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkKHRhZywgbXNnKSB7XG4gICAgICAgIGlmICghdGFnIHx8IExvZy5GT1JDRV9HTE9CQUxfVEFHKVxuICAgICAgICAgICAgdGFnID0gTG9nLkdMT0JBTF9UQUc7XG5cbiAgICAgICAgbGV0IHN0ciA9IGBbJHt0YWd9XSA+ICR7bXNnfWA7XG5cbiAgICAgICAgaWYgKExvZy5FTkFCTEVfQ0FMTEJBQ0spIHtcbiAgICAgICAgICAgIExvZy5lbWl0dGVyLmVtaXQoJ2xvZycsICdkZWJ1ZycsIHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUxvZy5FTkFCTEVfREVCVUcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHN0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHYodGFnLCBtc2cpIHtcbiAgICAgICAgaWYgKCF0YWcgfHwgTG9nLkZPUkNFX0dMT0JBTF9UQUcpXG4gICAgICAgICAgICB0YWcgPSBMb2cuR0xPQkFMX1RBRztcblxuICAgICAgICBsZXQgc3RyID0gYFske3RhZ31dID4gJHttc2d9YDtcblxuICAgICAgICBpZiAoTG9nLkVOQUJMRV9DQUxMQkFDSykge1xuICAgICAgICAgICAgTG9nLmVtaXR0ZXIuZW1pdCgnbG9nJywgJ3ZlcmJvc2UnLCBzdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFMb2cuRU5BQkxFX1ZFUkJPU0UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKHN0cik7XG4gICAgfVxuXG59XG5cbkxvZy5HTE9CQUxfVEFHID0gJ2Zsdi5qcyc7XG5Mb2cuRk9SQ0VfR0xPQkFMX1RBRyA9IGZhbHNlO1xuTG9nLkVOQUJMRV9FUlJPUiA9IHRydWU7XG5Mb2cuRU5BQkxFX0lORk8gPSB0cnVlO1xuTG9nLkVOQUJMRV9XQVJOID0gdHJ1ZTtcbkxvZy5FTkFCTEVfREVCVUcgPSB0cnVlO1xuTG9nLkVOQUJMRV9WRVJCT1NFID0gdHJ1ZTtcblxuTG9nLkVOQUJMRV9DQUxMQkFDSyA9IGZhbHNlO1xuXG5Mb2cuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgTG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcblxuY2xhc3MgTG9nZ2luZ0NvbnRyb2wge1xuXG4gICAgc3RhdGljIGdldCBmb3JjZUdsb2JhbFRhZygpIHtcbiAgICAgICAgcmV0dXJuIExvZy5GT1JDRV9HTE9CQUxfVEFHO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZm9yY2VHbG9iYWxUYWcoZW5hYmxlKSB7XG4gICAgICAgIExvZy5GT1JDRV9HTE9CQUxfVEFHID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBnbG9iYWxUYWcoKSB7XG4gICAgICAgIHJldHVybiBMb2cuR0xPQkFMX1RBRztcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0IGdsb2JhbFRhZyh0YWcpIHtcbiAgICAgICAgTG9nLkdMT0JBTF9UQUcgPSB0YWc7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZUFsbCgpIHtcbiAgICAgICAgcmV0dXJuIExvZy5FTkFCTEVfVkVSQk9TRVxuICAgICAgICAgICAgJiYgTG9nLkVOQUJMRV9ERUJVR1xuICAgICAgICAgICAgJiYgTG9nLkVOQUJMRV9JTkZPXG4gICAgICAgICAgICAmJiBMb2cuRU5BQkxFX1dBUk5cbiAgICAgICAgICAgICYmIExvZy5FTkFCTEVfRVJST1I7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBlbmFibGVBbGwoZW5hYmxlKSB7XG4gICAgICAgIExvZy5FTkFCTEVfVkVSQk9TRSA9IGVuYWJsZTtcbiAgICAgICAgTG9nLkVOQUJMRV9ERUJVRyA9IGVuYWJsZTtcbiAgICAgICAgTG9nLkVOQUJMRV9JTkZPID0gZW5hYmxlO1xuICAgICAgICBMb2cuRU5BQkxFX1dBUk4gPSBlbmFibGU7XG4gICAgICAgIExvZy5FTkFCTEVfRVJST1IgPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZURlYnVnKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9ERUJVRztcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0IGVuYWJsZURlYnVnKGVuYWJsZSkge1xuICAgICAgICBMb2cuRU5BQkxFX0RFQlVHID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBlbmFibGVWZXJib3NlKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9WRVJCT1NFO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZW5hYmxlVmVyYm9zZShlbmFibGUpIHtcbiAgICAgICAgTG9nLkVOQUJMRV9WRVJCT1NFID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBlbmFibGVJbmZvKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9JTkZPO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZW5hYmxlSW5mbyhlbmFibGUpIHtcbiAgICAgICAgTG9nLkVOQUJMRV9JTkZPID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBlbmFibGVXYXJuKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9XQVJOO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZW5hYmxlV2FybihlbmFibGUpIHtcbiAgICAgICAgTG9nLkVOQUJMRV9XQVJOID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBlbmFibGVFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIExvZy5FTkFCTEVfRVJST1I7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBlbmFibGVFcnJvcihlbmFibGUpIHtcbiAgICAgICAgTG9nLkVOQUJMRV9FUlJPUiA9IGVuYWJsZTtcbiAgICAgICAgTG9nZ2luZ0NvbnRyb2wuX25vdGlmeUNoYW5nZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnbG9iYWxUYWc6IExvZy5HTE9CQUxfVEFHLFxuICAgICAgICAgICAgZm9yY2VHbG9iYWxUYWc6IExvZy5GT1JDRV9HTE9CQUxfVEFHLFxuICAgICAgICAgICAgZW5hYmxlVmVyYm9zZTogTG9nLkVOQUJMRV9WRVJCT1NFLFxuICAgICAgICAgICAgZW5hYmxlRGVidWc6IExvZy5FTkFCTEVfREVCVUcsXG4gICAgICAgICAgICBlbmFibGVJbmZvOiBMb2cuRU5BQkxFX0lORk8sXG4gICAgICAgICAgICBlbmFibGVXYXJuOiBMb2cuRU5BQkxFX1dBUk4sXG4gICAgICAgICAgICBlbmFibGVFcnJvcjogTG9nLkVOQUJMRV9FUlJPUixcbiAgICAgICAgICAgIGVuYWJsZUNhbGxiYWNrOiBMb2cuRU5BQkxFX0NBTExCQUNLXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGFwcGx5Q29uZmlnKGNvbmZpZykge1xuICAgICAgICBMb2cuR0xPQkFMX1RBRyA9IGNvbmZpZy5nbG9iYWxUYWc7XG4gICAgICAgIExvZy5GT1JDRV9HTE9CQUxfVEFHID0gY29uZmlnLmZvcmNlR2xvYmFsVGFnO1xuICAgICAgICBMb2cuRU5BQkxFX1ZFUkJPU0UgPSBjb25maWcuZW5hYmxlVmVyYm9zZTtcbiAgICAgICAgTG9nLkVOQUJMRV9ERUJVRyA9IGNvbmZpZy5lbmFibGVEZWJ1ZztcbiAgICAgICAgTG9nLkVOQUJMRV9JTkZPID0gY29uZmlnLmVuYWJsZUluZm87XG4gICAgICAgIExvZy5FTkFCTEVfV0FSTiA9IGNvbmZpZy5lbmFibGVXYXJuO1xuICAgICAgICBMb2cuRU5BQkxFX0VSUk9SID0gY29uZmlnLmVuYWJsZUVycm9yO1xuICAgICAgICBMb2cuRU5BQkxFX0NBTExCQUNLID0gY29uZmlnLmVuYWJsZUNhbGxiYWNrO1xuICAgIH1cblxuICAgIHN0YXRpYyBfbm90aWZ5Q2hhbmdlKCkge1xuICAgICAgICBsZXQgZW1pdHRlciA9IExvZ2dpbmdDb250cm9sLmVtaXR0ZXI7XG5cbiAgICAgICAgaWYgKGVtaXR0ZXIubGlzdGVuZXJDb3VudCgnY2hhbmdlJykgPiAwKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gTG9nZ2luZ0NvbnRyb2wuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ2NoYW5nZScsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5lbWl0dGVyLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLmVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWRkTG9nTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgTG9nLmVtaXR0ZXIuYWRkTGlzdGVuZXIoJ2xvZycsIGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKExvZy5lbWl0dGVyLmxpc3RlbmVyQ291bnQoJ2xvZycpID4gMCkge1xuICAgICAgICAgICAgTG9nLkVOQUJMRV9DQUxMQkFDSyA9IHRydWU7XG4gICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlTG9nTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgTG9nLmVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2xvZycsIGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKExvZy5lbWl0dGVyLmxpc3RlbmVyQ291bnQoJ2xvZycpID09PSAwKSB7XG4gICAgICAgICAgICBMb2cuRU5BQkxFX0NBTExCQUNLID0gZmFsc2U7XG4gICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuTG9nZ2luZ0NvbnRyb2wuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nZ2luZ0NvbnRyb2w7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNsYXNzIFBvbHlmaWxsIHtcblxuICAgIHN0YXRpYyBpbnN0YWxsKCkge1xuICAgICAgICAvLyBFUzYgT2JqZWN0LnNldFByb3RvdHlwZU9mXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAob2JqLCBwcm90bykge1xuICAgICAgICAgICAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFUzYgT2JqZWN0LmFzc2lnblxuICAgICAgICBPYmplY3QuYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVTNiBQcm9taXNlIChtaXNzaW5nIHN1cHBvcnQgaW4gSUUxMSlcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLlByb21pc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlcXVpcmUoJ2VzNi1wcm9taXNlJykucG9seWZpbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5Qb2x5ZmlsbC5pbnN0YWxsKCk7XG5cbmV4cG9ydCBkZWZhdWx0IFBvbHlmaWxsOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBDKysgcHJvamVjdCBsaWJXaW5URjggKGh0dHBzOi8vZ2l0aHViLmNvbS9tMTMyNTMvbGliV2luVEY4KVxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBjaGVja0NvbnRpbnVhdGlvbih1aW50OGFycmF5LCBzdGFydCwgY2hlY2tMZW5ndGgpIHtcbiAgICBsZXQgYXJyYXkgPSB1aW50OGFycmF5O1xuICAgIGlmIChzdGFydCArIGNoZWNrTGVuZ3RoIDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHdoaWxlIChjaGVja0xlbmd0aC0tKSB7XG4gICAgICAgICAgICBpZiAoKGFycmF5Wysrc3RhcnRdICYgMHhDMCkgIT09IDB4ODApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVVURjgodWludDhhcnJheSkge1xuICAgIGxldCBvdXQgPSBbXTtcbiAgICBsZXQgaW5wdXQgPSB1aW50OGFycmF5O1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gdWludDhhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoaW5wdXRbaV0gPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2ldKSk7XG4gICAgICAgICAgICArK2k7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA8IDB4QzApIHtcbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPCAweEUwKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tDb250aW51YXRpb24oaW5wdXQsIGksIDEpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVjczQgPSAoaW5wdXRbaV0gJiAweDFGKSA8PCA2IHwgKGlucHV0W2kgKyAxXSAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmICh1Y3M0ID49IDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh1Y3M0ICYgMHhGRkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0W2ldIDwgMHhGMCkge1xuICAgICAgICAgICAgaWYgKGNoZWNrQ29udGludWF0aW9uKGlucHV0LCBpLCAyKSkge1xuICAgICAgICAgICAgICAgIGxldCB1Y3M0ID0gKGlucHV0W2ldICYgMHhGKSA8PCAxMiB8IChpbnB1dFtpICsgMV0gJiAweDNGKSA8PCA2IHwgaW5wdXRbaSArIDJdICYgMHgzRjtcbiAgICAgICAgICAgICAgICBpZiAodWNzNCA+PSAweDgwMCAmJiAodWNzNCAmIDB4RjgwMCkgIT09IDB4RDgwMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHVjczQgJiAweEZGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAzO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPCAweEY4KSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tDb250aW51YXRpb24oaW5wdXQsIGksIDMpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVjczQgPSAoaW5wdXRbaV0gJiAweDcpIDw8IDE4IHwgKGlucHV0W2kgKyAxXSAmIDB4M0YpIDw8IDEyXG4gICAgICAgICAgICAgICAgICAgICAgICAgfCAoaW5wdXRbaSArIDJdICYgMHgzRikgPDwgNiB8IChpbnB1dFtpICsgM10gJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAodWNzNCA+IDB4MTAwMDAgJiYgdWNzNCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHVjczQgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgodWNzNCA+Pj4gMTApIHwgMHhEODAwKSk7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKHVjczQgJiAweDNGRikgfCAweERDMDApKTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSA0O1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGRkQpKTtcbiAgICAgICAgKytpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuam9pbignJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlY29kZVVURjg7Il19"}